diff --git a/Source/Common/Testing/imstkDataArrayTest.cpp b/Source/Common/Testing/imstkDataArrayTest.cpp index 61223bdf20ab31932438bde42e9b1080ce5c355d..28039ffb5c62cf6c43a7c81733a5c806fb9d525a 100644 --- a/Source/Common/Testing/imstkDataArrayTest.cpp +++ b/Source/Common/Testing/imstkDataArrayTest.cpp @@ -99,28 +99,44 @@ TEST(imstkDataArrayTest, Mapping) TEST(imstkDataArrayTest, CapacityManagement) { - DataArray<int> a; - EXPECT_EQ(0, a.size()); - EXPECT_EQ(1, a.getCapacity()); - a.push_back(0); - EXPECT_EQ(1, a.size()); - EXPECT_EQ(1, a.getCapacity()); - for (int i = 1; i < 10; ++i) { - a.push_back(i); - EXPECT_EQ(i + 1, a.size()); + DataArray<int> a; + EXPECT_EQ(0, a.size()); + EXPECT_EQ(1, a.getCapacity()); + a.push_back(0); + EXPECT_EQ(1, a.size()); + EXPECT_EQ(1, a.getCapacity()); + for (int i = 1; i < 10; ++i) + { + a.push_back(i); + EXPECT_EQ(i + 1, a.size()); + } + EXPECT_TRUE(isEqualTo(a, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 })); + } + { + DataArray<int> a; + a.resize(100); + EXPECT_EQ(100, a.size()); + EXPECT_EQ(100, a.getCapacity()); + a.resize(50); + EXPECT_EQ(50, a.size()); + EXPECT_EQ(50, a.getCapacity()); + a.resize(0); + EXPECT_EQ(0, a.size()); + EXPECT_EQ(1, a.getCapacity()); + } + { + DataArray<int> a{ 1, 2, 3, 4 }; + a.reserve(256); + EXPECT_EQ(4, a.size()); + EXPECT_EQ(256, a.getCapacity()); + a.reserve(100); + EXPECT_EQ(256, a.getCapacity()); + EXPECT_EQ(4, a.size()); + a.squeeze(); + EXPECT_EQ(4, a.getCapacity()); + EXPECT_EQ(4, a.size()); } - EXPECT_TRUE(isEqualTo(a, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 })); - a.reserve(256); - EXPECT_EQ(256, a.getCapacity()); - EXPECT_EQ(10, a.size()); - a.reserve(100); - EXPECT_EQ(100, a.getCapacity()); - EXPECT_EQ(10, a.size()); -// Doesn't work as expected -// a.squeeze(); -// EXPECT_EQ(10, a.getCapacity()); -// EXPECT_EQ(10, a.size()); } TEST(imstkDataArrayTest, Iterators) diff --git a/Source/Common/Testing/imstkVecDataArrayTest.cpp b/Source/Common/Testing/imstkVecDataArrayTest.cpp index ed716e738c731e67fc5ecda7d1f3a9ca96d461c7..7395fe29cbfeaa55020b604f90c6c39e4e5a6613 100644 --- a/Source/Common/Testing/imstkVecDataArrayTest.cpp +++ b/Source/Common/Testing/imstkVecDataArrayTest.cpp @@ -114,30 +114,44 @@ TEST(imstkVecDataArrayTest, Mapping) TEST(imstkVecDataArrayTest, CapacityManagement) { - VecDataArray<int, 2> a; - EXPECT_EQ(0, a.size()); - EXPECT_EQ(2, a.getCapacity()); - a.push_back({ 0, 0 }); - EXPECT_EQ(1, a.size()); - EXPECT_EQ(2, a.getCapacity()); - for (int i = 1; i < 10; ++i) { - a.push_back({ i, i }); - EXPECT_EQ(i + 1, a.size()); + VecDataArray<int, 2> a; + EXPECT_EQ(0, a.size()); + EXPECT_EQ(2, a.getCapacity()); + a.push_back({ 0, 0 }); + EXPECT_EQ(1, a.size()); + EXPECT_EQ(2, a.getCapacity()); + for (int i = 1; i < 10; ++i) + { + a.push_back({ i, i }); + EXPECT_EQ(i + 1, a.size()); + } + EXPECT_TRUE(isEqualTo(a, { { 0, 0 }, { 1, 1 }, { 2, 2 }, { 3, 3 }, { 4, 4 }, { 5, 5 }, { 6, 6 }, { 7, 7 }, { 8, 8 }, { 9, 9 } })); + } + { + VecDataArray<int, 2> a; + a.resize(100); + EXPECT_EQ(100, a.size()); + EXPECT_EQ(100 * 2, a.getCapacity()); + a.resize(50); + EXPECT_EQ(50, a.size()); + EXPECT_EQ(50 * 2, a.getCapacity()); + a.resize(0); + EXPECT_EQ(0, a.size()); + EXPECT_EQ(1 * 2, a.getCapacity()); + } + { + VecDataArray<int, 2> a{ imstk::Vec2i{ 0, 2, }, { 4, 6 } }; + a.reserve(256); + EXPECT_EQ(2, a.size()); + EXPECT_EQ(256 * 2, a.getCapacity()); + a.reserve(100); + EXPECT_EQ(2, a.size()); + EXPECT_EQ(256 * 2, a.getCapacity()); + a.squeeze(); + EXPECT_EQ(2, a.size()); + EXPECT_EQ(2 * 2, a.getCapacity()); } - EXPECT_TRUE(isEqualTo(a, { { 0, 0 }, { 1, 1 }, { 2, 2 }, { 3, 3 }, { 4, 4 }, { 5, 5 }, { 6, 6 }, { 7, 7 }, { 8, 8 }, { 9, 9 } })); - // Odd ... reserves takes n rather than n * components as input - // result capacity is increased to n*components... - a.reserve(256); - EXPECT_EQ(256 * 2, a.getCapacity()); - EXPECT_EQ(10, a.size()); - a.reserve(100); - EXPECT_EQ(100 * 2, a.getCapacity()); - EXPECT_EQ(10, a.size()); - // Doesn't work as expected - // a.squeeze(); - // EXPECT_EQ(10, a.getCapacity()); - // EXPECT_EQ(10, a.size()); } TEST(imstkVecDataArrayTest, Iterators) @@ -163,11 +177,21 @@ TEST(imstkVecDataArrayTest, Iterators) } } -TEST(imstkVecDataArrayTest, constructorCast) +TEST(imstkVecDataArrayTest, ConstructorCast) { - VecDataArray<long, 2> a{ Vec2i{1,2}, {3,4} }; - EXPECT_EQ(Vec2i(1,2), a[0].cast<int>()); + VecDataArray<long, 2> a{ Vec2i{ 1, 2 }, { 3, 4 } }; + EXPECT_EQ(Vec2i(1, 2), a[0].cast<int>()); +} +TEST(imstkVecDataArrayTest, Erase) +{ + VecDataArray<int, 2> a { imstk::Vec2i{ 1, 1 }, { 2, 2 }, { 3, 3 } }; + a.erase(1); + EXPECT_TRUE(isEqualTo(a, { imstk::Vec2i{ 1, 1, }, { 3, 3 } })); + a.erase(1); + EXPECT_TRUE(isEqualTo(a, { imstk::Vec2i{ 1, 1, } })); + a.erase(0); + EXPECT_EQ(0, a.size()); } int diff --git a/Source/Common/imstkDataArray.h b/Source/Common/imstkDataArray.h index e258cd4581a48256833ccc9211611c51af8c84a0..f9f1850788e28f5a412cebcb50d4504341117785 100644 --- a/Source/Common/imstkDataArray.h +++ b/Source/Common/imstkDataArray.h @@ -189,8 +189,14 @@ public: inline void resize(const int size) override { // Can't resize a mapped vector - if (m_mapped || size == m_size) + if (m_mapped) + { + return; + } + + if (size == m_capacity) { + m_size = m_capacity; return; } @@ -242,10 +248,9 @@ public: } const int newSize = m_size + 1; - if (newSize > m_capacity) // If the new size exceeds capacity + if (newSize > m_capacity) // If the new size exceeds capacity { - m_capacity *= 2; - resize(m_capacity); // Conservative/copies values + resize(m_capacity * 2); // Conservative/copies values } m_size = newSize; m_data[newSize - 1] = val; @@ -260,10 +265,9 @@ public: } const int newSize = m_size + 1; - if (newSize > m_capacity) // If the new size exceeds capacity + if (newSize > m_capacity) // If the new size exceeds capacity { - m_capacity *= 2; - resize(m_capacity); // Conservative/copies values + resize(m_capacity * 2); // Conservative/copies values } m_size = newSize; m_data[newSize - 1] = val; @@ -280,15 +284,17 @@ public: /// /// \brief Allocates extra capacity, for the number of values, conservative reallocate /// - inline void reserve(const int size) override + inline void reserve(const int capacity) override { if (m_mapped) { return; } + if (capacity <= m_capacity) { return; } + const int currSize = m_size; - resize(size); // Reallocate + resize(capacity); // Reallocate m_size = currSize; // Keep current size } diff --git a/Source/Common/imstkVecDataArray.h b/Source/Common/imstkVecDataArray.h index c6b4172ad4ba47ae95841d38dd0fbfe11f727fe7..41eaf18f71eac1a85e2d592e73103f44ac059a0c 100644 --- a/Source/Common/imstkVecDataArray.h +++ b/Source/Common/imstkVecDataArray.h @@ -181,7 +181,7 @@ public: inline void resize(const int size) override { // Can't resize a mapped vector - if (DataArray<T>::m_mapped || size == m_vecSize) + if (DataArray<T>::m_mapped || size == m_vecCapacity) { return; } @@ -219,10 +219,9 @@ public: } const int newVecSize = m_vecSize + 1; - if (newVecSize > m_vecCapacity) // If the new size exceeds capacity + if (newVecSize > m_vecCapacity) // If the new size exceeds capacity { - m_vecCapacity *= 2; - VecDataArray::resize(m_vecCapacity); // Conservative/copies values + VecDataArray::resize(m_vecCapacity * 2); // Conservative/copies values } m_vecSize = newVecSize; AbstractDataArray::m_size = newVecSize * N; @@ -238,10 +237,9 @@ public: } const int newVecSize = m_vecSize + 1; - if (newVecSize > m_vecCapacity) // If the new size exceeds capacity + if (newVecSize > m_vecCapacity) // If the new size exceeds capacity { - m_vecCapacity *= 2; - VecDataArray::resize(m_vecCapacity); // Conservative/copies values + VecDataArray::resize(m_vecCapacity * 2); // Conservative/copies values } m_vecSize = newVecSize; AbstractDataArray::m_size = newVecSize * N; @@ -266,6 +264,8 @@ public: return; } + if (size < m_vecCapacity) { return; } + const int currVecSize = m_vecSize; const int currSize = AbstractDataArray::m_size; this->resize(size); // Resize to desired capacity