From 0319d8ad7f5f6d69867f8aea08ee6a142879ea27 Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Wed, 13 Dec 2023 15:48:25 -0500 Subject: add PkeArray --- src/array.hpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/array.hpp (limited to 'src') 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