PIVector2D - add funcs, optimize, tests, fixes, doxygen #194
@@ -46,7 +46,7 @@ ctest --test-dir build/tests -R "TestName"
|
|||||||
### Other Commands
|
### Other Commands
|
||||||
```bash
|
```bash
|
||||||
cmake --build build --target clean # Clean build
|
cmake --build build --target clean # Clean build
|
||||||
cmake --install build_pip # Install
|
cmake --install build_pip # Install
|
||||||
cmake --build build --target doc # Build documentation
|
cmake --build build --target doc # Build documentation
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -160,3 +160,7 @@ TEST(PIString_Tests, constructor_empty) {
|
|||||||
### Key Files
|
### Key Files
|
||||||
- `CMakeLists.txt` - Main build configuration
|
- `CMakeLists.txt` - Main build configuration
|
||||||
- `tests/CMakeLists.txt` - Test configuration
|
- `tests/CMakeLists.txt` - Test configuration
|
||||||
|
|
||||||
|
|
||||||
|
## Lint/Format Commands
|
||||||
|
- For formatting, use clang-format with .clang-format in repo root
|
||||||
|
|||||||
@@ -180,6 +180,323 @@ public:
|
|||||||
//! \sa isEmpty(), PIVector::isNotEmpty()
|
//! \sa isEmpty(), PIVector::isNotEmpty()
|
||||||
inline bool isNotEmpty() const { return mat.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<T>;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
inline RowConst(const PIVector2D<T> * p, size_t row): p_(&(p->mat)) {
|
||||||
|
st_ = p->cols_ * row;
|
||||||
|
sz_ = p->cols_;
|
||||||
|
}
|
||||||
|
const PIVector<T> * p_;
|
||||||
|
size_t st_, sz_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
inline RowConst(const PIVector2D<T>::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<T> toVector() const { return PIVector<T>(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<bool(const T & e)> 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<bool(const T & e)> 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<void(const T &)> 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<bool(const T & e)> 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<bool(const T & e)> 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<bool(const T & e)> 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<T>;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
inline ColConst(const PIVector2D<T> * p, size_t col): p_(&(p->mat)) {
|
||||||
|
step_ = p->cols_;
|
||||||
|
col_ = col;
|
||||||
|
sz_ = p->rows_;
|
||||||
|
}
|
||||||
|
const PIVector<T> * p_;
|
||||||
|
size_t step_, col_, sz_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
inline ColConst(const PIVector2D<T>::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<T> toVector() const {
|
||||||
|
PIVector<T> 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<bool(const T & e)> 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<bool(const T & e)> 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<void(const T &)> 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<bool(const T & e)> 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<bool(const T & e)> 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<bool(const T & e)> test) const {
|
||||||
|
for (size_t i = 0; i < sz_; ++i) {
|
||||||
|
if (!test((*p_)[i * step_ + col_])) return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
//! \class Row
|
//! \class Row
|
||||||
//! \brief
|
//! \brief
|
||||||
@@ -399,6 +716,7 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//! \class Col
|
//! \class Col
|
||||||
//! \brief
|
//! \brief
|
||||||
//! \~english Proxy class representing a single column in a \a PIVector2D for modification.
|
//! \~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<T>;
|
|
||||||
|
|
||||||
private:
|
|
||||||
inline RowConst(const PIVector2D<T> * p, size_t row): p_(&(p->mat)) {
|
|
||||||
st_ = p->cols_ * row;
|
|
||||||
sz_ = p->cols_;
|
|
||||||
}
|
|
||||||
const PIVector<T> * p_;
|
|
||||||
size_t st_, sz_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
inline RowConst(const PIVector2D<T>::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<T> toVector() const { return PIVector<T>(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<bool(const T & e)> 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<bool(const T & e)> 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<void(const T &)> 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<bool(const T & e)> 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<bool(const T & e)> 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<bool(const T & e)> 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<T>;
|
|
||||||
|
|
||||||
private:
|
|
||||||
inline ColConst(const PIVector2D<T> * p, size_t col): p_(&(p->mat)) {
|
|
||||||
step_ = p->cols_;
|
|
||||||
col_ = col;
|
|
||||||
sz_ = p->rows_;
|
|
||||||
}
|
|
||||||
const PIVector<T> * p_;
|
|
||||||
size_t step_, col_, sz_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
inline ColConst(const PIVector2D<T>::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<T> toVector() const {
|
|
||||||
PIVector<T> 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<bool(const T & e)> 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<bool(const T & e)> 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<void(const T &)> 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<bool(const T & e)> 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<bool(const T & e)> 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<bool(const T & e)> 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.
|
//! \~english Returns a reference to the element at the given row and column.
|
||||||
//! \~russian Возвращает ссылку на элемент по заданной строке и столбцу.
|
//! \~russian Возвращает ссылку на элемент по заданной строке и столбцу.
|
||||||
|
|||||||
Reference in New Issue
Block a user