diff --git a/libs/main/containers/pideque.h b/libs/main/containers/pideque.h index 3bc26c2d..b6ae8777 100644 --- a/libs/main/containers/pideque.h +++ b/libs/main/containers/pideque.h @@ -174,6 +174,7 @@ public: inline size_t capacity() const {return pid_rsize;} inline size_t _start() const {return pid_start;} inline bool isEmpty() const {return (pid_size == 0);} + inline bool isNotEmpty() const {return (pid_size > 0);} inline T & operator [](size_t index) {return pid_data[pid_start + index];} inline const T & operator [](size_t index) const {return pid_data[pid_start + index];} @@ -184,34 +185,41 @@ public: inline const T & front() const {return pid_data[pid_start];} inline bool operator ==(const PIDeque & t) const { if (pid_size != t.pid_size) return false; - for (size_t i = 0; i < pid_size; ++i) - if (t[i] != (*this)[i]) + for (size_t i = 0; i < pid_size; ++i) { + if (t[i] != (*this)[i]) { return false; + } + } return true; } inline bool operator !=(const PIDeque & t) const {return !(*this == t);} inline bool operator <(const PIDeque & t) const { if (pid_size != t.pid_size) return pid_size < t.pid_size; - for (size_t i = 0; i < pid_size; ++i) + for (size_t i = 0; i < pid_size; ++i) { if ((*this)[i] != t[i]) return (*this)[i] < t[i]; + } return false; } inline bool operator >(const PIDeque & t) const { if (pid_size != t.pid_size) return pid_size > t.pid_size; - for (size_t i = 0; i < pid_size; ++i) + for (size_t i = 0; i < pid_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 = pid_start; i < pid_start + pid_size; ++i) - if (v == pid_data[i]) + for (size_t i = pid_start; i < pid_start + pid_size; ++i) { + if (v == pid_data[i]) { return true; + } + } return false; } inline int etries(const T & v) const { int ec = 0; - for (size_t i = pid_start; i < pid_start + pid_size; ++i) + for (size_t i = pid_start; i < pid_start + pid_size; ++i) { if (v == pid_data[i]) ++ec; + } return ec; } inline ssize_t indexOf(const T & v) const { @@ -221,9 +229,11 @@ public: return -1; } inline ssize_t lastIndexOf(const T & v) const { - for (ssize_t i = pid_start + (ssize_t)pid_size - 1; i >= pid_start; --i) - if (v == pid_data[i]) + for (ssize_t i = pid_start + (ssize_t)pid_size - 1; i >= pid_start; --i) { + if (v == pid_data[i]) { return i - pid_start; + } + } return -1; } @@ -250,15 +260,17 @@ public: inline PIDeque & fill(const T & f = T()) { deleteT(pid_data + pid_start, pid_size); PIINTROSPECTION_CONTAINER_USED(T, pid_size) - for (size_t i = pid_start; i < pid_start + pid_size; ++i) + for (size_t i = pid_start; i < pid_start + pid_size; ++i) { elementNew(pid_data + i, f); + } return *this; } inline PIDeque & fill(std::function f) { deleteT(pid_data + pid_start, pid_size); PIINTROSPECTION_CONTAINER_USED(T, pid_size) - for (size_t i = pid_start; i < pid_start + pid_size; ++i) + for (size_t i = pid_start; i < pid_start + pid_size; ++i) { elementNew(pid_data + i, f(i)); + } return *this; } inline PIDeque & assign(const T & f = T()) {return fill(f);} @@ -281,15 +293,17 @@ public: if (new_size < pid_size) { deleteT(&(pid_data[new_size + pid_start]), pid_size - new_size); pid_size = new_size; - if (new_size == 0) + if (new_size == 0) { pid_start = (pid_rsize - pid_size) / 2; + } } if (new_size > pid_size) { size_t os = pid_size; alloc(new_size, true); PIINTROSPECTION_CONTAINER_USED(T, (new_size-os)) - for (size_t i = os + pid_start; i < new_size + pid_start; ++i) + for (size_t i = os + pid_start; i < new_size + pid_start; ++i) { elementNew(pid_data + i, f); + } } return *this; } @@ -297,15 +311,17 @@ public: if (new_size < pid_size) { deleteT(&(pid_data[new_size + pid_start]), pid_size - new_size); pid_size = new_size; - if (new_size == 0) + if (new_size == 0) { pid_start = (pid_rsize - pid_size) / 2; + } } if (new_size > pid_size) { size_t os = pid_size; alloc(new_size, true); PIINTROSPECTION_CONTAINER_USED(T, (new_size-os)) - for (size_t i = os + pid_start; i < new_size + pid_start; ++i) + for (size_t i = os + pid_start; i < new_size + pid_start; ++i) { elementNew(pid_data + i, f(i)); + } } return *this; } @@ -344,8 +360,9 @@ public: } } else { alloc(pid_size + 1, false, -1); - if (index > 0) + if (index > 0) { memmove((void*)(&(pid_data[pid_start])), (const void*)(&(pid_data[pid_start + 1])), index * sizeof(T)); + } } elementNew(pid_data + pid_start + index, v); return *this; @@ -362,8 +379,9 @@ public: } } else { alloc(pid_size + 1, false, -1); - if (index > 0) + if (index > 0) { memmove((void*)(&(pid_data[pid_start])), (const void*)(&(pid_data[pid_start + 1])), index * sizeof(T)); + } } elementNew(pid_data + pid_start + index, std::move(v)); return *this; @@ -375,12 +393,14 @@ public: if (dir) { ssize_t os = pid_size - index; alloc(pid_size + other.pid_size, true); - if (os > 0) + if (os > 0) { memmove((void*)(&(pid_data[index + pid_start + other.pid_size])), (const void*)(&(pid_data[index + pid_start])), os * sizeof(T)); + } } else { alloc(pid_size + other.pid_size, false, -other.pid_size); - if (index > 0) + if (index > 0) { memmove((void*)(&(pid_data[pid_start])), (const void*)(&(pid_data[pid_start + other.pid_size])), index * sizeof(T)); + } } newT(pid_data + pid_start + index, other.pid_data + other.pid_start, other.pid_size); return *this; @@ -395,9 +415,13 @@ public: size_t os = pid_size - index - count; deleteT(&(pid_data[index + pid_start]), count); if (os <= index) { - if (os > 0) memmove((void*)(&(pid_data[index + pid_start])), (const void*)(&(pid_data[index + pid_start + count])), os * sizeof(T)); + if (os > 0) { + memmove((void*)(&(pid_data[index + pid_start])), (const void*)(&(pid_data[index + pid_start + count])), os * sizeof(T)); + } } else { - if (index > 0) memmove((void*)(&(pid_data[pid_start + count])), (const void*)(&(pid_data[pid_start])), index * sizeof(T)); + if (index > 0) { + memmove((void*)(&(pid_data[pid_start + count])), (const void*)(&(pid_data[pid_start])), index * sizeof(T)); + } pid_start += count; } pid_size -= count; @@ -426,19 +450,21 @@ public: } inline PIDeque & removeOne(const T & v) { - for (size_t i = 0; i < pid_size; ++i) + for (size_t i = 0; i < pid_size; ++i) { if (pid_data[i + pid_start] == v) { remove(i); return *this; } + } return *this; } inline PIDeque & removeAll(const T & v) { - for (ssize_t i = 0; i < ssize_t(pid_size); ++i) + for (ssize_t i = 0; i < ssize_t(pid_size); ++i) { if (pid_data[i + pid_start] == v) { remove(i); --i; } + } return *this; } @@ -481,20 +507,23 @@ public: template PIDeque toType() const { PIDeque ret(pid_size); - for (uint i = 0; i < pid_size; ++i) + for (uint i = 0; i < pid_size; ++i) { ret[i] = ST(pid_data[i + pid_start]); + } return ret; } const PIDeque & forEach(std::function f) const { - for (uint i = 0; i < pid_size; ++i) + for (uint i = 0; i < pid_size; ++i) { f(pid_data[i + pid_start]); + } return *this; } PIDeque copyForEach(std::function f) const { PIDeque ret; ret.reserve(pid_size); - for (uint i = 0; i < pid_size; ++i) + for (uint i = 0; i < pid_size; ++i) { ret << f(pid_data[i + pid_start]); + } return ret; } PIDeque & forEachInplace(std::function f) { @@ -505,8 +534,9 @@ public: template PIDeque toType(std::function f) const { PIDeque ret; ret.reserve(pid_size); - for (uint i = 0; i < pid_size; ++i) + for (uint i = 0; i < pid_size; ++i) { ret << f(pid_data[i + pid_start]); + } return ret; } @@ -516,14 +546,16 @@ public: assert(rows*cols == pid_size); ret.resize(rows); if (order == byRow) { - for (size_t r = 0; r < rows; r++) + for (size_t r = 0; r < rows; r++) { ret[r] = PIDeque(&(pid_data[r*cols]), cols); + } } if (order == byColumn) { for (size_t r = 0; r < rows; r++) { ret[r].resize(cols); - for (size_t c = 0; c < cols; c++) + for (size_t c = 0; c < cols; c++) { ret[r][c] = pid_data[c*rows + r]; + } } } return ret; @@ -539,13 +571,16 @@ public: size_t cols = at(0).size(); ret.reserve(rows * cols); if (order == byRow) { - for (size_t r = 0; r < rows; r++) + for (size_t r = 0; r < rows; r++) { ret.append(at(r)); + } } if (order == byColumn) { - for (size_t c = 0; c < cols; c++) - for (size_t r = 0; r < rows; r++) + for (size_t c = 0; c < cols; c++) { + for (size_t r = 0; r < rows; r++) { ret << at(r)[c]; + } + } } ret.resize(rows * cols); return ret; @@ -555,11 +590,13 @@ private: inline void _reset() {pid_size = pid_rsize = pid_start = 0; pid_data = 0;} inline size_t asize(ssize_t s) { if (s <= 0) return 0; - if (pid_rsize + pid_rsize >= size_t(s) && pid_rsize < size_t(s)) + if (pid_rsize + pid_rsize >= size_t(s) && pid_rsize < size_t(s)) { return pid_rsize + pid_rsize; + } ssize_t t = 0, s_ = s - 1; - while (s_ >> t) + while (s_ >> t) { ++t; + } return (1 << t); } template pid_rsize) { T * td = (T*)(malloc(as * sizeof(T))); ssize_t ns = pid_start + as - pid_rsize; @@ -688,7 +727,15 @@ private: #ifdef PIP_STD_IOSTREAM template -inline std::ostream & operator <<(std::ostream & s, const PIDeque & v) {s << "{"; for (size_t i = 0; i < v.size(); ++i) {s << v[i]; if (i < v.size() - 1) s << ", ";} s << "}"; return s;} +inline std::ostream & operator <<(std::ostream & s, const PIDeque & v) { + s << "{"; + for (size_t i = 0; i < v.size(); ++i) { + s << v[i]; + if (i < v.size() - 1) s << ", "; + } + s << "}"; + return s; +} #endif template @@ -698,8 +745,7 @@ inline PICout operator <<(PICout s, const PIDeque & v) { s << "{"; for (size_t i = 0; i < v.size(); ++i) { s << v[i]; - if (i < v.size() - 1) - s << ", "; + if (i < v.size() - 1) s << ", "; } s << "}"; s.restoreControl(); diff --git a/libs/main/containers/pivector.h b/libs/main/containers/pivector.h index 76ffbe3c..6acf6ba7 100644 --- a/libs/main/containers/pivector.h +++ b/libs/main/containers/pivector.h @@ -174,6 +174,7 @@ public: inline size_t length() const {return piv_size;} 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 T & operator [](size_t index) {return piv_data[index];} inline const T & operator [](size_t index) const {return piv_data[index];} @@ -287,8 +288,9 @@ public: size_t os = piv_size; alloc(new_size); PIINTROSPECTION_CONTAINER_USED(T, (new_size-os)) - for (size_t i = os; i < new_size; ++i) + for (size_t i = os; i < new_size; ++i) { elementNew(piv_data + i, f); + } } return *this; } @@ -302,8 +304,9 @@ public: size_t os = piv_size; alloc(new_size); PIINTROSPECTION_CONTAINER_USED(T, (new_size-os)) - for (size_t i = os; i < new_size; ++i) + for (size_t i = os; i < new_size; ++i) { elementNew(piv_data + i, f(i)); + } } return *this; } @@ -357,8 +360,9 @@ public: assert(&other != this); ssize_t os = piv_size - index; alloc(piv_size + other.piv_size); - if (os > 0) + if (os > 0) { memmove((void*)(&(piv_data[index + other.piv_size])), (const void*)(&(piv_data[index])), os * sizeof(T)); + } newT(piv_data + index, other.piv_data, other.piv_size); return *this; } @@ -397,19 +401,22 @@ public: } inline PIVector & removeOne(const T & v) { - for (size_t i = 0; i < piv_size; ++i) + for (size_t i = 0; i < piv_size; ++i) { if (piv_data[i] == v) { remove(i); return *this; } + } return *this; } + inline PIVector & removeAll(const T & v) { - for (ssize_t i = 0; i < ssize_t(piv_size); ++i) + for (ssize_t i = 0; i < ssize_t(piv_size); ++i) { if (piv_data[i] == v) { remove(i); --i; } + } return *this; } @@ -419,12 +426,14 @@ public: elementNew(piv_data + piv_size - 1, v); return *this; } + inline PIVector & push_back(T && v) { alloc(piv_size + 1); PIINTROSPECTION_CONTAINER_USED(T, 1); elementNew(piv_data + piv_size - 1, std::move(v)); return *this; } + inline PIVector & append(const T & v) {return push_back(v);} inline PIVector & append(T && v) {return push_back(std::move(v));} inline PIVector & append(const PIVector & other) { @@ -444,14 +453,12 @@ public: inline PIVector & prepend(T && v) {return push_front(std::move(v));} inline PIVector & pop_back() { - if (piv_size == 0) - return *this; + if (piv_size == 0) return *this; resize(piv_size - 1); return *this; } inline PIVector & pop_front() { - if (piv_size == 0) - return *this; + if (piv_size == 0) return *this; remove(0); return *this; } @@ -462,32 +469,37 @@ public: template PIVector toType() const { PIVector ret(piv_size); - for (uint i = 0; i < piv_size; ++i) + for (uint i = 0; i < piv_size; ++i) { ret[i] = ST(piv_data[i]); + } return ret; } const PIVector & forEach(std::function f) const { - for (uint i = 0; i < piv_size; ++i) + for (uint i = 0; i < piv_size; ++i) { f(piv_data[i]); + } return *this; } PIVector copyForEach(std::function f) const { PIVector ret; ret.reserve(piv_size); - for (uint i = 0; i < piv_size; ++i) + for (uint i = 0; i < piv_size; ++i) { ret << f(piv_data[i]); + } return ret; } PIVector & forEachInplace(std::function f) { - for (uint i = 0; i < piv_size; ++i) + for (uint i = 0; i < piv_size; ++i) { piv_data[i] = f(piv_data[i]); + } return *this; } template PIVector toType(std::function f) const { PIVector ret; ret.reserve(piv_size); - for (uint i = 0; i < piv_size; ++i) + for (uint i = 0; i < piv_size; ++i) { ret << f(piv_data[i]); + } return ret; } @@ -497,14 +509,16 @@ public: assert(rows*cols == piv_size); ret.resize(rows); if (order == byRow) { - for (size_t r = 0; r < rows; r++) + for (size_t r = 0; r < rows; r++) { ret[r] = PIVector(&(piv_data[r*cols]), cols); + } } if (order == byColumn) { for (size_t r = 0; r < rows; r++) { ret[r].resize(cols); - for (size_t c = 0; c < cols; c++) + for (size_t c = 0; c < cols; c++) { ret[r][c] = piv_data[c*rows + r]; + } } } return ret; @@ -520,13 +534,16 @@ public: size_t cols = at(0).size(); ret.reserve(rows * cols); if (order == byRow) { - for (size_t r = 0; r < rows; r++) + for (size_t r = 0; r < rows; r++) { ret.append(at(r)); + } } if (order == byColumn) { - for (size_t c = 0; c < cols; c++) - for (size_t r = 0; r < rows; r++) + for (size_t c = 0; c < cols; c++) { + for (size_t r = 0; r < rows; r++) { ret << at(r)[c]; + } + } } ret.resize(rows * cols); return ret; @@ -536,8 +553,9 @@ private: inline void _reset() {piv_size = piv_rsize = 0; piv_data = 0;} inline size_t asize(size_t s) { if (s == 0) return 0; - if (piv_rsize + piv_rsize >= s && piv_rsize < s) + if (piv_rsize + piv_rsize >= s && piv_rsize < s) { return piv_rsize + piv_rsize; + } ssize_t t = 0, s_ = s - 1; while (s_ >> t) ++t; return (1 << t); @@ -563,8 +581,9 @@ private: inline void deleteT(T * d, size_t sz) { PIINTROSPECTION_CONTAINER_UNUSED(T, sz) if ((uchar*)d != 0) { - for (size_t i = 0; i < sz; ++i) + for (size_t i = 0; i < sz; ++i) { elementDelete(d[i]); + } } } template -inline std::ostream & operator <<(std::ostream & s, const PIVector & v) {s << "{"; for (size_t i = 0; i < v.size(); ++i) {s << v[i]; if (i < v.size() - 1) s << ", ";} s << "}"; return s;} +inline std::ostream & operator <<(std::ostream & s, const PIVector & v) { + s << "{"; + for (size_t i = 0; i < v.size(); ++i) { + s << v[i]; + if (i < v.size() - 1) s << ", "; + } + s << "}"; + return s; +} #endif template @@ -634,8 +661,9 @@ inline PICout operator <<(PICout s, const PIVector & v) { s << "{"; for (size_t i = 0; i < v.size(); ++i) { s << v[i]; - if (i < v.size() - 1) + if (i < v.size() - 1) { s << ", "; + } } s << "}"; s.restoreControl();