From 91b20467a7399b378f1a047db9ac1cd833aaa51a Mon Sep 17 00:00:00 2001 From: "andrey.bychkov" Date: Thu, 26 Feb 2026 21:29:30 +0300 Subject: [PATCH] pivector2d move implement Row and Col --- AGENTS.md | 6 +- libs/main/containers/pivector2d.h | 628 +++++++++++++++--------------- 2 files changed, 323 insertions(+), 311 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 59d1eedd..8a65e260 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -46,7 +46,7 @@ ctest --test-dir build/tests -R "TestName" ### Other Commands ```bash cmake --build build --target clean # Clean build -cmake --install build_pip # Install +cmake --install build_pip # Install cmake --build build --target doc # Build documentation ``` @@ -160,3 +160,7 @@ TEST(PIString_Tests, constructor_empty) { ### Key Files - `CMakeLists.txt` - Main build configuration - `tests/CMakeLists.txt` - Test configuration + + +## Lint/Format Commands +- For formatting, use clang-format with .clang-format in repo root diff --git a/libs/main/containers/pivector2d.h b/libs/main/containers/pivector2d.h index f30b2bcd..72199c03 100644 --- a/libs/main/containers/pivector2d.h +++ b/libs/main/containers/pivector2d.h @@ -180,6 +180,323 @@ public: //! \sa isEmpty(), PIVector::isNotEmpty() inline bool isNotEmpty() const { return mat.isNotEmpty(); } + class RowConst; + class ColConst; + class Row; + class Col; + + + //! \class RowConst + //! \brief + //! \~english Proxy class representing a single read-only row in a \a PIVector2D. + //! \~russian Прокси-класс, представляющий одну строку в \a PIVector2D только для чтения. + //! \details + //! \~english Returned by const \a operator[] or \a row(). Provides const access to row elements. + //! \~russian Возвращается константными версиями \a operator[] или \a row(). Предоставляет константный доступ к элементам строки. + //! \sa Row, ColConst + class RowConst { + friend class PIVector2D; + + protected: + inline RowConst(const PIVector2D * p, size_t row): p_(&(p->mat)) { + st_ = p->cols_ * row; + sz_ = p->cols_; + } + const PIVector * p_; + size_t st_, sz_; + + public: + inline RowConst(const PIVector2D::Row & r): p_(r.p_) { + st_ = r.st_; + sz_ = r.sz_; + } + + //! \~english Size of the row (number of columns). + //! \~russian Размер строки (количество столбцов). + inline size_t size() const { return sz_; } + + //! \~english Const access to the element at the given column index within the row. + //! \~russian Константный доступ к элементу по заданному индексу столбца в строке. + inline const T & operator[](size_t index) const { return (*p_)[st_ + index]; } + + //! \~english Returns a const pointer to the row data starting at an optional offset. + //! \~russian Возвращает константный указатель на данные строки, начиная с опционального смещения. + inline const T * data(size_t index = 0) const { return p_->data(st_ + index); } + + //! \~english Converts the row to a \a PIVector. + //! \~russian Преобразует строку в \a PIVector. + inline PIVector toVector() const { return PIVector(p_->data(st_), sz_); } + + //! \~english Returns the first index of element `e` in the row, starting from `start`. + //! \~russian Возвращает первый индекс элемента `e` в строке, начиная с позиции `start`. + //! \details + //! \~english See \a PIVector::indexOf() for details on negative start handling. + //! \~russian Подробнее об обработке отрицательного `start` см. \a PIVector::indexOf(). + //! \sa PIVector::indexOf() + inline ssize_t indexOf(const T & e, ssize_t start = 0) const { + if (start < 0) start = 0; + for (size_t i = (size_t)start; i < sz_; ++i) { + if ((*p_)[st_ + i] == e) return (ssize_t)i; + } + return -1; + } + + //! \~english Returns the last index of element `e` in the row, searching backwards from `start`. + //! \~russian Возвращает последний индекс элемента `e` в строке, выполняя поиск в обратном направлении от `start`. + //! \return Index if found, -1 otherwise. + //! \sa PIVector::lastIndexOf() + inline ssize_t lastIndexOf(const T & e, ssize_t start = -1) const { + ssize_t from = (start < 0 || (size_t)start >= sz_) ? (ssize_t)sz_ - 1 : start; + for (ssize_t i = from; i >= 0; --i) { + if ((*p_)[st_ + i] == e) return i; + } + return -1; + } + + //! \~english Returns the first index where the predicate `test` returns true, starting from `start`. + //! \~russian Возвращает первый индекс, для которого предикат `test` возвращает true, начиная с `start`. + //! \sa PIVector::indexWhere() + inline ssize_t indexWhere(std::function test, ssize_t start = 0) const { + if (start < 0) start = 0; + for (size_t i = (size_t)start; i < sz_; ++i) { + if (test((*p_)[st_ + i])) return (ssize_t)i; + } + return -1; + } + + //! \~english Returns the last index where the predicate `test` returns true, searching backwards from `start`. + //! \~russian Возвращает последний индекс, для которого предикат `test` возвращает true, + //! выполняя поиск в обратном направлении от `start`. + //! \sa PIVector::lastIndexWhere() + inline ssize_t lastIndexWhere(std::function test, ssize_t start = -1) const { + ssize_t from = (start < 0 || (size_t)start >= sz_) ? (ssize_t)sz_ - 1 : start; + for (ssize_t i = from; i >= 0; --i) { + if (test((*p_)[st_ + i])) return i; + } + return -1; + } + + //! \~english Applies a function to each element of the row (read-only). + //! \~russian Применяет функцию к каждому элементу строки (только чтение). + //! \details + //! \~english The function can't modify the elements. + //! \~russian Функция не может изменять элементы. + //! \sa forEach (modifiable) + inline void forEach(std::function func) const { + for (size_t i = 0; i < sz_; ++i) { + func((*p_)[st_ + i]); + } + } + + //! \~english Checks if the row contains the element `e`. + //! \~russian Проверяет, содержит ли строка элемент `e`. + //! \sa PIVector::contains() + inline bool contains(const T & e, ssize_t start = 0) const { return indexOf(e, start) != -1; } + + //! \~english Counts occurrences of `e` in the row. + //! \~russian Подсчитывает количество вхождений `e` в строке. + //! \sa PIVector::entries() + inline int entries(const T & e, ssize_t start = 0) const { + if (start < 0) start = 0; + int count = 0; + for (size_t i = (size_t)start; i < sz_; ++i) { + if ((*p_)[st_ + i] == e) ++count; + } + return count; + } + + //! \~english Counts elements in the row that pass the `test`. + //! \~russian Подсчитывает элементы в строке, проходящие `test`. + //! \sa PIVector::entries(std::function) + inline int entries(std::function test, ssize_t start = 0) const { + if (start < 0) start = 0; + int count = 0; + for (size_t i = (size_t)start; i < sz_; ++i) { + if (test((*p_)[st_ + i])) ++count; + } + return count; + } + + //! \~english Tests if any element in the row passes the `test`. + //! \~russian Проверяет, проходит ли какой-либо элемент в строке `test`. + //! \sa PIVector::any() + inline bool any(std::function test) const { + for (size_t i = 0; i < sz_; ++i) { + if (test((*p_)[st_ + i])) return true; + } + return false; + } + + //! \~english Tests if all elements in the row pass the `test`. + //! \~russian Проверяет, проходят ли все элементы в строке `test`. + //! \sa PIVector::every() + inline bool every(std::function test) const { + for (size_t i = 0; i < sz_; ++i) { + if (!test((*p_)[st_ + i])) return false; + } + return true; + } + }; + + + //! \class ColConst + //! \brief + //! \~english Proxy class representing a single read-only column in a \a PIVector2D. + //! \~russian Прокси-класс, представляющий один столбец в \a PIVector2D только для чтения. + //! \details + //! \~english Returned by const \a col(). Provides const access to column elements. + //! \~russian Возвращается константной версией \a col(). Предоставляет константный доступ к элементам столбца. + //! \sa Col, RowConst + class ColConst { + friend class PIVector2D; + + protected: + inline ColConst(const PIVector2D * p, size_t col): p_(&(p->mat)) { + step_ = p->cols_; + col_ = col; + sz_ = p->rows_; + } + const PIVector * p_; + size_t step_, col_, sz_; + + public: + inline ColConst(const PIVector2D::Col & c): p_(c.p_) { + step_ = c.step_; + col_ = c.col_; + sz_ = c.sz_; + } + + //! \~english Size of the column (number of rows). + //! \~russian Размер столбца (количество строк). + inline size_t size() const { return sz_; } + + //! \~english Const access to the element at the given row index within the column. + //! \~russian Константный доступ к элементу по заданному индексу строки в столбце. + inline const T & operator[](size_t index) const { return (*p_)[index * step_ + col_]; } + + //! \~english Returns a const pointer to the column data starting at an optional row offset. + //! \~russian Возвращает константный указатель на данные столбца, начиная с опционального смещения по строкам. + inline const T * data(size_t index = 0) const { return p_->data(index * step_ + col_); } + + //! \~english Converts the column to a \a PIVector. + //! \~russian Преобразует столбец в \a PIVector. + inline PIVector toVector() const { + PIVector ret; + ret.reserve(sz_); + for (size_t i = 0; i < size(); i++) + ret << (*p_)[i * step_ + col_]; + return ret; + } + + //! \~english Returns the first index of element `e` in the row, starting from `start`. + //! \~russian Возвращает первый индекс элемента `e` в строке, начиная с позиции `start`. + //! \details + //! \~english See \a PIVector::indexOf() for details on negative start handling. + //! \~russian Подробнее об обработке отрицательного `start` см. \a PIVector::indexOf(). + //! \sa PIVector::indexOf() + inline ssize_t indexOf(const T & e, ssize_t start = 0) const { + if (start < 0) start = 0; + for (size_t i = (size_t)start; i < sz_; ++i) { + if ((*p_)[i * step_ + col_] == e) return (ssize_t)i; + } + return -1; + } + + //! \~english Returns the last index of element `e` in the row, searching backwards from `start`. + //! \~russian Возвращает последний индекс элемента `e` в строке, выполняя поиск в обратном направлении от `start`. + //! \sa PIVector::lastIndexOf() + inline ssize_t lastIndexOf(const T & e, ssize_t start = -1) const { + ssize_t from = (start < 0 || (size_t)start >= sz_) ? (ssize_t)sz_ - 1 : start; + for (ssize_t i = from; i >= 0; --i) { + if ((*p_)[i * step_ + col_] == e) return i; + } + return -1; + } + + //! \~english Returns the first index where the predicate `test` returns true, starting from `start`. + //! \~russian Возвращает первый индекс, для которого предикат `test` возвращает true, начиная с `start`. + //! \sa PIVector::indexWhere() + inline ssize_t indexWhere(std::function test, ssize_t start = 0) const { + if (start < 0) start = 0; + for (size_t i = (size_t)start; i < sz_; ++i) { + if (test((*p_)[i * step_ + col_])) return (ssize_t)i; + } + return -1; + } + + //! \~english Returns the last index where the predicate `test` returns true, searching backwards from `start`. + //! \~russian Возвращает последний индекс, для которого предикат `test` возвращает true, + //! выполняя поиск в обратном направлении от `start`. + //! \sa PIVector::lastIndexWhere() + inline ssize_t lastIndexWhere(std::function test, ssize_t start = -1) const { + ssize_t from = (start < 0 || (size_t)start >= sz_) ? (ssize_t)sz_ - 1 : start; + for (ssize_t i = from; i >= 0; --i) { + if (test((*p_)[i * step_ + col_])) return i; + } + return -1; + } + + //! \~english Applies a function to each element of the column (read-only). + //! \~russian Применяет функцию к каждому элементу столбца (только чтение). + //! \details + //! \~english The function can't modify the elements. + //! \~russian Функция не может изменять элементы. + //! \sa forEach (modifiable) + inline void forEach(std::function func) const { + for (size_t i = 0; i < sz_; ++i) { + func((*p_)[i * step_ + col_]); + } + } + + //! \~english Checks if the column contains the element `e`. + //! \~russian Проверяет, содержит ли столбец элемент `e`. + //! \sa PIVector::contains() + inline bool contains(const T & e, ssize_t start = 0) const { return indexOf(e, start) != -1; } + + //! \~english Counts occurrences of `e` in the column. + //! \~russian Подсчитывает количество вхождений `e` в столбце. + //! \sa PIVector::entries() + inline int entries(const T & e, ssize_t start = 0) const { + if (start < 0) start = 0; + int count = 0; + for (size_t i = (size_t)start; i < sz_; ++i) { + if ((*p_)[i * step_ + col_] == e) ++count; + } + return count; + } + + //! \~english Counts elements in the column that pass the `test`. + //! \~russian Подсчитывает элементы в столбце, проходящие `test`. + //! \sa PIVector::entries(std::function) + inline int entries(std::function test, ssize_t start = 0) const { + if (start < 0) start = 0; + int count = 0; + for (size_t i = (size_t)start; i < sz_; ++i) { + if (test((*p_)[i * step_ + col_])) ++count; + } + return count; + } + + //! \~english Tests if any element in the column passes the `test`. + //! \~russian Проверяет, проходит ли какой-либо элемент в столбце `test`. + //! \sa PIVector::any() + inline bool any(std::function test) const { + for (size_t i = 0; i < sz_; ++i) { + if (test((*p_)[i * step_ + col_])) return true; + } + return false; + } + + //! \~english Tests if all elements in the column pass the `test`. + //! \~russian Проверяет, проходят ли все элементы в столбце `test`. + //! \sa PIVector::every() + inline bool every(std::function test) const { + for (size_t i = 0; i < sz_; ++i) { + if (!test((*p_)[i * step_ + col_])) return false; + } + return true; + } + }; //! \class Row //! \brief @@ -399,6 +716,7 @@ public: } }; + //! \class Col //! \brief //! \~english Proxy class representing a single column in a \a PIVector2D for modification. @@ -607,316 +925,6 @@ public: } }; - //! \class RowConst - //! \brief - //! \~english Proxy class representing a single read-only row in a \a PIVector2D. - //! \~russian Прокси-класс, представляющий одну строку в \a PIVector2D только для чтения. - //! \details - //! \~english Returned by const \a operator[] or \a row(). Provides const access to row elements. - //! \~russian Возвращается константными версиями \a operator[] или \a row(). Предоставляет константный доступ к элементам строки. - //! \sa Row, ColConst - class RowConst { - friend class PIVector2D; - - private: - inline RowConst(const PIVector2D * p, size_t row): p_(&(p->mat)) { - st_ = p->cols_ * row; - sz_ = p->cols_; - } - const PIVector * p_; - size_t st_, sz_; - - public: - inline RowConst(const PIVector2D::Row & r): p_(r.p_) { - st_ = r.st_; - sz_ = r.sz_; - } - - //! \~english Size of the row (number of columns). - //! \~russian Размер строки (количество столбцов). - inline size_t size() const { return sz_; } - - //! \~english Const access to the element at the given column index within the row. - //! \~russian Константный доступ к элементу по заданному индексу столбца в строке. - inline const T & operator[](size_t index) const { return (*p_)[st_ + index]; } - - //! \~english Returns a const pointer to the row data starting at an optional offset. - //! \~russian Возвращает константный указатель на данные строки, начиная с опционального смещения. - inline const T * data(size_t index = 0) const { return p_->data(st_ + index); } - - //! \~english Converts the row to a \a PIVector. - //! \~russian Преобразует строку в \a PIVector. - inline PIVector toVector() const { return PIVector(p_->data(st_), sz_); } - - //! \~english Returns the first index of element `e` in the row, starting from `start`. - //! \~russian Возвращает первый индекс элемента `e` в строке, начиная с позиции `start`. - //! \details - //! \~english See \a PIVector::indexOf() for details on negative start handling. - //! \~russian Подробнее об обработке отрицательного `start` см. \a PIVector::indexOf(). - //! \sa PIVector::indexOf() - inline ssize_t indexOf(const T & e, ssize_t start = 0) const { - if (start < 0) start = 0; - for (size_t i = (size_t)start; i < sz_; ++i) { - if ((*p_)[st_ + i] == e) return (ssize_t)i; - } - return -1; - } - - //! \~english Returns the last index of element `e` in the row, searching backwards from `start`. - //! \~russian Возвращает последний индекс элемента `e` в строке, выполняя поиск в обратном направлении от `start`. - //! \return Index if found, -1 otherwise. - //! \sa PIVector::lastIndexOf() - inline ssize_t lastIndexOf(const T & e, ssize_t start = -1) const { - ssize_t from = (start < 0 || (size_t)start >= sz_) ? (ssize_t)sz_ - 1 : start; - for (ssize_t i = from; i >= 0; --i) { - if ((*p_)[st_ + i] == e) return i; - } - return -1; - } - - //! \~english Returns the first index where the predicate `test` returns true, starting from `start`. - //! \~russian Возвращает первый индекс, для которого предикат `test` возвращает true, начиная с `start`. - //! \sa PIVector::indexWhere() - inline ssize_t indexWhere(std::function test, ssize_t start = 0) const { - if (start < 0) start = 0; - for (size_t i = (size_t)start; i < sz_; ++i) { - if (test((*p_)[st_ + i])) return (ssize_t)i; - } - return -1; - } - - //! \~english Returns the last index where the predicate `test` returns true, searching backwards from `start`. - //! \~russian Возвращает последний индекс, для которого предикат `test` возвращает true, - //! выполняя поиск в обратном направлении от `start`. - //! \sa PIVector::lastIndexWhere() - inline ssize_t lastIndexWhere(std::function test, ssize_t start = -1) const { - ssize_t from = (start < 0 || (size_t)start >= sz_) ? (ssize_t)sz_ - 1 : start; - for (ssize_t i = from; i >= 0; --i) { - if (test((*p_)[st_ + i])) return i; - } - return -1; - } - - //! \~english Applies a function to each element of the row (read-only). - //! \~russian Применяет функцию к каждому элементу строки (только чтение). - //! \details - //! \~english The function can't modify the elements. - //! \~russian Функция не может изменять элементы. - //! \sa forEach (modifiable) - inline void forEach(std::function func) const { - for (size_t i = 0; i < sz_; ++i) { - func((*p_)[st_ + i]); - } - } - - //! \~english Checks if the row contains the element `e`. - //! \~russian Проверяет, содержит ли строка элемент `e`. - //! \sa PIVector::contains() - inline bool contains(const T & e, ssize_t start = 0) const { return indexOf(e, start) != -1; } - - //! \~english Counts occurrences of `e` in the row. - //! \~russian Подсчитывает количество вхождений `e` в строке. - //! \sa PIVector::entries() - inline int entries(const T & e, ssize_t start = 0) const { - if (start < 0) start = 0; - int count = 0; - for (size_t i = (size_t)start; i < sz_; ++i) { - if ((*p_)[st_ + i] == e) ++count; - } - return count; - } - - //! \~english Counts elements in the row that pass the `test`. - //! \~russian Подсчитывает элементы в строке, проходящие `test`. - //! \sa PIVector::entries(std::function) - inline int entries(std::function test, ssize_t start = 0) const { - if (start < 0) start = 0; - int count = 0; - for (size_t i = (size_t)start; i < sz_; ++i) { - if (test((*p_)[st_ + i])) ++count; - } - return count; - } - - //! \~english Tests if any element in the row passes the `test`. - //! \~russian Проверяет, проходит ли какой-либо элемент в строке `test`. - //! \sa PIVector::any() - inline bool any(std::function test) const { - for (size_t i = 0; i < sz_; ++i) { - if (test((*p_)[st_ + i])) return true; - } - return false; - } - - //! \~english Tests if all elements in the row pass the `test`. - //! \~russian Проверяет, проходят ли все элементы в строке `test`. - //! \sa PIVector::every() - inline bool every(std::function test) const { - for (size_t i = 0; i < sz_; ++i) { - if (!test((*p_)[st_ + i])) return false; - } - return true; - } - }; - - //! \class ColConst - //! \brief - //! \~english Proxy class representing a single read-only column in a \a PIVector2D. - //! \~russian Прокси-класс, представляющий один столбец в \a PIVector2D только для чтения. - //! \details - //! \~english Returned by const \a col(). Provides const access to column elements. - //! \~russian Возвращается константной версией \a col(). Предоставляет константный доступ к элементам столбца. - //! \sa Col, RowConst - class ColConst { - friend class PIVector2D; - - private: - inline ColConst(const PIVector2D * p, size_t col): p_(&(p->mat)) { - step_ = p->cols_; - col_ = col; - sz_ = p->rows_; - } - const PIVector * p_; - size_t step_, col_, sz_; - - public: - inline ColConst(const PIVector2D::Col & c): p_(c.p_) { - step_ = c.step_; - col_ = c.col_; - sz_ = c.sz_; - } - - //! \~english Size of the column (number of rows). - //! \~russian Размер столбца (количество строк). - inline size_t size() const { return sz_; } - - //! \~english Const access to the element at the given row index within the column. - //! \~russian Константный доступ к элементу по заданному индексу строки в столбце. - inline const T & operator[](size_t index) const { return (*p_)[index * step_ + col_]; } - - //! \~english Returns a const pointer to the column data starting at an optional row offset. - //! \~russian Возвращает константный указатель на данные столбца, начиная с опционального смещения по строкам. - inline const T * data(size_t index = 0) const { return p_->data(index * step_ + col_); } - - //! \~english Converts the column to a \a PIVector. - //! \~russian Преобразует столбец в \a PIVector. - inline PIVector toVector() const { - PIVector ret; - ret.reserve(sz_); - for (size_t i = 0; i < size(); i++) - ret << (*p_)[i * step_ + col_]; - return ret; - } - - //! \~english Returns the first index of element `e` in the row, starting from `start`. - //! \~russian Возвращает первый индекс элемента `e` в строке, начиная с позиции `start`. - //! \details - //! \~english See \a PIVector::indexOf() for details on negative start handling. - //! \~russian Подробнее об обработке отрицательного `start` см. \a PIVector::indexOf(). - //! \sa PIVector::indexOf() - inline ssize_t indexOf(const T & e, ssize_t start = 0) const { - if (start < 0) start = 0; - for (size_t i = (size_t)start; i < sz_; ++i) { - if ((*p_)[i * step_ + col_] == e) return (ssize_t)i; - } - return -1; - } - - //! \~english Returns the last index of element `e` in the row, searching backwards from `start`. - //! \~russian Возвращает последний индекс элемента `e` в строке, выполняя поиск в обратном направлении от `start`. - //! \sa PIVector::lastIndexOf() - inline ssize_t lastIndexOf(const T & e, ssize_t start = -1) const { - ssize_t from = (start < 0 || (size_t)start >= sz_) ? (ssize_t)sz_ - 1 : start; - for (ssize_t i = from; i >= 0; --i) { - if ((*p_)[i * step_ + col_] == e) return i; - } - return -1; - } - - //! \~english Returns the first index where the predicate `test` returns true, starting from `start`. - //! \~russian Возвращает первый индекс, для которого предикат `test` возвращает true, начиная с `start`. - //! \sa PIVector::indexWhere() - inline ssize_t indexWhere(std::function test, ssize_t start = 0) const { - if (start < 0) start = 0; - for (size_t i = (size_t)start; i < sz_; ++i) { - if (test((*p_)[i * step_ + col_])) return (ssize_t)i; - } - return -1; - } - - //! \~english Returns the last index where the predicate `test` returns true, searching backwards from `start`. - //! \~russian Возвращает последний индекс, для которого предикат `test` возвращает true, - //! выполняя поиск в обратном направлении от `start`. - //! \sa PIVector::lastIndexWhere() - inline ssize_t lastIndexWhere(std::function test, ssize_t start = -1) const { - ssize_t from = (start < 0 || (size_t)start >= sz_) ? (ssize_t)sz_ - 1 : start; - for (ssize_t i = from; i >= 0; --i) { - if (test((*p_)[i * step_ + col_])) return i; - } - return -1; - } - - //! \~english Applies a function to each element of the column (read-only). - //! \~russian Применяет функцию к каждому элементу столбца (только чтение). - //! \details - //! \~english The function can't modify the elements. - //! \~russian Функция не может изменять элементы. - //! \sa forEach (modifiable) - inline void forEach(std::function func) const { - for (size_t i = 0; i < sz_; ++i) { - func((*p_)[i * step_ + col_]); - } - } - - //! \~english Checks if the column contains the element `e`. - //! \~russian Проверяет, содержит ли столбец элемент `e`. - //! \sa PIVector::contains() - inline bool contains(const T & e, ssize_t start = 0) const { return indexOf(e, start) != -1; } - - //! \~english Counts occurrences of `e` in the column. - //! \~russian Подсчитывает количество вхождений `e` в столбце. - //! \sa PIVector::entries() - inline int entries(const T & e, ssize_t start = 0) const { - if (start < 0) start = 0; - int count = 0; - for (size_t i = (size_t)start; i < sz_; ++i) { - if ((*p_)[i * step_ + col_] == e) ++count; - } - return count; - } - - //! \~english Counts elements in the column that pass the `test`. - //! \~russian Подсчитывает элементы в столбце, проходящие `test`. - //! \sa PIVector::entries(std::function) - inline int entries(std::function test, ssize_t start = 0) const { - if (start < 0) start = 0; - int count = 0; - for (size_t i = (size_t)start; i < sz_; ++i) { - if (test((*p_)[i * step_ + col_])) ++count; - } - return count; - } - - //! \~english Tests if any element in the column passes the `test`. - //! \~russian Проверяет, проходит ли какой-либо элемент в столбце `test`. - //! \sa PIVector::any() - inline bool any(std::function test) const { - for (size_t i = 0; i < sz_; ++i) { - if (test((*p_)[i * step_ + col_])) return true; - } - return false; - } - - //! \~english Tests if all elements in the column pass the `test`. - //! \~russian Проверяет, проходят ли все элементы в столбце `test`. - //! \sa PIVector::every() - inline bool every(std::function test) const { - for (size_t i = 0; i < sz_; ++i) { - if (!test((*p_)[i * step_ + col_])) return false; - } - return true; - } - }; //! \~english Returns a reference to the element at the given row and column. //! \~russian Возвращает ссылку на элемент по заданной строке и столбцу.