diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynamic-array.cpp | 4 | ||||
| -rw-r--r-- | src/dynamic-array.hpp | 23 |
2 files changed, 23 insertions, 4 deletions
diff --git a/src/dynamic-array.cpp b/src/dynamic-array.cpp index d48ea82..6fb04b9 100644 --- a/src/dynamic-array.cpp +++ b/src/dynamic-array.cpp @@ -1,7 +1,7 @@ #include "dynamic-array.hpp" -void inline DynArrayReserve(DynArrayBase *arr, int64_t count) { +void DynArrayReserve(DynArrayBase *arr, int64_t count) { if (arr->reservedCount >= count) return; char *a = pke::PkeNew<char>(arr->elementSize * count); if (arr->ptr != nullptr) { @@ -12,7 +12,7 @@ void inline DynArrayReserve(DynArrayBase *arr, int64_t count) { arr->ptr = a; } -void inline DynArrayDestroy(DynArrayBase *arr) { +void DynArrayDestroy(DynArrayBase *arr) { if (arr->ptr == nullptr) return; if (arr->ptr == CAFE_BABE(char)) return; pke::PkeDelete<char>(arr->ptr, arr->elementSize * arr->reservedCount); diff --git a/src/dynamic-array.hpp b/src/dynamic-array.hpp index 3fc2d08..703b5ed 100644 --- a/src/dynamic-array.hpp +++ b/src/dynamic-array.hpp @@ -20,9 +20,12 @@ struct DynArrayBase { template <typename T> struct DynArray: DynArrayBase { DynArray(); + explicit DynArray(int64_t reserveCount); ~DynArray(); T operator[](std::size_t index); T *GetPtr(); + const int64_t Count(); + bool Has(const T &val); void Push(const T &val); T Pop(); void Reserve(int64_t count); @@ -34,8 +37,13 @@ struct DynArray: DynArrayBase { using DynArrayBase::reservedCount; }; -void inline DynArrayReserve(DynArrayBase *arr, int64_t count); -void inline DynArrayDestroy(DynArrayBase *arr); +void DynArrayReserve(DynArrayBase *arr, int64_t count); +void DynArrayDestroy(DynArrayBase *arr); + +template <typename T> inline DynArray<T>::DynArray(int64_t count) { + this->elementSize = sizeof(T); + this->Reserve(count); +} template <typename T> inline DynArray<T>::DynArray() { this->elementSize = sizeof(T); @@ -55,6 +63,17 @@ template <typename T> inline T *DynArray<T>::GetPtr() { return reinterpret_cast<T *>(reinterpret_cast<void *>(this->ptr)); } +template <typename T> inline const int64_t DynArray<T>::Count() { + return this->elementCount; +} + +template <typename T> inline bool DynArray<T>::Has(const T &val) { + for (long i = 0; i < this->elementCount; ++i) { + if ((*this)[i] == val) return true; + } + return false; +} + template <typename T> inline void DynArray<T>::Push(const T &val) { if (this->elementCount + 1 > this->reservedCount) { DynArrayReserve(this, int64_t(this->reservedCount * 1.5)); |
