36 explicit GrowingPool(MemoryHeap* heap,
KyUInt32 byteCountInChunk = 0);
38 ~GrowingPool() { Release(); }
47 KyUInt32 GetElementCount()
const {
return m_elementCount; }
48 KyUInt32 GetChunkCount()
const {
return m_chunkCount; }
49 KyUInt32 ByteCountAllocated()
const {
return m_byteCountAllocated; }
59 KyArrayDH_POD<T*> m_chunks;
71 inline GrowingPool<T>::GrowingPool(MemoryHeap* heap,
KyUInt32 byteCountInChunk) : m_chunks(heap)
73 if (byteCountInChunk <= 0)
74 byteCountInChunk = 512 * 1024;
77 for (
KyUInt32 i = 0 ; i < m_chunks.GetCount(); ++i)
78 m_chunks[i] =
nullptr;
82 m_maxElementCountInChunk = CalculateElementCountFromByteCount(byteCountInChunk);
83 m_maxWordCountInChunk = CalculateWordCount(m_maxElementCountInChunk);
84 m_elementCountInLastChunk = m_maxElementCountInChunk;
85 m_byteCountAllocated = 0;
91 inline T* GrowingPool<T>::GetNew()
93 if (m_elementCountInLastChunk == m_maxElementCountInChunk)
95 KyUInt32 oldSize = m_chunks.GetCount();
96 if (m_chunkCount >= oldSize)
98 m_chunks.Resize(oldSize * 2);
99 for (
KyUInt32 i = oldSize; i < m_chunks.GetCount(); ++i)
100 m_chunks[i] =
nullptr;
103 if (m_chunks[m_chunkCount] ==
nullptr)
105 m_chunks[m_chunkCount] = (T*)KY_HEAP_MALLOC(m_heap,
KyUInt32, m_maxWordCountInChunk, MemStat_NavDataGen);
106 m_byteCountAllocated += m_maxWordCountInChunk *
sizeof(
KyUInt32);
110 m_elementCountInLastChunk = 0;
115 T* ptr = &m_chunks[m_chunkCount - 1][m_elementCountInLastChunk];
118 ++m_elementCountInLastChunk;
124 inline
void GrowingPool<T>::Clear()
130 for (
KyUInt32 chunkIdx = 0; chunkIdx < GetChunkCount(); ++chunkIdx)
132 GetChunk(chunkIdx, chunk, countInChunk);
133 for (
KyUInt32 idx = 0; idx < countInChunk; ++idx)
139 m_elementCountInLastChunk = m_maxElementCountInChunk;
144 inline void GrowingPool<T>::Release()
148 for (
KyUInt32 i = 0; i < m_chunks.GetCount(); ++i)
149 KY_FREE(m_chunks[i]);
151 m_chunks.ClearAndRelease();
152 m_byteCountAllocated = 0;
157 KY_INLINE
void GrowingPool<T>::GetChunk(
KyUInt32 idx, T*& chunk,
KyUInt32& countInChunk)
159 chunk = m_chunks[idx];
160 countInChunk = (idx != m_chunkCount - 1) ? m_maxElementCountInChunk : m_elementCountInLastChunk;
165 KY_INLINE
KyUInt32 GrowingPool<T>::CalculateElementCountFromByteCount(
KyInt32 byteCount)
167 return (byteCount - 1) / (
KyInt32)
sizeof (T) + 1;
171 KY_INLINE
KyUInt32 GrowingPool<T>::CalculateWordCount(
KyInt32 elementCount)
173 return (elementCount * (
KyInt32)
sizeof (T) - 1) /
sizeof(
KyUInt32) + 1;
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
std::int32_t KyInt32
int32_t
Definition: types.h:24