summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/array.hpp54
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 */