diff --git a/storm/Array.hpp b/storm/Array.hpp index a9ef2b0..12b966c 100644 --- a/storm/Array.hpp +++ b/storm/Array.hpp @@ -2,5 +2,6 @@ #define STORM_ARRAY_HPP #include "array/TSBaseArray.hpp" +#include "array/TSFixedArray.hpp" #endif diff --git a/storm/array/TSFixedArray.hpp b/storm/array/TSFixedArray.hpp new file mode 100644 index 0000000..47120c0 --- /dev/null +++ b/storm/array/TSFixedArray.hpp @@ -0,0 +1,67 @@ +#ifndef STORM_ARRAY_TS_FIXED_ARRAY_HPP +#define STORM_ARRAY_TS_FIXED_ARRAY_HPP + +#include "array/TSBaseArray.hpp" +#include "Memory.hpp" +#include + +template +class TSFixedArray : public TSBaseArray { + public: + void ReallocData(uint32_t count); + void SetCount(uint32_t count); +}; + +template +void TSFixedArray::ReallocData(uint32_t count) { + T* oldData = this->m_data; + + if (count < this->m_count) { + for (int32_t i = count; i < this->m_count; i++) { + T* element = &this->m_data[i]; + delete element; + } + } + + this->m_alloc = count; + + void* v6 = SMemReAlloc(oldData, sizeof(T) * count, nullptr, 0, 0x10); + this->m_data = (T*)v6; + + if (!v6) { + this->m_data = (T*)SMemAlloc(sizeof(T) * count, nullptr, 0, 0x0); + + if (oldData) { + uint32_t smallestCount = count >= this->m_count ? this->m_count : count; + + for (int32_t i = 0; i < smallestCount; i++) { + T* v8 = &this->m_data[i]; + + if (v8) { + *v8 = oldData[i]; + } + } + + SMemFree(oldData, nullptr, 0, 0x0); + } + } +} + +template +void TSFixedArray::SetCount(uint32_t count) { + if (count != this->m_count) { + if (count) { + this->ReallocData(count); + + for (int32_t i = this->m_count; i < count; i++) { + new (&this->m_data[i]) T(); + } + + this->m_count = count; + } else { + this->Clear(); + } + } +} + +#endif diff --git a/test/Array.cpp b/test/Array.cpp index 2b91ed8..0a65a56 100644 --- a/test/Array.cpp +++ b/test/Array.cpp @@ -7,3 +7,10 @@ TEST_CASE("TSBaseArray", "[list]") { REQUIRE(array.Count() == 0); } } + +TEST_CASE("TSFixedArray", "[list]") { + SECTION("constructs correctly") { + TSFixedArray array; + REQUIRE(array.Count() == 0); + } +}