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 /src | |
| parent | 506c0c44a7572997eea0a09c32162b624c15bec7 (diff) | |
add PkeArray
Diffstat (limited to 'src')
| -rw-r--r-- | src/array.hpp | 54 |
1 files changed, 54 insertions, 0 deletions
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 */ |
