30 #include "dCoreStdafx.h"
36 template <
class OBJECT,
class KEY>
45 RECORD (KEY key,
const OBJECT& obj)
46 :m_key(key), m_obj(obj)
52 dHeapBase (
const void *
const buffer, dInt32 sizeInBytes);
58 KEY Value(dInt32 i = 0)
const;
59 dInt32 GetCount()
const;
60 dInt32 GetMaxCount()
const;
61 const OBJECT& operator[] (dInt32 i)
const;
62 dInt32 Find (OBJECT &obj);
63 dInt32 Find (KEY key);
68 bool m_bufferIsOwnned;
71 template <
class OBJECT,
class KEY>
76 dDownHeap (
const void *
const buffer, dInt32 sizeInBytes);
78 void Pop () {Remove (0);}
79 void Push (OBJECT &obj, KEY key);
81 void Remove (dInt32 Index);
85 template <
class OBJECT,
class KEY>
90 dUpHeap (
const void *
const buffer, dInt32 sizeInBytes);
92 void Pop () {Remove (0);}
93 void Push (OBJECT &obj, KEY key);
95 void Remove (dInt32 Index);
99 template <
class OBJECT,
class KEY>
101 :m_pool((RECORD *)
dMemory::Malloc(maxElements * sizeof(RECORD)))
103 ,m_maxCount(maxElements)
104 ,m_bufferIsOwnned(true)
109 template <
class OBJECT,
class KEY>
111 :m_pool((RECORD *)buffer)
113 ,m_maxCount(dInt32(sizeInBytes / sizeof(RECORD)))
114 ,m_bufferIsOwnned(false)
119 template <
class OBJECT,
class KEY>
122 if (m_bufferIsOwnned)
128 template <
class OBJECT,
class KEY>
131 return m_pool[i].m_key;
134 template <
class OBJECT,
class KEY>
140 template <
class OBJECT,
class KEY>
150 template <
class OBJECT,
class KEY>
153 return m_pool[0].m_key;
156 template <
class OBJECT,
class KEY>
162 template <
class OBJECT,
class KEY>
171 for (dInt32 i = 0; i < m_curCount; i ++)
173 if (m_pool[i].obj == obj)
181 template <
class OBJECT,
class KEY>
187 dAssert (m_curCount <= 32);
188 for (dInt32 i = 0; i < m_curCount; i ++)
190 if (m_pool[i].m_key == key)
198 template <
class OBJECT,
class KEY>
201 dAssert (i<= m_curCount);
202 return m_pool[i].m_obj;
210 template <
class OBJECT,
class KEY>
216 template <
class OBJECT,
class KEY>
218 :
dHeapBase<OBJECT, KEY> (buffer, sizeInBytes)
222 template <
class OBJECT,
class KEY>
229 for (dInt32 j = 0; i; i = j)
242 dAssert (SanityCheck());
245 template <
class OBJECT,
class KEY>
253 index = (index - 1) >> 1;
258 dInt32 i0 = 2 * index + 1;
259 dInt32 i1 = 2 * index + 2;
279 dAssert (SanityCheck());
282 template <
class OBJECT,
class KEY>
286 for (dInt32 i = 1; i < count; i ++)
298 for (dInt32 i = 0; i < count / 2; i ++)
309 dAssert (SanityCheck());
312 template <
class OBJECT,
class KEY>
315 #ifdef DG_HEAP_DEBUG_CHECK
316 for (dInt32 i = 0; i < m_curCount; i++)
318 dInt32 i1 = 2 * i + 1;
319 dInt32 i2 = 2 * i + 2;
338 template <
class OBJECT,
class KEY>
345 template <
class OBJECT,
class KEY>
347 :
dHeapBase<OBJECT, KEY> (buffer, sizeInBytes)
351 template <
class OBJECT,
class KEY>
354 #ifdef DG_HEAP_DEBUG_CHECK
355 for (dInt32 i = 0; i < m_curCount; i ++)
357 dInt32 i1 = 2 * i + 1;
358 dInt32 i2 = 2 * i + 2;
372 template <
class OBJECT,
class KEY>
379 for (dInt32 j = 0; i; i = j)
391 dAssert (SanityCheck());
394 template <
class OBJECT,
class KEY>
398 for (dInt32 i = 1; i < count; i ++)
410 for (dInt32 i = 0; i < count / 2; i ++)
421 dAssert (SanityCheck());
424 template <
class OBJECT,
class KEY>
432 index = (index - 1) >> 1;
437 dInt32 i0 = 2 * index + 1;
438 dInt32 i1 = 2 * index + 2;
458 dAssert (SanityCheck());