11 #ifndef NO_PRAGMA_ONCE
15 #include "../GrayLibBase.h"
28 #define USE_POOL_FREESORT
31 template<
class TYPE >
71 INT_PTR j = GET_INDEX_IN(
m_aBuckets[i].GetData(), (
const TYPE*)pObj);
102 template<
class TYPE >
120 : m_bIsFreeNode(true)
122 m_u.m_pFreeNext =
nullptr;
126 m_bIsFreeNode =
false;
132 return m_bIsFreeNode;
137 return (
TYPE*)m_u.m_Used;
142 return m_u.m_pFreeNext;
146 m_u.m_pFreeNext = pFreeNext;
155 virtual bool isPoolNodeValid(UINT_PTR uCheckVal = 0)
const = 0;
158 template<
class TYPE >
172 #ifdef USE_POOL_FREESORT
179 ASSERT(pFreeNode !=
nullptr);
181 #ifdef USE_POOL_FREESORT
183 return(m_FreeQ.
FindIFor(pFreeNode) >= 0);
191 if (pFree == pFreeNode)
200 ASSERT(pFreeNode !=
nullptr);
201 #ifdef USE_POOL_FREESORT
202 m_FreeQ.
Add(pFreeNode);
205 m_pFreeListHead = pFreeNode;
212 if (pBucket ==
nullptr)
217 for (; i < iSizeN; i++)
228 , m_pFreeListHead(
nullptr)
249 ASSERT(iAllocQty >= m_iFreeCount);
250 #ifdef USE_POOL_FREESORT
253 if (m_iFreeCount == iAllocQty)
276 #ifdef USE_POOL_FREESORT
286 if (m_pFreeListHead !=
nullptr)
289 pFreeNode = m_pFreeListHead;
292 #ifdef USE_POOL_FREESORT
293 bool bRet = m_FreeQ.
RemoveKey(pFreeNode);
300 pFreeNode = AddBucket();
301 if (pFreeNode ==
nullptr)
309 pFreeNode->~cPoolNodeFree_t();
312 return reinterpret_cast<TYPE*
>(pFreeNode);
322 #ifdef USE_POOL_FREESORT
323 ASSERT(!IsInFreeList(pFreeNode));
329 AddFreeNode(pFreeNode);
340 ::new((
void*)pUsed)
TYPE;
361 for (; pFreeNode !=
nullptr; pFreeNode = pFreeNode->
get_FreeNext())
365 #ifdef USE_POOL_FREESORT
379 ASSERT(IsInFreeList(pNode));
384 ASSERT(!IsInFreeList(pNode));
385 pNode->
get_Used()->isPoolNodeValid(uCheckVal);
394 ASSERT(pUsedNode !=
nullptr);
401 ASSERT(pUsedNode !=
nullptr);
403 return this->IsInFreeList(pFreeNode);
409 template<
class TYPE >
431 #define POOL_CLASS_IMPL(TYPE) \
432 void * operator new (size_t size) { ASSERT( size == sizeof(TYPE)); return cPoolClass<TYPE>::I().AllocPoolObjectNC(); } \
433 void operator delete(void * dead, size_t size) { ASSERT( size == sizeof(TYPE)); cPoolClass<TYPE>::I().FreePoolObjectND( (TYPE*) dead); }
#define IGNORE_WARN_INTERFACE(c)
Definition: GrayCore.h:79
#define IS_INDEX_GOOD(i, q)
cast the (likely) int to unsigned to check for negatives.
Definition: Index.h:35
#define TYPE
Definition: StrT.cpp:38
#define ASSERT(exp)
Definition: cDebugAssert.h:87
#define DEBUG_ASSERT(exp, sDesc)
Definition: cDebugAssert.h:93
#define CHEAPOBJECT_IMPL
Definition: cHeapObject.h:32
cPoolBucket * AddBucketNew()
Definition: cPool.h:78
ITERATE_t m_nBucketAllocQty
how many new objects per bucket.
Definition: cPool.h:42
cArrayStruct< cPoolBucket > m_aBuckets
all allocated space. free and used objects.
Definition: cPool.h:41
cPoolBase(ITERATE_t nBucketAllocQty=128) noexcept
Definition: cPool.h:45
ITERATE_t get_BucketAllocQty() const noexcept
Definition: cPool.h:53
cArrayStruct< TYPE > cPoolBucket
Definition: cPool.h:40
ITERATE_t get_AllocQty() const noexcept
Definition: cPool.h:58
void FreeBuckets()
Definition: cPool.h:93
bool isInPool(const void *pObj) const
Definition: cPool.h:65
cPoolClass(ITERATE_t nBucketAllocQty=128) noexcept
Definition: cPool.h:421
~cPoolClass()
Definition: cPool.h:425
THIS_t * m_pFreeNext
union the object in 'free' or 'used' state.
Definition: cPool.h:113
bool isPoolNodeFree() const noexcept
Definition: cPool.h:128
TYPE * get_Used() const
Definition: cPool.h:134
THIS_t * get_FreeNext() const
Definition: cPool.h:139
cPoolNodeFreeT() noexcept
Definition: cPool.h:119
BYTE m_Used[sizeof(TYPE)]
the TYPE object in 'used' state. assume IPoolNode based.
Definition: cPool.h:114
~cPoolNodeFreeT() noexcept
Definition: cPool.h:124
void put_FreeNext(THIS_t *pFreeNext)
Definition: cPool.h:144
bool IsInFreeList(const TYPE *pUsedNode) const
Definition: cPool.h:398
bool IsInFreeState(const TYPE *pUsedNode) const
Definition: cPool.h:392
TYPE * AllocPoolObject()
Definition: cPool.h:332
void FreePool()
Definition: cPool.h:271
~cPool()
Definition: cPool.h:235
void FreePoolObjectND(TYPE *pUsed)
Definition: cPool.h:314
TYPE * AllocPoolObjectNC()
Definition: cPool.h:281
cPool(ITERATE_t nBucketAllocQty=128) noexcept
Definition: cPool.h:225
void FreePoolObject(TYPE *pUsed)
Definition: cPool.h:343
bool isPoolUsed() const
Definition: cPool.h:245
bool put_BucketAllocQty(ITERATE_t nBucketAllocQty)
Definition: cPool.h:258
bool CheckValidPool(UINT_PTR uCheckVal=0) const
Definition: cPool.h:354
void RemoveAll()
Clean up.
Definition: cArray.h:230
TYPE & ElementAt(ITERATE_t nIndex)
Definition: cArray.h:167
ITERATE_t GetSize() const noexcept
Definition: cArray.h:137
void SetSize(ITERATE_t nNewSize)
Definition: cArray.h:248
static bool __stdcall isInCInit()
Definition: cAppState.cpp:280
static bool __stdcall isInCExit()
Definition: cAppState.cpp:310
Definition: cArraySort.h:24
ITERATE_t FindIForKey(KEY_t key) const
Definition: cArraySort.h:68
bool RemoveKey(TYPE_KEY key)
Definition: cArraySort.h:124
ITERATE_t Add(TYPE_ARG pNew)
Definition: cArraySort.h:186
ITERATE_t FindIFor(ARG_TYPE arg) const
Definition: cArray.h:614
Definition: cSingleton.h:127
Definition: cThreadLock.h:498
UNITTEST2_PREDEF(cQuadtree)
MIDL_INTERFACE("0C3E2E71-B93C-11d2-AAD0-006007654304") IScriptableObj
int ITERATE_t
like size_t but signed
Definition: Index.h:28