PIVector: any, every, indexWhere, lastIndexWhere

start arg in indexOf, entries, lastIndexOf
and some code brush
This commit is contained in:
2021-09-07 17:29:24 +03:00
parent 76ed60edf3
commit 127935086c
2 changed files with 80 additions and 17 deletions

View File

@@ -175,6 +175,18 @@ public:
inline size_t capacity() const {return piv_rsize;} inline size_t capacity() const {return piv_rsize;}
inline bool isEmpty() const {return (piv_size == 0);} inline bool isEmpty() const {return (piv_size == 0);}
inline bool isNotEmpty() const {return (piv_size > 0);} inline bool isNotEmpty() const {return (piv_size > 0);}
inline bool any(std::function<bool(const T &)> test) const {
for (uint i = 0; i < piv_size; ++i) {
if (test(piv_data[i])) return true;
}
return false;
}
inline bool every(std::function<bool(const T &)> 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 T & operator [](size_t index) {return piv_data[index];}
inline const T & operator [](size_t index) const {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 T & front() {return piv_data[0];}
inline const T & front() const {return piv_data[0];} inline const T & front() const {return piv_data[0];}
inline bool operator ==(const PIVector<T> & t) const { inline bool operator ==(const PIVector<T> & t) const {
if (piv_size != t.piv_size) if (piv_size != t.piv_size) {
return false; 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 false;
}
}
return true; return true;
} }
inline bool operator !=(const PIVector<T> & t) const {return !(*this == t);} inline bool operator !=(const PIVector<T> & t) const {return !(*this == t);}
inline bool operator <(const PIVector<T> & t) const { inline bool operator <(const PIVector<T> & t) const {
if (piv_size != t.piv_size) return piv_size < t.piv_size; 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]; if ((*this)[i] != t[i]) return (*this)[i] < t[i];
}
return false; return false;
} }
inline bool operator >(const PIVector<T> & t) const { inline bool operator >(const PIVector<T> & t) const {
if (piv_size != t.piv_size) return piv_size > t.piv_size; 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]; if ((*this)[i] != t[i]) return (*this)[i] > t[i];
}
return false; return false;
} }
inline bool contains(const T & v) const { inline bool contains(const T & v) const {
for (size_t i = 0; i < piv_size; ++i) for (size_t i = 0; i < piv_size; ++i) {
if (v == piv_data[i]) if (v == piv_data[i]) {
return true; return true;
}
}
return false; return false;
} }
inline int etries(const T & v) const { inline int etries(const T & v, size_t start = 0) const {
int ec = 0; 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; if (v == piv_data[i]) ++ec;
}
return ec; return ec;
} }
inline ssize_t indexOf(const T & v) const { inline int etries(std::function<bool(const T &)> test, size_t start = 0) const {
for (size_t i = 0; i < piv_size; ++i) int ec = 0;
if (v == piv_data[i]) 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 i;
}
}
return -1; return -1;
} }
inline ssize_t lastIndexOf(const T & v) const { inline ssize_t indexWhere(std::function<bool(const T &)> test, size_t start = 0) const {
for (ssize_t i = piv_size - 1; i >= 0; --i) for (size_t i = start; i < piv_size; ++i) {
if (v == piv_data[i]) if (test(piv_data[i])) {
return 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<ssize_t>(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<bool(const T &)> test, ssize_t start = -1) const {
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;
}
}
return -1; return -1;
} }
@@ -251,15 +302,17 @@ public:
inline PIVector<T> & fill(const T & f = T()) { inline PIVector<T> & fill(const T & f = T()) {
deleteT(piv_data, piv_size); deleteT(piv_data, piv_size);
PIINTROSPECTION_CONTAINER_USED(T, 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); elementNew(piv_data + i, f);
}
return *this; return *this;
} }
inline PIVector<T> & fill(std::function<T(size_t)> f) { inline PIVector<T> & fill(std::function<T(size_t)> f) {
deleteT(piv_data, piv_size); deleteT(piv_data, piv_size);
PIINTROSPECTION_CONTAINER_USED(T, 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)); elementNew(piv_data + i, f(i));
}
return *this; return *this;
} }
inline PIVector<T> & assign(const T & f = T()) {return fill(f);} inline PIVector<T> & assign(const T & f = T()) {return fill(f);}

View File

@@ -2,6 +2,16 @@
int main(int argc, char * argv[]) { int main(int argc, char * argv[]) {
PIVector<int> 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; PIByteArray rnd;
rnd.resize(1024*1024, 'x'); rnd.resize(1024*1024, 'x');
PICLI cli(argc, argv); PICLI cli(argc, argv);