picontainers doc, PIVector doc
This commit is contained in:
@@ -11,7 +11,7 @@
|
||||
//! \~russian
|
||||
//! Иван Пелипенко peri4ko@yandex.ru;
|
||||
//! Андрей Бычков work.a.b@yandex.ru;
|
||||
//! \~\} */
|
||||
//! \~\}
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Sequence linear container aka dynamic size array of any type
|
||||
@@ -130,8 +130,7 @@ public:
|
||||
//! \~\details
|
||||
//! \~\code
|
||||
//! PIVector <int> v{1,2,3};
|
||||
//! piCout << v;
|
||||
//! // {1, 2, 3}
|
||||
//! piCout << v; // {1, 2, 3}
|
||||
//! \endcode
|
||||
inline PIVector(std::initializer_list<T> init_list): piv_data(0), piv_size(0), piv_rsize(0) {
|
||||
PIINTROSPECTION_CONTAINER_NEW(T, sizeof(T))
|
||||
@@ -155,8 +154,7 @@ public:
|
||||
//! \~russian Позволяет передавать [Лямбда-выражения](https://ru.cppreference.com/w/cpp/language/lambda) для создания элементов в конструкторе.
|
||||
//! \~\code
|
||||
//! PIVector <int> v(5, [](size_t i){return i*2;});
|
||||
//! piCout << v;
|
||||
//! // {0, 2, 4, 6, 8}
|
||||
//! piCout << v; // {0, 2, 4, 6, 8}
|
||||
//! \endcode
|
||||
inline PIVector(size_t size, std::function<T(size_t i)> f): piv_data(0), piv_size(0), piv_rsize(0) {
|
||||
PIINTROSPECTION_CONTAINER_NEW(T, sizeof(T))
|
||||
@@ -284,6 +282,7 @@ public:
|
||||
//!
|
||||
//! \~english If the vector is empty, the returned iterator is equal to \a end.
|
||||
//! \~russian Если массив - пуст, возвращаемый итератор будет равен \a end.
|
||||
//! \~\return \ref stl_iterators
|
||||
//! \~\sa \a end, \a rbegin, \a rend
|
||||
inline iterator begin() {return iterator(this, 0);}
|
||||
|
||||
@@ -292,9 +291,11 @@ public:
|
||||
//! \~russian Итератор на элемент, следующий за последним элементом.
|
||||
//! \~\details 
|
||||
//!
|
||||
//! \~english This element acts as a placeholder; attempting to access it results in undefined behavior.
|
||||
//! \~english This element acts as a placeholder;
|
||||
//! attempting to access it results in undefined behavior.
|
||||
//! \~russian Этот элемент существует лишь условно,
|
||||
//! попытка доступа к нему приведёт к выходу за разрешенную память.
|
||||
//! \~\return \ref stl_iterators
|
||||
//! \~\sa \a begin, \a rbegin, \a rend
|
||||
inline iterator end() {return iterator(this, piv_size);}
|
||||
|
||||
@@ -311,6 +312,7 @@ public:
|
||||
//! \~russian Итератор для прохода массива в обратном порядке.
|
||||
//! Указывает на последний элемент.
|
||||
//! Если массив пустой, то совпадает с итератором \a rend.
|
||||
//! \~\return \ref stl_iterators
|
||||
//! \~\sa \a rend, \a begin, \a end
|
||||
inline reverse_iterator rbegin() {return reverse_iterator(this, piv_size - 1);}
|
||||
|
||||
@@ -325,6 +327,7 @@ public:
|
||||
//! Указывает на элемент, предшествующий первому элементу.
|
||||
//! Этот элемент существует лишь условно,
|
||||
//! попытка доступа к нему приведёт к выходу за разрешенную память.
|
||||
//! \~\return \ref stl_iterators
|
||||
//! \~\sa \a rbegin, \a begin, \a end
|
||||
inline reverse_iterator rend() {return reverse_iterator(this, -1);}
|
||||
|
||||
@@ -382,12 +385,11 @@ public:
|
||||
//! \~russian **true** если хотя бы для одного элемента передаваемая функция возвращает **true**,
|
||||
//! в остальных случаях **false**.
|
||||
//! Метод возвращает **false** при любом условии для пустого массива.
|
||||
//! \~\details
|
||||
//! \~\code
|
||||
//! PIVector<int> v{1, 2, 8, 9};
|
||||
//! piCout << v.any([](int e){return e % 2 == 0;});
|
||||
//! // true
|
||||
//! piCout << v.any([](int e){return e == 3;});
|
||||
//! // false
|
||||
//! piCout << v.any([](int e){return e % 2 == 0;}); // true
|
||||
//! piCout << v.any([](int e){return e == 3;}); // false
|
||||
//! \endcode
|
||||
//! \~\sa \a every, \a contains, \a etries, \a forEach
|
||||
inline bool any(std::function<bool(const T & e)> test) const {
|
||||
@@ -406,12 +408,11 @@ public:
|
||||
//! \~russian **true** если для всех элементов передаваемая функция возвращает **true**,
|
||||
//! в остальных случаях **false**.
|
||||
//! Метод возвращает **true** при любом условии для пустого массива.
|
||||
//! \~\details
|
||||
//! \~\code
|
||||
//! PIVector<int> v{1, 2, 8, 9};
|
||||
//! piCout << v.every([](int e){return e % 2 == 0;});
|
||||
//! // false
|
||||
//! piCout << v.every([](int e){return e > 0;});
|
||||
//! // true
|
||||
//! piCout << v.every([](int e){return e % 2 == 0;}); // false
|
||||
//! piCout << v.every([](int e){return e > 0;}); // true
|
||||
//! \endcode
|
||||
//! \~\sa \a any, \a contains, \a entries, \a forEach
|
||||
inline bool every(std::function<bool(const T & e)> test) const {
|
||||
@@ -433,11 +434,9 @@ public:
|
||||
//! Иначе это приведёт к неопределённому поведению программы и ошибкам памяти.
|
||||
//! \~\code
|
||||
//! PIVector<int> v{1, 2, 8, 9};
|
||||
//! piCout << v[2];
|
||||
//! // 8
|
||||
//! piCout << v[2]; // 8
|
||||
//! v[2] = 5;
|
||||
//! piCout << v;
|
||||
//! // 1, 2, 5, 9
|
||||
//! piCout << v; // 1, 2, 5, 9
|
||||
//! \endcode
|
||||
//! \~\sa \a at
|
||||
inline T & operator [](size_t index) {return piv_data[index];}
|
||||
@@ -501,78 +500,141 @@ public:
|
||||
//! \~russian Оператор сравнения с массивом `t`.
|
||||
inline bool operator !=(const PIVector<T> & t) const {return !(*this == t);}
|
||||
|
||||
inline bool operator <(const PIVector<T> & t) const {
|
||||
if (piv_size != t.piv_size) return piv_size < t.piv_size;
|
||||
for (size_t i = 0; i < piv_size; ++i) {
|
||||
if ((*this)[i] != t[i]) return (*this)[i] < t[i];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
inline bool operator >(const PIVector<T> & t) const {
|
||||
if (piv_size != t.piv_size) return piv_size > t.piv_size;
|
||||
for (size_t i = 0; i < piv_size; ++i) {
|
||||
if ((*this)[i] != t[i]) return (*this)[i] > t[i];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//! \~\brief
|
||||
//! \~english Tests if element `e` exists in the array.
|
||||
//! \~russian Проверяет наличие элемента `e` в массиве.
|
||||
//! \~\details
|
||||
//! \~english Optional argument `start` - the position in this array at which to begin searching.
|
||||
//! If the index is greater than or equal to the array's size,
|
||||
//! **false** is returned, which means the array will not be searched.
|
||||
//! If the provided index value is a negative number,
|
||||
//! it is taken as the offset from the end of the array.
|
||||
//! Note: if the provided index is negative,
|
||||
//! the array is still searched from front to back.
|
||||
//! Default: 0 (entire array is searched).
|
||||
//! \~russian Опциональный аргумент `start` указывает на индекс в массиве, откуда будет начинаться поиск.
|
||||
//! Если индекс больше или равен длине массива,
|
||||
//! возвращается **false**, что означает, что массив даже не просматривается.
|
||||
//! Если индекс является отрицательным числом, он трактуется как смещение с конца массива.
|
||||
//! Если рассчитанный индекс все равно оказывается меньше 0, просматривается весь массив.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу.
|
||||
//! Значение по умолчанию равно 0, что означает, что просматривается весь массив.
|
||||
//! \~\code
|
||||
//! PIVector<int> v{1, 2, 3, 4};
|
||||
//! piCout << v.contains(3); // true
|
||||
//! piCout << v.contains(5); // false
|
||||
//! piCout << v.contains(3, 3); // false
|
||||
//! piCout << v.contains(3, -2); // true
|
||||
//! piCout << v.contains(3, -99); // true
|
||||
//! \endcode
|
||||
//! \~\return
|
||||
//! \~english **true** if the array contains an occurrence of element `e`,
|
||||
//! otherwise it returns **false**.
|
||||
//! \~russian **true** если элемент `e` присутствует в массиве,
|
||||
//! в остальных случаях **false**.
|
||||
//! \~\code
|
||||
//! PIVector<int> v{1, 2, 3, 4};
|
||||
//! piCout << v.contains(3);
|
||||
//! // true
|
||||
//! \endcode
|
||||
//! \~\sa \a every, \a any, \a etries, \a forEach
|
||||
inline bool contains(const T & e) const {
|
||||
for (size_t i = 0; i < piv_size; ++i) {
|
||||
if (e == piv_data[i]) {
|
||||
return true;
|
||||
}
|
||||
inline bool contains(const T & e, ssize_t start = 0) const {
|
||||
if (start < 0) {
|
||||
start = piv_size + start;
|
||||
if (start < 0) start = 0;
|
||||
}
|
||||
for (size_t i = start; i < piv_size; ++i) {
|
||||
if (e == piv_data[i]) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
inline int entries(const T & e, size_t start = 0) const {
|
||||
//! \~\brief
|
||||
//! \~english Count elements equal `e` in the array.
|
||||
//! \~russian Подсчитывает количество элементов, совпадающих с элементом `e` в массиве.
|
||||
//! \~\details
|
||||
//! \~english Optional argument `start` - the position in this array at which to begin searching.
|
||||
//! If the index is greater than or equal to the array's size,
|
||||
//! 0 is returned, which means the array will not be searched.
|
||||
//! If the provided index value is a negative number,
|
||||
//! it is taken as the offset from the end of the array.
|
||||
//! Note: if the provided index is negative,
|
||||
//! the array is still searched from front to back.
|
||||
//! Default: 0 (entire array is searched).
|
||||
//! \~russian Опциональный аргумент `start` указывает на индекс в массиве, откуда будет начинаться поиск.
|
||||
//! Если индекс больше или равен длине массива,
|
||||
//! возвращается 0, что означает, что массив даже не просматривается.
|
||||
//! Если индекс является отрицательным числом, он трактуется как смещение с конца массива.
|
||||
//! Если рассчитанный индекс все равно оказывается меньше 0, просматривается весь массив.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу.
|
||||
//! Значение по умолчанию равно 0, что означает, что просматривается весь массив.
|
||||
//! \~\code
|
||||
//! PIVector<int> v{2, 2, 4, 2, 6};
|
||||
//! piCout << v.entries(2); // 3
|
||||
//! piCout << v.entries(2, 2); // 1
|
||||
//! piCout << v.entries(2, -4); // 2
|
||||
//! \endcode
|
||||
//! \~\sa \a every, \a any, \a contains, \a forEach
|
||||
inline int entries(const T & e, ssize_t start = 0) const {
|
||||
int ec = 0;
|
||||
if (start >= piv_size) return ec;
|
||||
if (start < 0) {
|
||||
start = piv_size + start;
|
||||
if (start < 0) start = 0;
|
||||
}
|
||||
for (size_t i = start; i < piv_size; ++i) {
|
||||
if (e == piv_data[i]) ++ec;
|
||||
}
|
||||
return ec;
|
||||
}
|
||||
|
||||
inline int entries(std::function<bool(const T & e)> test, size_t start = 0) const {
|
||||
//! \~\brief
|
||||
//! \~english Count elements in the array passes the test implemented by the provided function `test`.
|
||||
//! \~russian Подсчитывает количество элементов в массиве, проходящих по условию, заданному в передаваемой функции `test`.
|
||||
//! \~\details
|
||||
//! \~english Overloaded function.
|
||||
//! Optional argument `start` - the position in this array at which to begin searching.
|
||||
//! If the index is greater than or equal to the array's size,
|
||||
//! 0 is returned, which means the array will not be searched.
|
||||
//! If the provided index value is a negative number,
|
||||
//! it is taken as the offset from the end of the array.
|
||||
//! Note: if the provided index is negative,
|
||||
//! the array is still searched from front to back.
|
||||
//! Default: 0 (entire array is searched).
|
||||
//! \~russian Перегруженная функция.
|
||||
//! Опциональный аргумент `start` указывает на индекс в массиве, откуда будет начинаться поиск.
|
||||
//! Если индекс больше или равен длине массива,
|
||||
//! возвращается 0, что означает, что массив даже не просматривается.
|
||||
//! Если индекс является отрицательным числом, он трактуется как смещение с конца массива.
|
||||
//! Если рассчитанный индекс все равно оказывается меньше 0, просматривается весь массив.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу.
|
||||
//! Значение по умолчанию равно 0, что означает, что просматривается весь массив.
|
||||
//! \~\sa \a every, \a any, \a contains, \a forEach
|
||||
inline int entries(std::function<bool(const T & e)> test, ssize_t start = 0) const {
|
||||
int ec = 0;
|
||||
if (start >= piv_size) return ec;
|
||||
if (start < 0) {
|
||||
start = piv_size + start;
|
||||
if (start < 0) start = 0;
|
||||
}
|
||||
for (size_t i = start; i < piv_size; ++i) {
|
||||
if (test(piv_data[i])) ++ec;
|
||||
}
|
||||
return ec;
|
||||
}
|
||||
|
||||
inline ssize_t indexOf(const T & e, size_t start = 0) const {
|
||||
if (start >= piv_size) return -1;
|
||||
|
||||
inline ssize_t indexOf(const T & e, ssize_t start = 0) const {
|
||||
if (start < 0) {
|
||||
start = piv_size + start;
|
||||
if (start < 0) start = 0;
|
||||
}
|
||||
for (size_t i = start; i < piv_size; ++i) {
|
||||
if (e == piv_data[i]) {
|
||||
return i;
|
||||
}
|
||||
if (e == piv_data[i]) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
inline ssize_t indexWhere(std::function<bool(const T & e)> test, size_t start = 0) const {
|
||||
if (start >= piv_size) return -1;
|
||||
inline ssize_t indexWhere(std::function<bool(const T & e)> test, ssize_t start = 0) const {
|
||||
if (start < 0) {
|
||||
start = piv_size + start;
|
||||
if (start < 0) start = 0;
|
||||
}
|
||||
for (size_t i = start; i < piv_size; ++i) {
|
||||
if (test(piv_data[i])) {
|
||||
return i;
|
||||
}
|
||||
if (test(piv_data[i])) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -581,9 +643,7 @@ public:
|
||||
if (start < 0) start = piv_size - 1;
|
||||
else start = piMin<ssize_t>(piv_size - 1, start);
|
||||
for (ssize_t i = start; i >= 0; --i) {
|
||||
if (e == piv_data[i]) {
|
||||
return i;
|
||||
}
|
||||
if (e == piv_data[i]) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -592,9 +652,7 @@ public:
|
||||
if (start < 0) start = piv_size - 1;
|
||||
else start = piMin<ssize_t>(piv_size - 1, start);
|
||||
for (ssize_t i = start; i >= 0; --i) {
|
||||
if (test(piv_data[i])) {
|
||||
return i;
|
||||
}
|
||||
if (test(piv_data[i])) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user