diff options
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/dynamic-array.cpp | 21 | ||||
| -rw-r--r-- | src/dynamic-array.hpp | 55 |
3 files changed, 78 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d39ab9..5e840fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,8 @@ set(PKE_SOURCE_FILES src/macros.hpp src/memory.hpp src/memory.cpp + src/dynamic-array.hpp + src/dynamic-array.cpp src/asset-manager.hpp src/asset-manager.cpp src/window.hpp diff --git a/src/dynamic-array.cpp b/src/dynamic-array.cpp new file mode 100644 index 0000000..2ec35dd --- /dev/null +++ b/src/dynamic-array.cpp @@ -0,0 +1,21 @@ + +#include "dynamic-array.hpp" + +void inline DynArrayReserve(DynArrayBase *arr, int64_t count) { + if (arr->reservedSize >= count) return; + char *a = pke::PkeNew<char>(arr->elementSize * count); + if (arr->ptr != nullptr) { + std::memcpy(a, arr->ptr, arr->elementSize * arr->reservedSize); + pke::PkeDelete<char>(arr->ptr, arr->elementSize * arr->reservedSize); + } + arr->reservedSize = count; + arr->ptr = a; +} + +void inline DynArrayDestroy(DynArrayBase *arr) { + if (arr->ptr == nullptr) return; + if (arr->ptr == reinterpret_cast<char *>(0xCAFEBABE)) return; + pke::PkeDelete<char>(arr->ptr, arr->elementSize * arr->reservedSize); + arr->ptr = reinterpret_cast<char *>(0xCAFEBABE); +} + diff --git a/src/dynamic-array.hpp b/src/dynamic-array.hpp new file mode 100644 index 0000000..29fb765 --- /dev/null +++ b/src/dynamic-array.hpp @@ -0,0 +1,55 @@ +#ifndef FOUR_ZED_ZED_DYNAMIC_ARRAY_HPP +#define FOUR_ZED_ZED_DYNAMIC_ARRAY_HPP + +#include "memory.hpp" + +#include <cstdint> +#include <cstring> +#include <cassert> + +#define BAKE_DYN_ARRAY(T) template struct DynArray<T>; + +struct DynArrayBase { + char *ptr = nullptr; + int64_t elementSize = 0; + int64_t reservedSize = 0; +}; + +template <typename T> +struct DynArray: DynArrayBase { + DynArray(); + ~DynArray(); + T operator[](std::size_t index); + T *GetPtr(); + void Reserve(int64_t count); + private: + using DynArrayBase::ptr; + using DynArrayBase::elementSize; + using DynArrayBase::reservedSize; +}; + +void inline DynArrayReserve(DynArrayBase *arr, int64_t count); +void inline DynArrayDestroy(DynArrayBase *arr); + +template <typename T> inline DynArray<T>::DynArray() { + this->elementSize = sizeof(T); +} + +template <typename T> inline DynArray<T>::~DynArray() { + DynArrayDestroy(this); +} + +template <typename T> inline T DynArray<T>::operator[](std::size_t index) { + assert(index < this->reservedSize && "Invalid DynArray<T> index"); + return *reinterpret_cast<T *>((this->ptr + (sizeof(T) * index))); +} + +template <typename T> inline T *DynArray<T>::GetPtr() { + return reinterpret_cast<T *>(reinterpret_cast<void *>(this->ptr)); +} + +template <typename T> inline void DynArray<T>::Reserve(int64_t count) { + return DynArrayReserve(this, count); +} + +#endif /* FOUR_ZED_ZED_DYNAMIC_ARRAY_HPP */ |
