30 #include "ndCoreStdafx.h"
33 #include "ndClassAlloc.h"
38 template <
class dItem,
class dKey>
42 ndHeap(ndInt32 maxElements);
43 ndHeap(
const void *
const buffer, ndInt32 sizeInBytes);
47 dKey MaxValue()
const;
48 dKey Value(ndInt32 i = 0)
const;
49 ndInt32 GetCount()
const;
50 ndInt32 GetMaxCount()
const;
51 const dItem& operator[] (ndInt32 i)
const;
52 ndInt32 Find(dItem &obj);
53 ndInt32 Find(dKey key);
57 void Remove(ndInt32 Index);
58 void Push(dItem &obj, dKey key);
64 dRecord(dKey key,
const dItem& obj)
77 bool m_bufferIsOwnned;
88 template <
class dItem,
class dKey>
91 ,m_pool((dRecord *)
ndMemory::Malloc(maxElements * sizeof(dRecord)))
93 ,m_maxCount(maxElements)
94 ,m_bufferIsOwnned(true)
99 template <
class dItem,
class dKey>
102 ,m_pool((dRecord *)buffer)
104 ,m_maxCount(ndInt32(sizeInBytes / sizeof(dRecord)))
105 ,m_bufferIsOwnned(false)
110 template <
class dItem,
class dKey>
113 if (m_bufferIsOwnned)
119 template <
class dItem,
class dKey>
122 return m_pool[i].m_key;
125 template <
class dItem,
class dKey>
131 template <
class dItem,
class dKey>
141 template <
class dItem,
class dKey>
144 return m_pool[0].m_key;
147 template <
class dItem,
class dKey>
153 template <
class dItem,
class dKey>
162 for (ndInt32 i = 0; i < m_curCount; ++i)
164 if (m_pool[i].obj == obj)
172 template <
class dItem,
class dKey>
178 ndAssert(m_curCount <= 32);
179 for (ndInt32 i = 0; i < m_curCount; ++i)
181 if (m_pool[i].m_key == key)
189 template <
class dItem,
class dKey>
192 ndAssert(i <= m_curCount);
193 return m_pool[i].m_obj;
196 template <
class dItem,
class dKey>
199 #ifdef ND_HEAP_DEBUG_CHECK
200 for (ndInt32 i = 0; i < m_curCount; ++i)
202 ndInt32 i1 = 2 * i + 1;
203 ndInt32 i2 = 2 * i + 2;
217 template <
class dItem,
class dKey>
223 for (ndInt32 j = 0; i; i = j)
236 ndAssert(SanityCheck());
239 template <
class dItem,
class dKey>
245 template <
class dItem,
class dKey>
253 index = (index - 1) >> 1;
258 ndInt32 i0 = 2 * index + 1;
259 ndInt32 i1 = 2 * index + 2;
279 ndAssert(SanityCheck());
282 template <
class dItem,
class dKey>
286 for (ndInt32 i = 1; i < count; ++i)
298 for (ndInt32 i = 0; i < count / 2; ++i)
309 ndAssert(SanityCheck());
317 template <
class dKey>
328 return m_key > key.m_key;
333 return m_key < key.m_key;
338 return m_key <= key.m_key;
344 template <
class dItem,
class dKey>
353 ndDownHeap(
const void*
const buffer, ndInt32 sizeInBytes)
358 dKey Value(ndInt32 i = 0)
const
365 template <
class dKey>
376 return m_key < key.m_key;
381 return m_key > key.m_key;
386 return m_key >= key.m_key;
392 template <
class dItem,
class dKey>
401 ndUpHeap(
const void*
const buffer, ndInt32 sizeInBytes)
406 dKey Value(ndInt32 i = 0)
const