29 void Init(
KyUInt32 count_, T* values_);
30 KyUInt32 GetCount()
const {
return m_count; }
31 T& Get(
KyUInt32 index) { KY_ASSERT(index < m_count);
return m_values[index]; }
32 const T& Get(
KyUInt32 index)
const { KY_ASSERT(index < m_count);
return m_values[index]; }
39 explicit BoxOfArrays(MemoryHeap* heap,
KyUInt32 byteCountInChunk = 0) :
40 m_countX(0), m_countY(0), m_columns(nullptr), m_pool(heap, byteCountInChunk), m_heap(heap) {}
42 ~BoxOfArrays() { Release(); }
46 KyUInt32 CountX()
const {
return m_countX; }
47 KyUInt32 CountY()
const {
return m_countY; }
48 KyUInt32 ColumnsCount()
const {
return m_countX * m_countY; }
50 T* InitColumn(
const Vec2i& pos,
KyUInt32 count) {
return InitColumn(pos.x, pos.y, count); }
54 Column& GetColumn(
const Vec2i& pos) {
return GetColumn(pos.x, pos.y); }
55 Column& GetColumn(
KyInt32 x,
KyInt32 y) {
return GetColumn(y * m_countX + x); }
56 Column& GetColumn(
KyInt32 rowMajorIdx) {
return m_columns[rowMajorIdx]; }
58 const Column& GetColumn(
const Vec2i& pos)
const {
return GetColumn(pos.x, pos.y); }
59 const Column& GetColumn(
KyInt32 x,
KyInt32 y)
const {
return GetColumn(y * m_countX + x); }
60 const Column& GetColumn(
KyInt32 rowMajorIdx)
const {
return m_columns[rowMajorIdx]; }
62 const Column* GetColumns()
const {
return m_columns; }
68 KyUInt32 ByteCountAllocated()
const {
return m_pool.ByteCountAllocated(); }
70 BoxOfArrays<T>& operator=(
const BoxOfArrays<T>& other);
76 GrowingSmallBufferPool m_pool;
80 BoxOfArrays<T>(
const BoxOfArrays<T>& other);
88 void BoxOfArrays<T>::Column::Init(
KyUInt32 count_, T* values_)
94 for (
KyUInt32 i = 0; i < m_count; ++i)
95 ::
new(m_values + i) T();
105 m_columns = KY_HEAP_MALLOC(m_heap, Column, countX * countY, MemStat_NavDataGen);
106 memset(m_columns, 0, countX * countY *
sizeof(Column));
112 T* values = (T*)m_pool.GetNewBuffer(count *
sizeof(T));
113 GetColumn(columnIdx).Init(count, values);
118 void BoxOfArrays<T>::Clear()
120 if (m_columns !=
nullptr)
131 void BoxOfArrays<T>::Release()
139 BoxOfArrays<T>& BoxOfArrays<T>::operator=(
const BoxOfArrays<T>& other)
141 Init(other.CountX(), other.CountY());
143 const Column* otherColumns = other.GetColumns();
144 KyUInt32 columnsCount = ColumnsCount();
146 for (
KyUInt32 columnIdx = 0; columnIdx < columnsCount; ++columnIdx)
148 const Column& otherColumn = otherColumns[columnIdx];
149 T* values = InitColumn(columnIdx, otherColumn.m_count);
150 memcpy(values, otherColumn.m_values, otherColumn.m_count *
sizeof(T));
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