67 : mWrapper( inWrapper )
68 , mAllMemory( inWrapper )
69 , mFirstFreeNode( NULL )
73 TPxU8PtrList::ConstIterator theEnd = mAllMemory.
end();
74 for ( TPxU8PtrList::ConstIterator theIter = mAllMemory.
begin();
78 PxU8* thePtr = *theIter;
82 mFirstFreeNode = NULL;
89 PxU8* retval =
reinterpret_cast<PxU8*
>(mFirstFreeNode);
90 mFirstFreeNode = mFirstFreeNode->mNextNode;
93 PxU32 itemSize = GetItemSize();
94 PxU32 itemCount = 1 << TItemCount;
96 PxU8* retval =
reinterpret_cast<PxU8*
>(mWrapper.getAllocator().
allocate( itemCount * itemSize,
"RepX fixed-size memory pool", __FILE__, __LINE__ ));
97 PxU8* dataPtr = retval + itemSize;
99 for( PxU32 idx = 1; idx < itemCount; ++idx, dataPtr += itemSize )
100 deallocate( dataPtr );
104 void deallocate( PxU8* inData )
107 nodePtr->mNextNode = mFirstFreeNode;
108 mFirstFreeNode = nodePtr;
111 inline PxU32 GetItemSize() {
return sizeof(
SMemPoolNode) << TItemSize; }
136 PxU32 mMinAllocationSize;
142 : mWrapper( inWrapper )
143 , mAllMemory( inWrapper )
144 , mFreeNodeMap( inWrapper)
145 , mMinAllocationSize( inMinAllocationSize )
150 TPxU8PtrList::ConstIterator theEnd = mAllMemory.
end();
151 for ( TPxU8PtrList::ConstIterator theIter = mAllMemory.
begin();
155 PxU8* thePtr = *theIter;
159 mFreeNodeMap.clear();
161 PxU8* MarkMem( PxU8* inMem, TMemAllocSizeType inSize )
165 theMem->mSize = inSize;
166 return reinterpret_cast< PxU8*
>( theMem + 1 );
169 PxU8* allocate( PxU32 size )
180 PX_ASSERT( NULL != theNode );
181 PX_ASSERT( theNode->mSize == theRequestedSize );
182 entry->second = theNode->NextNode();
183 if (entry->second == NULL)
184 mFreeNodeMap.erase( theRequestedSize );
186 return reinterpret_cast< PxU8*
>( theNode + 1 );
189 if ( theRequestedSize < mMinAllocationSize )
190 theRequestedSize = mMinAllocationSize;
193 PxU8* retval =
reinterpret_cast<PxU8*
>(mWrapper.getAllocator().
allocate(
size_t(theRequestedSize),
"RepX variable sized memory pool", __FILE__, __LINE__ ));
196 return MarkMem( retval, theRequestedSize );
200 void deallocate( PxU8* inData )
203 TMemAllocSizeType theSize = theData->mSize;
204 AddFreeMem(
reinterpret_cast< PxU8*
>( theData ), theSize );
209 if ( inNode && inNode->mNextNode )
211 PX_ASSERT( inNode->mSize <= inNode->NextNode()->mSize );
215 void AddFreeMem( PxU8* inMemory, TMemAllocSizeType inSize )
219 theNewNode->mNextNode = NULL;
220 theNewNode->mSize = inSize;
224 theNewNode->mNextNode = entry->second;
225 entry->second = theNewNode;
229 mFreeNodeMap.insert( inSize, theNewNode );
virtual void * allocate(size_t size, const char *typeName, const char *filename, int line)=0
Allocates size bytes of memory, which must be 16-byte aligned.
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39