From 14e62a41bd7cbd2f0ac0ab45cf94eabe9759c5f4 Mon Sep 17 00:00:00 2001 From: "andrey.bychkov" Date: Fri, 27 Feb 2026 00:41:51 +0300 Subject: [PATCH] Add Index access methods and validation functions to PIVector2D - Add operator[], element(), and at() overloads for Index struct - Add isValid() and isNotValid() methods to Index - Add default initialization to -1 (invalid state) - Add parameterized constructor Index(row, col) - Add tests for new functionality --- libs/main/containers/pivector2d.h | 10 ++++++++-- tests/math/testpivector2d.cpp | 33 +++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/libs/main/containers/pivector2d.h b/libs/main/containers/pivector2d.h index d6b49e22..dbc80322 100644 --- a/libs/main/containers/pivector2d.h +++ b/libs/main/containers/pivector2d.h @@ -55,8 +55,14 @@ public: //! \~english Index structure for 2D array elements (row, column). //! \~russian Структура индекса для элементов двумерного массива (строка, столбец). struct Index { - ssize_t row; - ssize_t col; + ssize_t row = -1; + ssize_t col = -1; + + inline Index() = default; + inline Index(ssize_t r, ssize_t c): row(r), col(c) {} + + inline bool isValid() const { return row >= 0 && col >= 0; } + inline bool isNotValid() const { return !isValid(); } }; //! \~english Constructs an empty 2D array. No memory is allocated. diff --git a/tests/math/testpivector2d.cpp b/tests/math/testpivector2d.cpp index d680c989..0b47aac5 100644 --- a/tests/math/testpivector2d.cpp +++ b/tests/math/testpivector2d.cpp @@ -1489,3 +1489,36 @@ TEST_F(Vector2DTest, index_structure_with_brace_initialization_works) { vec[{static_cast(ROWS_COUNT_INIT - 1), static_cast(COLS_COUNT_INIT - 1)}] = 200; EXPECT_EQ(vec.element(ROWS_COUNT_INIT - 1, COLS_COUNT_INIT - 1), 200); } + +TEST(Vector2DIndexTest, default_constructor_initializes_to_invalid) { + PIVector2D::Index idx; + EXPECT_TRUE(idx.isNotValid()); + EXPECT_FALSE(idx.isValid()); + EXPECT_EQ(idx.row, -1); + EXPECT_EQ(idx.col, -1); +} + +TEST(Vector2DIndexTest, parameterized_constructor_initializes_correctly) { + PIVector2D::Index idx(5, 10); + EXPECT_TRUE(idx.isValid()); + EXPECT_FALSE(idx.isNotValid()); + EXPECT_EQ(idx.row, 5); + EXPECT_EQ(idx.col, 10); +} + +TEST(Vector2DIndexTest, isValid_returns_true_for_non_negative_values) { + PIVector2D::Index idx(0, 0); + EXPECT_TRUE(idx.isValid()); + EXPECT_FALSE(idx.isNotValid()); +} + +TEST(Vector2DIndexTest, isNotValid_returns_true_for_negative_values) { + PIVector2D::Index idx1; + EXPECT_TRUE(idx1.isNotValid()); + + PIVector2D::Index idx2(-1, 5); + EXPECT_TRUE(idx2.isNotValid()); + + PIVector2D::Index idx3(5, -1); + EXPECT_TRUE(idx3.isNotValid()); +}