From 478f2efb3a4840fd8ad73e39aa9ffe4c89c5c1ea Mon Sep 17 00:00:00 2001 From: Chris Elrod Date: Thu, 15 Feb 2024 03:37:10 -0500 Subject: [PATCH] TinyVector resize method, and some tests --- include/Containers/TinyVector.hpp | 9 ++++++++ test/matrix_test.cpp | 36 +++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/include/Containers/TinyVector.hpp b/include/Containers/TinyVector.hpp index 105735f..768772c 100644 --- a/include/Containers/TinyVector.hpp +++ b/include/Containers/TinyVector.hpp @@ -72,6 +72,10 @@ template class TinyVector { invariant(len > 0); --len; } + constexpr auto pop_back_val() -> T { + invariant(len > 0); + return std::move(data.data()[--len]); + } [[nodiscard]] constexpr auto size() const -> ptrdiff_t { ptrdiff_t l = ptrdiff_t(len); invariant(l >= 0); @@ -85,5 +89,10 @@ template class TinyVector { constexpr auto begin() const -> const T * { return data.data(); } constexpr auto end() -> T * { return data.data() + size(); } constexpr auto end() const -> const T * { return data.data() + size(); } + constexpr void resize(L new_size) { + // initialize new data + for (L i = len; i < new_size; ++i) data.data()[i] = T{}; + len = new_size; + } }; } // namespace poly::containers diff --git a/test/matrix_test.cpp b/test/matrix_test.cpp index d364614..8ed9475 100644 --- a/test/matrix_test.cpp +++ b/test/matrix_test.cpp @@ -1,4 +1,5 @@ #include "Alloc/Arena.hpp" +#include "Containers/TinyVector.hpp" #include "Math/Array.hpp" #include "Math/Math.hpp" #include "Math/MatrixDimensions.hpp" @@ -310,3 +311,38 @@ TEST(SVectorTest, BasicAssertions) { EXPECT_EQ(b, 22); EXPECT_EQ(c, 33); } +TEST(TinyVectorTest, BasicAssertions) { + poly::containers::TinyVector v{}; + EXPECT_TRUE(v.empty()); + EXPECT_EQ(v.size(), 0); + v.resize(3); + EXPECT_FALSE(v.empty()); + EXPECT_EQ(v.size(), 3); + EXPECT_EQ(v.back(), 0); + v.push_back(2); + EXPECT_EQ(v.size(), 4); + EXPECT_EQ(v.back(), 2); + EXPECT_EQ(v.pop_back_val(), 2); + EXPECT_EQ(v.front(), 0); + EXPECT_EQ(v.back(), 0); + EXPECT_EQ(v.size(), 3); + v.pop_back(); + EXPECT_EQ(v.size(), 2); + v.pop_back(); + EXPECT_FALSE(v.empty()); + EXPECT_EQ(v.size(), 1); + v.pop_back(); + EXPECT_TRUE(v.empty()); + EXPECT_EQ(v.size(), 0); + v.push_back(5); + EXPECT_EQ(v.front(), 5); + EXPECT_EQ(v.back(), 5); + v.push_back(2); + EXPECT_EQ(v.front(), 5); + EXPECT_EQ(v.back(), 2); + v.push_back(21); + EXPECT_EQ(v.back(), 21); + int s = 0; + for (auto x : v) s += x; + EXPECT_EQ(s, 28); +}