18 class SmallPtrTrackedCollection
22 SmallPtrTrackedCollection() : m_count(0), m_capacity(1) { m_values.m_multipleValues =
nullptr; }
23 ~SmallPtrTrackedCollection() { KY_LOG_ERROR_IF(m_count != 0, (
"memory leak !")); }
25 KY_INLINE
bool IsEmpty()
const {
return GetCount() == 0; }
26 KY_INLINE
KyUInt32 GetCount()
const {
return m_count; }
28 KY_INLINE T** GetValues() {
return m_capacity == 1 ? &m_values.m_oneValue : m_values.m_multipleValues; }
30 void PushBack(MemoryHeap* heap, T* newValue)
37 newValue->SetIndexInCollection(0);
38 m_values.m_oneValue = newValue;
42 T* firstValue = m_values.m_oneValue;
45 m_values.m_multipleValues = (T**)KY_HEAP_ALLOC(heap,
KyUInt32(4 *
sizeof(T*)), MemStat_NavData);
50 m_values.m_multipleValues[0] = firstValue;
51 m_values.m_multipleValues[1] = newValue;
53 newValue->SetIndexInCollection(1);
57 if (m_count == m_capacity)
58 Reserve(heap, 2 * m_capacity);
60 m_values.m_multipleValues[m_count] = newValue;
61 newValue->SetIndexInCollection(m_count);
67 void Reserve(MemoryHeap* heap,
KyUInt32 newcapacity)
69 KY_DEBUG_ASSERTN(newcapacity > m_count, (
"no shrinking !"));
71 T** values = (T**)KY_HEAP_ALLOC(heap, newcapacity * (
KyUInt32)
sizeof(T*), MemStat_NavData);
73 memcpy(values, m_values.m_multipleValues, m_count *
sizeof(T*));
75 KY_FREE(m_values.m_multipleValues);
78 m_values.m_multipleValues = values;
85 for(
KyUInt32 i = 0; i < m_count; ++i)
86 m_values.m_multipleValues[i]->SetIndexInCollection(
KyUInt32MAXVAL);
88 KY_FREE(m_values.m_multipleValues);
98 m_values.m_oneValue =
nullptr;
101 void SwapWithLastAndPopBack(T* valueToRemove)
103 const KyUInt32 index = valueToRemove->GetIndexInCollection();
106 KY_DEBUG_ASSERTN(index < m_count, (
"error"));
109 m_values.m_multipleValues[index]->SetIndexInCollection(
KyUInt32MAXVAL);
111 if (index != lastIndex)
114 m_values.m_multipleValues[lastIndex]->SetIndexInCollection(index);
115 m_values.m_multipleValues[index] = m_values.m_multipleValues[lastIndex];
123 m_values.m_oneValue =
nullptr;
128 void GetOwnershipOfData(SmallPtrTrackedCollection& other)
132 m_values = other.m_values;
133 m_count = other.m_count;
134 m_capacity = other.m_capacity;
136 other.m_values.m_oneValue =
nullptr;
138 other.m_capacity = 0;
145 T** m_multipleValues;
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
std::uint16_t KyUInt16
uint16_t
Definition: types.h:28
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
#define KyUInt32MAXVAL
KyUInt32 max value
Definition: types.h:68