From 0319d8ad7f5f6d69867f8aea08ee6a142879ea27 Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Wed, 13 Dec 2023 15:48:25 -0500 Subject: add PkeArray --- CMakeLists.txt | 1 + src/array.hpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 src/array.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ed862b..f4317ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -pthread") set(PKE_SOURCE_FILES src/macros.hpp + src/array.hpp src/camera.hpp src/camera.cpp src/components.hpp diff --git a/src/array.hpp b/src/array.hpp new file mode 100644 index 0000000..1fd6266 --- /dev/null +++ b/src/array.hpp @@ -0,0 +1,54 @@ +#ifndef PKE_ARRAY_HPP +#define PKE_ARRAY_HPP + +#include "macros.hpp" +#include "memory-type-defs.hpp" + +#include + +struct PkeArray_Base { + uint32_t next = 0; + uint32_t reserved = 0; +}; + +template +struct PkeArray : PkeArray_Base { + using PkeArray_Base::next; + using PkeArray_Base::reserved; + D *data = nullptr; +}; + +template +void PkeArray_HardReset(PkeArray_Base *arrIn) { + auto *arr = static_cast *>(arrIn); + arr->next = 0; + arr->reserved = 0; + arr->data = CAFE_BABE(D); +} + +template +inline void PkeArray_Add(PkeArray_Base *arrIn, const D &val, MemBucket *bkt = nullptr) { + auto *arr = static_cast *>(arrIn); + if (arr->reserved == arr->next) { + long originalCount = arr->reserved; + long diff = 0; + if (arr->reserved == 0) { + diff = 16; + arr->reserved = 16; + } else { + arr->reserved *= 2.5; + diff = arr->reserved - originalCount; + } + auto *newData = Pke_New(arr->reserved, bkt); + memset(newData + (sizeof(D) * originalCount), 0xFF, sizeof(D) * diff); + if (arr->data != nullptr && arr->data != CAFE_BABE(D)) { + memcpy(newData, arr->data, sizeof(D) * originalCount); + Pke_Delete(arr->data, originalCount, bkt); + } + arr->data = newData; + } + arr->data[arr->next++] = val; +} + + +#endif /* PKE_ARRAY_HPP */ -- cgit v1.2.3