49 PxPoolBase(
const Alloc& alloc, uint32_t elementsPerSlab, uint32_t slabSize)
50 : Alloc(alloc), mSlabs(alloc), mElementsPerSlab(elementsPerSlab), mUsed(0), mSlabSize(slabSize), mFreeElement(0)
55#pragma clang diagnostic push
56#pragma clang diagnostic ignored "-Wunused-local-typedef"
62#pragma clang diagnostic pop
73 for(
void** slabIt = mSlabs.begin(), *slabEnd = mSlabs.end(); slabIt != slabEnd; ++slabIt)
74 Alloc::deallocate(*slabIt);
82 T* p =
reinterpret_cast<T*
>(mFreeElement);
83 mFreeElement = mFreeElement->mNext;
97 push(
reinterpret_cast<FreeList*
>(p));
104 return t ? PX_PLACEMENT_NEW(t, T()) : NULL;
111 return t ? PX_PLACEMENT_NEW(t, T(a)) : NULL;
114 template <
class A1,
class A2>
118 return t ? PX_PLACEMENT_NEW(t, T(a, b)) : NULL;
121 template <
class A1,
class A2,
class A3>
122 PX_INLINE T* construct(A1& a, A2& b, A3& c)
125 return t ? PX_PLACEMENT_NEW(t, T(a, b, c)) : NULL;
128 template <
class A1,
class A2,
class A3>
129 PX_INLINE T* construct(A1* a, A2& b, A3& c)
132 return t ? PX_PLACEMENT_NEW(t, T(a, b, c)) : NULL;
135 template <
class A1,
class A2,
class A3,
class A4>
136 PX_INLINE T* construct(A1& a, A2& b, A3& c, A4& d)
139 return t ? PX_PLACEMENT_NEW(t, T(a, b, c, d)) : NULL;
142 template <
class A1,
class A2,
class A3,
class A4,
class A5>
143 PX_INLINE T* construct(A1& a, A2& b, A3& c, A4& d, A5& e)
146 return t ? PX_PLACEMENT_NEW(t, T(a, b, c, d, e)) : NULL;
149 template <
class A1,
class A2,
class A3,
class A4,
class A5,
class A6>
150 PX_INLINE T* construct(A1& a, A2& b, A3& c, A4& d, A5& e, A6& f)
153 return t ? PX_PLACEMENT_NEW(t, T(a, b, c, d, e, f)) : NULL;
156 template <
class A1,
class A2,
class A3,
class A4,
class A5,
class A6,
class A7>
157 PX_INLINE T* construct(A1& a, A2& b, A3& c, A4& d, A5& e, A6& f, A7& g)
160 return t ? PX_PLACEMENT_NEW(t, T(a, b, c, d, e, f, g)) : NULL;
163 template <
class A1,
class A2,
class A3,
class A4,
class A5,
class A6,
class A7,
class A8>
164 PX_INLINE T* construct(A1& a, A2& b, A3& c, A4& d, A5& e, A6& f, A7& g, A8& h)
167 return t ? PX_PLACEMENT_NEW(t, T(a, b, c, d, e, f, g, h)) : NULL;
188 uint32_t mElementsPerSlab;
198 p->mNext = mFreeElement;
205 T* slab =
reinterpret_cast<T*
>(Alloc::allocate(mSlabSize, __FILE__, __LINE__));
210 T* it = slab + mElementsPerSlab;
212 push(
reinterpret_cast<FreeList*
>(it));
219 void disposeElements()
221 PxArray<void*, Alloc> freeNodes(*
this);
224 freeNodes.pushBack(mFreeElement);
225 mFreeElement = mFreeElement->mNext;
228 PxSort(freeNodes.begin(), freeNodes.size(), PxLess<void*>(), alloc);
229 PxSort(mSlabs.
begin(), mSlabs.
size(), PxLess<void*>(), alloc);
231 typename PxArray<void*, Alloc>::Iterator slabIt = mSlabs.
begin(), slabEnd = mSlabs.
end();
232 for(
typename PxArray<void*, Alloc>::Iterator freeIt = freeNodes.begin(); slabIt != slabEnd; ++slabIt)
234 for(T* tIt =
reinterpret_cast<T*
>(*slabIt), *tEnd = tIt + mElementsPerSlab; tIt != tEnd; ++tIt)
236 if(freeIt != freeNodes.end() && *freeIt == tIt)