diff --git a/storm/array/TSBaseArray.hpp b/storm/array/TSBaseArray.hpp index 54d6aaa..417ee9c 100644 --- a/storm/array/TSBaseArray.hpp +++ b/storm/array/TSBaseArray.hpp @@ -8,17 +8,20 @@ template class TSBaseArray { public: - uint32_t m_alloc = 0; - uint32_t m_count = 0; - T* m_data = nullptr; + // Member variables + uint32_t m_alloc; + uint32_t m_count; + T* m_data; + // Virtual member functions virtual const char* MemFileName() const; virtual int32_t MemLineNo() const; + // Member functions T& operator[](uint32_t index); void CheckArrayBounds(uint32_t index) const; + void Constructor(); uint32_t Count() const; - void Clear(); T* Ptr(); const T* Ptr() const; T* Top(); @@ -48,14 +51,15 @@ void TSBaseArray::CheckArrayBounds(uint32_t index) const { } template -uint32_t TSBaseArray::Count() const { - return this->m_count; +void TSBaseArray::Constructor() { + this->m_alloc = 0; + this->m_count = 0; + this->m_data = nullptr; } template -void TSBaseArray::Clear() { - delete[] this->m_data; - TSBaseArray(); +uint32_t TSBaseArray::Count() const { + return this->m_count; } template diff --git a/storm/array/TSFixedArray.hpp b/storm/array/TSFixedArray.hpp index 592372f..37b8a7d 100644 --- a/storm/array/TSFixedArray.hpp +++ b/storm/array/TSFixedArray.hpp @@ -8,14 +8,21 @@ template class TSFixedArray : public TSBaseArray { public: + TSFixedArray(); ~TSFixedArray(); TSFixedArray& operator=(const TSFixedArray& source); + void Clear(); void ReallocAndClearData(uint32_t count); void ReallocData(uint32_t count); void Set(uint32_t count, const T* data); void SetCount(uint32_t count); }; +template +TSFixedArray::TSFixedArray() { + this->Constructor(); +} + template TSFixedArray::~TSFixedArray() { for (uint32_t i = 0; i < this->Count(); i++) { @@ -37,6 +44,12 @@ TSFixedArray& TSFixedArray::operator=(const TSFixedArray& source) { return *this; } +template +void TSFixedArray::Clear() { + this->~TSFixedArray(); + this->Constructor(); +} + template void TSFixedArray::ReallocAndClearData(uint32_t count) { this->m_alloc = count; diff --git a/test/Array.cpp b/test/Array.cpp index b7887d6..9a086c9 100644 --- a/test/Array.cpp +++ b/test/Array.cpp @@ -9,7 +9,7 @@ struct TestArrayObject { TEST_CASE("TSBaseArray", "[array]") { SECTION("constructs correctly") { TSBaseArray array; - REQUIRE(array.Count() == 0); + SUCCEED(); } } @@ -31,6 +31,52 @@ TEST_CASE("TSFixedArray", "[array]") { SECTION("constructs correctly") { TSFixedArray array; REQUIRE(array.Count() == 0); + REQUIRE(array.Ptr() == nullptr); + } +} + +TEST_CASE("TSFixedArray::Clear", "[array]") { + SECTION("clears already empty array") { + TSFixedArray array; + array.Clear(); + + CHECK(array.Count() == 0); + CHECK(array.Ptr() == nullptr); + } + + SECTION("clears non-empty array") { + TSFixedArray array; + array.SetCount(10); + + CHECK(array.Count() == 10); + CHECK(array.Ptr() != nullptr); + + array.Clear(); + + CHECK(array.Count() == 0); + CHECK(array.Ptr() == nullptr); + } + + SECTION("permits setting entry after clearing and resizing") { + TSFixedArray array; + array.SetCount(1); + array[0] = 1234; + + CHECK(array.Count() == 1); + CHECK(array.Ptr() != nullptr); + CHECK(array[0] == 1234); + + array.Clear(); + + CHECK(array.Count() == 0); + CHECK(array.Ptr() == nullptr); + + array.SetCount(1); + array[0] = 4567; + + CHECK(array.Count() == 1); + CHECK(array.Ptr() != nullptr); + CHECK(array[0] == 4567); } }