diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-13 15:48:25 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-13 15:49:50 -0500 |
| commit | 0319d8ad7f5f6d69867f8aea08ee6a142879ea27 (patch) | |
| tree | 12549c0de6700f868e0ba3b78b7b8ac0a5ede9ba | |
| parent | 506c0c44a7572997eea0a09c32162b624c15bec7 (diff) | |
add PkeArray
| -rw-r--r-- | CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/array.hpp | 54 |
2 files changed, 55 insertions, 0 deletions
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 <cstdint> + +struct PkeArray_Base { + uint32_t next = 0; + uint32_t reserved = 0; +}; + +template<typename D> +struct PkeArray : PkeArray_Base { + using PkeArray_Base::next; + using PkeArray_Base::reserved; + D *data = nullptr; +}; + +template<typename D> +void PkeArray_HardReset(PkeArray_Base *arrIn) { + auto *arr = static_cast<PkeArray<D> *>(arrIn); + arr->next = 0; + arr->reserved = 0; + arr->data = CAFE_BABE(D); +} + +template<typename D> +inline void PkeArray_Add(PkeArray_Base *arrIn, const D &val, MemBucket *bkt = nullptr) { + auto *arr = static_cast<PkeArray<D> *>(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<D>(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<D>(arr->data, originalCount, bkt); + } + arr->data = newData; + } + arr->data[arr->next++] = val; +} + + +#endif /* PKE_ARRAY_HPP */ |
