new caontainers functions
atWhere() lastAtWhere() contains(v) filter(), map(), reduce(), forEach() indexed and reverse variants fix PIDeque reverse for fix insert with move of complex type potential segfault
This commit is contained in:
@@ -748,6 +748,31 @@ public:
|
||||
//! Иначе это приведёт к неопределённому поведению программы и ошибкам памяти.
|
||||
inline const T & at(size_t index) const {return piv_data[index];}
|
||||
|
||||
|
||||
//! \~english Returns the first element of the array that
|
||||
//! passes the test implemented by the provided function `test`
|
||||
//! or `def` if there is no such element.
|
||||
//! \~russian Возвращает первый элемент массива, проходящего по условию,
|
||||
//! заданному в передаваемой функции `test`, или `def` если такого элемента нет.
|
||||
//! \~\sa \a indexWhere()
|
||||
inline const T & atWhere(std::function<bool(const T & e)> test, ssize_t start = 0, const T & def = T()) const {
|
||||
ssize_t i = indexWhere(test, start);
|
||||
if (i < 0) return def;
|
||||
else return at(i);
|
||||
}
|
||||
|
||||
//! \~english Returns the last element of the array that
|
||||
//! passes the test implemented by the provided function `test`
|
||||
//! or `def` if there is no such element.
|
||||
//! \~russian Возвращает последний элемент массива, проходящего по условию,
|
||||
//! заданному в передаваемой функции `test`, или `def` если такого элемента нет.
|
||||
//! \~\sa \a lastIndexWhere()
|
||||
inline const T & lastAtWhere(std::function<bool(const T & e)> test, ssize_t start = -1, const T & def = T()) const {
|
||||
ssize_t i = lastIndexWhere(test, start);
|
||||
if (i < 0) return def;
|
||||
else return at(i);
|
||||
}
|
||||
|
||||
//! \~english Last element.
|
||||
//! \~russian Последний элемент массива.
|
||||
//! \~\details
|
||||
@@ -802,7 +827,7 @@ public:
|
||||
//! возвращается **false**, что означает, что массив даже не просматривается.
|
||||
//! Если индекс является отрицательным числом, он трактуется как смещение с конца массива.
|
||||
//! Если рассчитанный индекс все равно оказывается меньше 0, просматривается весь массив.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу (слева на право).
|
||||
//! Значение по умолчанию равно 0, что означает, что просматривается весь массив.
|
||||
//! \~\code
|
||||
//! PIVector<int> v{1, 2, 3, 4};
|
||||
@@ -829,6 +854,33 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
//! \~english Tests if all elements of `v` exists in the array.
|
||||
//! \~russian Проверяет наличие всех элементов `v` в массиве.
|
||||
//! \~\details
|
||||
//! \~\code
|
||||
//! PIVector<int> v{1, 2, 3, 4};
|
||||
//! piCout << v.contains({1,4}); // true
|
||||
//! piCout << v.contains({1,5}); // false
|
||||
//! \endcode
|
||||
//! \~\sa \a every(), \a any(), \a entries(), \a forEach()
|
||||
inline bool contains(const PIVector<T> & v, ssize_t start = 0) const {
|
||||
if (start < 0) {
|
||||
start = piv_size + start;
|
||||
if (start < 0) start = 0;
|
||||
}
|
||||
for (const T & e : v) {
|
||||
bool c = false;
|
||||
for (size_t i = start; i < piv_size; ++i) {
|
||||
if (e == piv_data[i]) {
|
||||
c = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!c) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//! \~english Count elements equal `e` in the array.
|
||||
//! \~russian Подсчитывает количество элементов, совпадающих с элементом `e` в массиве.
|
||||
//! \~\details
|
||||
@@ -845,7 +897,7 @@ public:
|
||||
//! возвращается 0, что означает, что массив даже не просматривается.
|
||||
//! Если индекс является отрицательным числом, он трактуется как смещение с конца массива.
|
||||
//! Если рассчитанный индекс все равно оказывается меньше 0, просматривается весь массив.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу (слева на право).
|
||||
//! Значение по умолчанию равно 0, что означает, что просматривается весь массив.
|
||||
//! \~\code
|
||||
//! PIVector<int> v{2, 2, 4, 2, 6};
|
||||
@@ -885,7 +937,7 @@ public:
|
||||
//! возвращается 0, что означает, что массив даже не просматривается.
|
||||
//! Если индекс является отрицательным числом, он трактуется как смещение с конца массива.
|
||||
//! Если рассчитанный индекс все равно оказывается меньше 0, просматривается весь массив.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу (слева на право).
|
||||
//! Значение по умолчанию равно 0, что означает, что просматривается весь массив.
|
||||
//! \~\sa \a every(), \a any(), \a contains(), \a forEach(), \a indexWhere()
|
||||
inline int entries(std::function<bool(const T & e)> test, ssize_t start = 0) const {
|
||||
@@ -918,7 +970,7 @@ public:
|
||||
//! возвращается `-1`, что означает, что массив даже не просматривается.
|
||||
//! Если индекс является отрицательным числом, он трактуется как смещение с конца массива.
|
||||
//! Если рассчитанный индекс все равно оказывается меньше 0, просматривается весь массив.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу (слева на право).
|
||||
//! Значение по умолчанию равно 0, что означает, что просматривается весь массив.
|
||||
//! \~\code
|
||||
//! PIVector<int> v{2, 5, 9};
|
||||
@@ -959,7 +1011,7 @@ public:
|
||||
//! возвращается `-1`, что означает, что массив даже не просматривается.
|
||||
//! Если индекс является отрицательным числом, он трактуется как смещение с конца массива.
|
||||
//! Если рассчитанный индекс все равно оказывается меньше 0, просматривается весь массив.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу (слева на право).
|
||||
//! Значение по умолчанию равно 0, что означает, что просматривается весь массив.
|
||||
//! \~\code
|
||||
//! PIVector<PIString> v{"do", "re", "mi", "re"};
|
||||
@@ -999,7 +1051,7 @@ public:
|
||||
//! c которого начинать поиск в обратном направлении.
|
||||
//! Если индекс больше или равен длине массива, просматривается весь массив.
|
||||
//! Если индекс является отрицательным числом, он трактуется как смещение с конца массива.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от конца к началу.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от конца к началу (справа на лево).
|
||||
//! Если рассчитанный индекс оказывается меньше 0, массив даже не просматривается.
|
||||
//! Значение по умолчанию равно `-1`, что равно индексу последнего элемента
|
||||
//! и означает, что просматривается весь массив.
|
||||
@@ -1042,7 +1094,7 @@ public:
|
||||
//! c которого начинать поиск в обратном направлении.
|
||||
//! Если индекс больше или равен длине массива, просматривается весь массив.
|
||||
//! Если индекс является отрицательным числом, он трактуется как смещение с конца массива.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от конца к началу.
|
||||
//! Обратите внимание: если индекс отрицателен, массив всё равно просматривается от конца к началу (справа на лево).
|
||||
//! Если рассчитанный индекс оказывается меньше 0, массив даже не просматривается.
|
||||
//! Значение по умолчанию равно `-1`, что равно индексу последнего элемента
|
||||
//! и означает, что просматривается весь массив.
|
||||
@@ -1972,6 +2024,39 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
//! \~english Same as \a filter() but with `index` parameter in `test`.
|
||||
//! \~russian Аналогично \a filter() но с параметром индекса `index` в функции `test`.
|
||||
//! \~\sa \a filter()
|
||||
inline PIVector<T> filterIndexed(std::function<bool(size_t index, const T & e)> test) const {
|
||||
PIVector<T> ret;
|
||||
for (size_t i = 0; i < piv_size; ++i) {
|
||||
if (test(i, piv_data[i])) ret << piv_data[i];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//! \~english Same as \a filter() but from end to begin (from right to left).
|
||||
//! \~russian Аналогично \a filter() но от конца до начала (справа на лево).
|
||||
//! \~\sa \a filter()
|
||||
inline PIVector<T> filterReverse(std::function<bool(const T & e)> test) const {
|
||||
PIVector<T> ret;
|
||||
for (ssize_t i = piv_size; i >= 0; --i) {
|
||||
if (test(piv_data[i])) ret << piv_data[i];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//! \~english Same as \a filterReverse() but with `index` parameter in `test`.
|
||||
//! \~russian Аналогично \a filterReverse() но с параметром индекса `index` в функции `test`.
|
||||
//! \~\sa \a filterReverse()
|
||||
inline PIVector<T> filterReverseIndexed(std::function<bool(size_t index, const T & e)> test) const {
|
||||
PIVector<T> ret;
|
||||
for (ssize_t i = piv_size; i >= 0; --i) {
|
||||
if (test(i, piv_data[i])) ret << piv_data[i];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//! \~english Execute function `void f(const T & e)` for every element in array.
|
||||
//! \~russian Выполняет функцию `void f(const T & e)` для каждого элемента массива.
|
||||
//! \~\details
|
||||
@@ -2012,6 +2097,63 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
//! \~english Same as \a forEach() but with `index` parameter in `f`.
|
||||
//! \~russian Аналогично \a forEach() но с параметром индекса `index` в функции `f`.
|
||||
//! \~\sa \a forEach()
|
||||
inline void forEachIndexed(std::function<void(size_t index, const T & e)> f) const {
|
||||
for (size_t i = 0; i < piv_size; ++i) {
|
||||
f(i, piv_data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
//! \~english Same as \a forEachIndexed(), but allows you to change the elements of the array.
|
||||
//! \~russian Аналогично \a forEachIndexed(), но позволяет изменять элементы массива.
|
||||
//! \~\sa \a forEach(), \a forEachIndexed()
|
||||
inline PIVector<T> & forEachIndexed(std::function<void(size_t index, T & e)> f) {
|
||||
for (size_t i = 0; i < piv_size; ++i) {
|
||||
f(i, piv_data[i]);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
//! \~english Same as \a forEach() but from end to begin (from right to left).
|
||||
//! \~russian Аналогично \a forEach() но от конца до начала (справа на лево).
|
||||
//! \~\sa \a forEach()
|
||||
inline void forEachReverse(std::function<void(const T & e)> f) const {
|
||||
for (ssize_t i = piv_size; i >= 0; --i) {
|
||||
f(piv_data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
//! \~english Same as \a forEachReverse(), but allows you to change the elements of the array.
|
||||
//! \~russian Аналогично \a forEachReverse(), но позволяет изменять элементы массива.
|
||||
//! \~\sa \a forEach(), \a forEachReverse()
|
||||
inline PIVector<T> & forEachReverse(std::function<void(T & e)> f) {
|
||||
for (ssize_t i = piv_size; i >= 0; --i) {
|
||||
f(piv_data[i]);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
//! \~english Same as \a forEachIndexed() but from end to begin (from right to left).
|
||||
//! \~russian Аналогично \a forEachIndexed() но от конца до начала (справа на лево).
|
||||
//! \~\sa \a forEachIndexed(), \a forEachReverse(), \a forEach()
|
||||
inline void forEachReverseIndexed(std::function<void(size_t index, const T & e)> f) const {
|
||||
for (ssize_t i = piv_size; i >= 0; --i) {
|
||||
f(i, piv_data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
//! \~english Same as \a forEachReverseIndexed(), but allows you to change the elements of the array.
|
||||
//! \~russian Аналогично \a forEachReverseIndexed(), но позволяет изменять элементы массива.
|
||||
//! \~\sa \a forEachReverseIndexed(), \a forEachIndexed(), \a forEachReverse(), \a forEach()
|
||||
inline PIVector<T> & forEachReverseIndexed(std::function<void(size_t index, T & e)> f) {
|
||||
for (ssize_t i = piv_size; i >= 0; --i) {
|
||||
f(i, piv_data[i]);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
//! \~english Сreates a new array populated with the results
|
||||
//! of calling a provided function `ST f(const T & e)` on every element in the calling array.
|
||||
//! \~russian Создаёт новый массив с результатом вызова указанной функции
|
||||
@@ -2026,7 +2168,7 @@ public:
|
||||
//! \~\code
|
||||
//! PIVector<int> v{1, 2, 3};
|
||||
//! PIVector<PIString> sl = v.map<PIString>([](const int & i){return PIString::fromNumber(i);});
|
||||
//! piCout << sl; {"1", "2", "3"}
|
||||
//! piCout << sl; // {"1", "2", "3"}
|
||||
//! \endcode
|
||||
//! \~\sa \a forEach(), \a reduce()
|
||||
template <typename ST>
|
||||
@@ -2038,6 +2180,57 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
//! \~english Same as \a map() but with `index` parameter in `f`.
|
||||
//! \~russian Аналогично \a map() но с параметром индекса `index` в функции `f`.
|
||||
//! \~\code
|
||||
//! PIVector<int> v{1, 2, 3};
|
||||
//! PIVector<PIString> sl = v.mapIndexed<PIString>([](size_t index, const int & i){return PIString::fromNumber(index);});
|
||||
//! piCout << sl; // {"0", "1", "2"}
|
||||
//! \endcode
|
||||
//! \~\sa \a map()
|
||||
template <typename ST>
|
||||
inline PIVector<ST> mapIndexed(std::function<ST(size_t index, const T & e)> f) const {
|
||||
PIVector<ST> ret; ret.reserve(piv_size);
|
||||
for (size_t i = 0; i < piv_size; ++i) {
|
||||
ret << f(i, piv_data[i]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//! \~english Same as \a map() but from end to begin (from right to left).
|
||||
//! \~russian Аналогично \a map() но от конца до начала (справа на лево).
|
||||
//! \~\code
|
||||
//! PIVector<int> v{1, 2, 3};
|
||||
//! PIVector<PIString> sl = v.mapReverse<PIString>([](const int & i){return PIString::fromNumber(i);});
|
||||
//! piCout << sl; // {"3", "2", "1"}
|
||||
//! \endcode
|
||||
//! \~\sa \a map()
|
||||
template <typename ST>
|
||||
inline PIVector<ST> mapReverse(std::function<ST(const T & e)> f) const {
|
||||
PIVector<ST> ret; ret.reserve(piv_size);
|
||||
for (ssize_t i = piv_size; i >= 0; --i) {
|
||||
ret << f(piv_data[i]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//! \~english Same as \a mapReverse() but with `index` parameter in `f`.
|
||||
//! \~russian Аналогично \a mapReverse() но с параметром индекса `index` в функции `f`.
|
||||
//! \~\code
|
||||
//! PIVector<int> v{1, 2, 3};
|
||||
//! PIVector<PIString> sl = v.mapReverseIndexed<PIString>([](size_t index, const int & i){return PIString::fromNumber(index);});
|
||||
//! piCout << sl; // {"2", "1", "0"}
|
||||
//! \endcode
|
||||
//! \~\sa \a mapReverse()
|
||||
template <typename ST>
|
||||
inline PIVector<ST> mapReverseIndexed(std::function<ST(size_t index, const T & e)> f) const {
|
||||
PIVector<ST> ret; ret.reserve(piv_size);
|
||||
for (ssize_t i = piv_size; i >= 0; --i) {
|
||||
ret << f(i, piv_data[i]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//! \~english Applies the function `ST f(const T & e, const ST & acc)`
|
||||
//! to each element of the array (from left to right), returns one value.
|
||||
//! \~russian Применяет функцию `ST f(const T & e, const ST & acc)`
|
||||
@@ -2088,6 +2281,42 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
//! \~english Same as \a reduce() but with `index` parameter in `f`.
|
||||
//! \~russian Аналогично \a reduce() но с параметром индекса `index` в функции `f`.
|
||||
//! \~\sa \a reduce()
|
||||
template <typename ST>
|
||||
inline ST reduceIndexed(std::function<ST(size_t index, const T & e, const ST & acc)> f, const ST & initial = ST()) const {
|
||||
ST ret(initial);
|
||||
for (size_t i = 0; i < piv_size; ++i) {
|
||||
ret = f(i, piv_data[i], ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//! \~english Same as \a reduce() but from end to begin (from right to left).
|
||||
//! \~russian Аналогично \a reduce() но от конца до начала (справа на лево).
|
||||
//! \~\sa \a reduce()
|
||||
template <typename ST>
|
||||
inline ST reduceReverse(std::function<ST(const T & e, const ST & acc)> f, const ST & initial = ST()) const {
|
||||
ST ret(initial);
|
||||
for (ssize_t i = piv_size; i >= 0; --i) {
|
||||
ret = f(piv_data[i], ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//! \~english Same as \a reduceReverse() but with `index` parameter in `f`.
|
||||
//! \~russian Аналогично \a reduceReverse() но с параметром индекса `index` в функции `f`.
|
||||
//! \~\sa \a reduceReverse()
|
||||
template <typename ST>
|
||||
inline ST reduceReverseIndexed(std::function<ST(size_t index, const T & e, const ST & acc)> f, const ST & initial = ST()) const {
|
||||
ST ret(initial);
|
||||
for (ssize_t i = piv_size; i >= 0; --i) {
|
||||
ret = f(i, piv_data[i], ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//! \~english Changes the dimension of the array, creates a two-dimensional array from a one-dimensional array.
|
||||
//! \~russian Изменяет размерность массива, из одномерного массива создает двухмерный.
|
||||
//! \~\details
|
||||
@@ -2249,7 +2478,7 @@ private:
|
||||
template<typename T1 = T, typename std::enable_if<
|
||||
!std::is_trivially_copyable<T1>::value
|
||||
, int>::type = 0>
|
||||
inline void elementNew(T * to, T && from) {new(to)T(std::move(from));}
|
||||
inline void elementNew(T * to, T && from) {new(to)T(from);}
|
||||
template<typename T1 = T, typename std::enable_if<
|
||||
std::is_trivially_copyable<T1>::value
|
||||
, int>::type = 0>
|
||||
|
||||
Reference in New Issue
Block a user