From 5e67008bc6039c593af4930b3a39242c6fc48355 Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Fri, 13 Oct 2023 12:02:00 -0400 Subject: DynArray can specify MemBucket in constructor --- src/dynamic-array.hpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'src/dynamic-array.hpp') diff --git a/src/dynamic-array.hpp b/src/dynamic-array.hpp index 95ba967..3bf02ee 100644 --- a/src/dynamic-array.hpp +++ b/src/dynamic-array.hpp @@ -12,6 +12,7 @@ #define BAKE_DYN_ARRAY(T) template struct DynArray; struct DynArrayBase { + mutable MemBucket *bkt = nullptr; mutable char *ptr = nullptr; int64_t elementSize = 0; int64_t elementCount = 0; @@ -20,8 +21,8 @@ struct DynArrayBase { template struct DynArray: DynArrayBase { - DynArray(); - explicit DynArray(int64_t reserveCount); + explicit DynArray(MemBucket *bucket = nullptr); + explicit DynArray(int64_t reserveCount, MemBucket *bucket = nullptr); DynArray(const DynArray &other); DynArray(DynArray &&other); DynArray &operator=(const DynArray &other); @@ -38,6 +39,7 @@ struct DynArray: DynArrayBase { void Reserve(int64_t count); void Resize(int64_t count); protected: + using DynArrayBase::bkt; using DynArrayBase::ptr; using DynArrayBase::elementSize; using DynArrayBase::elementCount; @@ -47,7 +49,8 @@ struct DynArray: DynArrayBase { void DynArrayReserve(DynArrayBase *arr, int64_t count); void DynArrayDestroy(DynArrayBase *arr); -template inline DynArray::DynArray(int64_t count) { +template inline DynArray::DynArray(int64_t count, MemBucket *bucket) { + this->bkt = bucket; this->elementSize = sizeof(T); if (count > 0) DynArrayReserve(this, count); if IS_CONSTRUCTIBLE(T) { @@ -57,11 +60,13 @@ template inline DynArray::DynArray(int64_t count) { } } -template inline DynArray::DynArray() { +template inline DynArray::DynArray(MemBucket *bucket) { + this->bkt = bucket; this->elementSize = sizeof(T); } template inline DynArray::DynArray(const DynArray &rh) { + this->bkt = rh.bkt; this->ptr = rh.ptr; this->elementSize = rh.elementSize; this->elementCount = rh.elementCount; @@ -70,6 +75,7 @@ template inline DynArray::DynArray(const DynArray &rh) { } template inline DynArray::DynArray(DynArray &&rh) { + this->bkt = rh.bkt; this->ptr = rh.ptr; this->elementSize = rh.elementSize; this->elementCount = rh.elementCount; @@ -78,6 +84,7 @@ template inline DynArray::DynArray(DynArray &&rh) { } template inline DynArray &DynArray::operator=(const DynArray &rh) { + this->bkt = rh.bkt; this->ptr = rh.ptr; this->elementSize = rh.elementSize; this->elementCount = rh.elementCount; @@ -87,6 +94,7 @@ template inline DynArray &DynArray::operator=(const DynArray< } template inline DynArray &DynArray::operator=(DynArray &&rh) { + this->bkt = rh.bkt; this->ptr = rh.ptr; this->elementSize = rh.elementSize; this->elementCount = rh.elementCount; @@ -159,13 +167,13 @@ template inline void DynArray::Remove(std::size_t index) { assert(this->elementCount == 0 && "Invalid DynArray::Remove() - Contains no elements"); assert(index >= this->elementCount && "Invalid DynArray::Remove() - Out of bounds"); uint64_t moveCount = (this->elementCount - index - 1); - auto *tmp = Pke_New(sizeof(T) * moveCount); + T *tmp = Pke_New(moveCount, this->bkt); if IS_DESTRUCTIBLE(T) { reinterpret_cast(this->ptr + (index * sizeof(T))).~T(); } memcpy(tmp, this->ptr + (sizeof(T) * (index + 1)), sizeof(T) * moveCount); memcpy(this->ptr + (sizeof(T) * index), tmp, sizeof(T) * moveCount); - Pke_Delete(tmp, moveCount * sizeof(T)); + Pke_Delete(tmp, moveCount, this->bkt); this->elementCount -= 1; } -- cgit v1.2.3