From 127935086c21244c381d08ab69f5ec0eecd100a7 Mon Sep 17 00:00:00 2001 From: andrey Date: Tue, 7 Sep 2021 17:29:24 +0300 Subject: [PATCH] PIVector: any, every, indexWhere, lastIndexWhere start arg in indexOf, entries, lastIndexOf and some code brush --- libs/main/containers/pivector.h | 87 ++++++++++++++++++++++++++------- main.cpp | 10 ++++ 2 files changed, 80 insertions(+), 17 deletions(-) diff --git a/libs/main/containers/pivector.h b/libs/main/containers/pivector.h index 6acf6ba7..dd8c213d 100644 --- a/libs/main/containers/pivector.h +++ b/libs/main/containers/pivector.h @@ -175,6 +175,18 @@ public: inline size_t capacity() const {return piv_rsize;} inline bool isEmpty() const {return (piv_size == 0);} inline bool isNotEmpty() const {return (piv_size > 0);} + inline bool any(std::function test) const { + for (uint i = 0; i < piv_size; ++i) { + if (test(piv_data[i])) return true; + } + return false; + } + inline bool every(std::function test) const { + for (uint i = 0; i < piv_size; ++i) { + if (!test(piv_data[i])) return false; + } + return true; + } inline T & operator [](size_t index) {return piv_data[index];} inline const T & operator [](size_t index) const {return piv_data[index];} @@ -184,48 +196,87 @@ public: inline T & front() {return piv_data[0];} inline const T & front() const {return piv_data[0];} inline bool operator ==(const PIVector & t) const { - if (piv_size != t.piv_size) + if (piv_size != t.piv_size) { return false; - for (size_t i = 0; i < piv_size; ++i) - if (t[i] != piv_data[i]) + } + for (size_t i = 0; i < piv_size; ++i) { + if (t[i] != piv_data[i]) { return false; + } + } return true; } inline bool operator !=(const PIVector & t) const {return !(*this == t);} inline bool operator <(const PIVector & t) const { if (piv_size != t.piv_size) return piv_size < t.piv_size; - for (size_t i = 0; i < piv_size; ++i) + 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) const { if (piv_size != t.piv_size) return piv_size > t.piv_size; - for (size_t i = 0; i < piv_size; ++i) + for (size_t i = 0; i < piv_size; ++i) { if ((*this)[i] != t[i]) return (*this)[i] > t[i]; + } return false; } inline bool contains(const T & v) const { - for (size_t i = 0; i < piv_size; ++i) - if (v == piv_data[i]) + for (size_t i = 0; i < piv_size; ++i) { + if (v == piv_data[i]) { return true; + } + } return false; } - inline int etries(const T & v) const { + inline int etries(const T & v, size_t start = 0) const { int ec = 0; - for (size_t i = 0; i < piv_size; ++i) + for (size_t i = start; i < piv_size; ++i) { if (v == piv_data[i]) ++ec; + } return ec; } - inline ssize_t indexOf(const T & v) const { - for (size_t i = 0; i < piv_size; ++i) - if (v == piv_data[i]) + inline int etries(std::function test, size_t start = 0) const { + int ec = 0; + for (size_t i = start; i < piv_size; ++i) { + if (test(piv_data[i])) ++ec; + } + return ec; + } + inline ssize_t indexOf(const T & v, size_t start = 0) const { + for (size_t i = start; i < piv_size; ++i) { + if (v == piv_data[i]) { return i; + } + } return -1; } - inline ssize_t lastIndexOf(const T & v) const { - for (ssize_t i = piv_size - 1; i >= 0; --i) - if (v == piv_data[i]) + inline ssize_t indexWhere(std::function test, size_t start = 0) const { + for (size_t i = start; i < piv_size; ++i) { + if (test(piv_data[i])) { return i; + } + } + return -1; + } + inline ssize_t lastIndexOf(const T & v, ssize_t start = -1) const { + if (start < 0) start = piv_size - 1; + else start = piMin(piv_size - 1, start); + for (ssize_t i = start; i >= 0; --i) { + if (v == piv_data[i]) { + return i; + } + } + return -1; + } + inline ssize_t lastIndexWhere(std::function test, ssize_t start = -1) const { + if (start < 0) start = piv_size - 1; + else start = piMin(piv_size - 1, start); + for (ssize_t i = start; i >= 0; --i) { + if (test(piv_data[i])) { + return i; + } + } return -1; } @@ -251,15 +302,17 @@ public: inline PIVector & fill(const T & f = T()) { deleteT(piv_data, piv_size); PIINTROSPECTION_CONTAINER_USED(T, piv_size) - for (size_t i = 0; i < piv_size; ++i) + for (size_t i = 0; i < piv_size; ++i) { elementNew(piv_data + i, f); + } return *this; } inline PIVector & fill(std::function f) { deleteT(piv_data, piv_size); PIINTROSPECTION_CONTAINER_USED(T, piv_size) - for (size_t i = 0; i < piv_size; ++i) + for (size_t i = 0; i < piv_size; ++i) { elementNew(piv_data + i, f(i)); + } return *this; } inline PIVector & assign(const T & f = T()) {return fill(f);} diff --git a/main.cpp b/main.cpp index 78eae1d2..d470a6b0 100644 --- a/main.cpp +++ b/main.cpp @@ -2,6 +2,16 @@ int main(int argc, char * argv[]) { + PIVector x(20, [](int i) {return i/2+1;}); + piCout << x; + piCout << x.any([](int v) {return v == 20;}); + piCout << x.every([](int v) {return v > 0;}); + piCout << x.etries([](int v) {return v % 5 == 0;}); + piCout << x.indexWhere([](int v) {return v % 8 == 0;}); + piCout << x.indexOf(4, -1); + piCout << x.lastIndexOf(1, 0); + piCout << x.lastIndexWhere([](int v) {return v % 8 == 0;}); + return 0; PIByteArray rnd; rnd.resize(1024*1024, 'x'); PICLI cli(argc, argv);