55 mEltsPerSlab(eltsPerSlab),
62 PX_ASSERT(mEltsPerSlab>0);
63 PX_ASSERT((mEltsPerSlab & (mEltsPerSlab-1)) == 0);
66 for(mLog2EltsPerSlab=0; mEltsPerSlab!=PxU32(1<<mLog2EltsPerSlab); mLog2EltsPerSlab++)
78 for(PxU32 i=0;i<mSlabCount;i++)
82 for(PxU32 j=0;j<mEltsPerSlab;j++)
89 for(PxU32 i=0;i<mSlabCount;i++)
91 Alloc::deallocate(mSlabs[i]);
97 Alloc::deallocate(mFreeList);
101 Alloc::deallocate(mSlabs);
106 PxU32 preallocate(
const PxU32 nbRequired, T** elements)
110 PxU32 nbToAllocate = nbRequired > mFreeCount ? nbRequired - mFreeCount : 0;
112 PxU32 nbElements = nbRequired - nbToAllocate;
114 PxMemCopy(elements, mFreeList + (mFreeCount - nbElements),
sizeof(T*) * nbElements);
116 mFreeCount -= nbElements;
120 PX_ASSERT(mFreeCount == 0);
122 PxU32 nbSlabs = (nbToAllocate + mEltsPerSlab - 1) / mEltsPerSlab;
125 PxU32 freeCount = mFreeCount;
127 for (PxU32 i = 0; i < nbSlabs; ++i)
131 T * mAddr =
reinterpret_cast<T*
>(Alloc::allocate(mEltsPerSlab *
sizeof(T), __FILE__, __LINE__));
135 PxU32 newSlabCount = mSlabCount+1;
138 if (mUseBitmap.size() < newSlabCount*mEltsPerSlab)
140 mUseBitmap.resize(2 * newSlabCount*mEltsPerSlab);
142 Alloc::deallocate(mFreeList);
143 mFreeList =
reinterpret_cast<T**
>(Alloc::allocate(2 * newSlabCount * mEltsPerSlab *
sizeof(T*), __FILE__, __LINE__));
145 T** slabs =
reinterpret_cast<T**
>(Alloc::allocate(2* newSlabCount *
sizeof(T*), __FILE__, __LINE__));
148 PxMemCopy(slabs, mSlabs,
sizeof(T*)*mSlabCount);
150 Alloc::deallocate(mSlabs);
156 mSlabs[mSlabCount++] = mAddr;
158 PxU32 baseIndex = (mSlabCount-1) * mEltsPerSlab;
161 PxI32 idx = PxI32(mEltsPerSlab - 1);
163 for (; idx >= PxI32(nbToAllocate); --idx)
165 mFreeList[freeCount++] = PX_PLACEMENT_NEW(mAddr + idx, T(mArgument, baseIndex + idx));
168 PxU32 origElements = nbElements;
169 T** writeIdx = elements + nbElements;
170 for (; idx >= 0; --idx)
172 writeIdx[idx] = PX_PLACEMENT_NEW(mAddr + idx, T(mArgument, baseIndex + idx));
176 nbToAllocate -= (nbElements - origElements);
179 mFreeCount = freeCount;
182 PX_ASSERT(nbElements == nbRequired);
184 for (PxU32 a = 0; a < nbElements; ++a)
186 mUseBitmap.set(elements[a]->getIndex());
196 if(mFreeCount == 0 && !extend())
198 T* element = mFreeList[--mFreeCount];
199 mUseBitmap.set(element->getIndex());
205 PxU32 i = element->getIndex();
207 mFreeList[mFreeCount++] = element;
217 if(index>=mSlabCount*mEltsPerSlab || !(mUseBitmap.boundedTest(index)))
219 return mSlabs[index>>mLog2EltsPerSlab] + (index&(mEltsPerSlab-1));
227 return mSlabs[index>>mLog2EltsPerSlab] + (index&(mEltsPerSlab-1));
232 T * mAddr =
reinterpret_cast<T*
>(Alloc::allocate(mEltsPerSlab *
sizeof(T), __FILE__, __LINE__));
236 PxU32 newSlabCount = mSlabCount+1;
239 if(mUseBitmap.size() < newSlabCount*mEltsPerSlab)
241 mUseBitmap.resize(2* newSlabCount*mEltsPerSlab);
243 Alloc::deallocate(mFreeList);
244 mFreeList =
reinterpret_cast<T**
>(Alloc::allocate(2* newSlabCount * mEltsPerSlab *
sizeof(T*), __FILE__, __LINE__));
246 T** slabs =
reinterpret_cast<T**
>(Alloc::allocate(2 * newSlabCount *
sizeof(T*), __FILE__, __LINE__));
249 PxMemCopy(slabs, mSlabs,
sizeof(T*)*mSlabCount);
251 Alloc::deallocate(mSlabs);
257 mSlabs[mSlabCount++] = mAddr;
263 PxU32 baseIndex = (mSlabCount-1) * mEltsPerSlab;
264 PxU32 freeCount = mFreeCount;
265 for(PxI32 i=PxI32(mEltsPerSlab-1);i>=0;i--)
266 mFreeList[freeCount++] = PX_PLACEMENT_NEW(mAddr+i, T(mArgument, baseIndex+ i));
268 mFreeCount = freeCount;
284 const PxU32 mEltsPerSlab;
286 PxU32 mLog2EltsPerSlab;
290 ArgumentType* mArgument;