#ifndef PKE_ARRAY_HPP #define PKE_ARRAY_HPP #include "vendor/pk.h" #include #include #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); } inline void PkeArray_SoftReset(PkeArray_Base *arrIn) { arrIn->next = 0; } template inline void PkeArray_Add(PkeArray_Base *arrIn, const D &val, struct pk_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 = pk_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); pk_delete(arr->data, originalCount, bkt); } arr->data = newData; } if constexpr (std::is_assignable::value) { arr->data[arr->next++] = val; } else { memcpy(arr->data[arr->next++], val, sizeof(D)); } } template inline int64_t PkeArray_FindFirstIndex(PkeArray_Base *arrIn, F fn, const D2 &d2) { auto *arr = static_cast *>(arrIn); for (int64_t i = 0; i < arr->next; ++i) { if (fn(arr->data[i], d2)) { return i; } } return -1; } #endif /* PKE_ARRAY_HPP */