From c90d06871ed1a4a24d03ce80c6a0f026ffde4397 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 6 Apr 2022 08:40:25 +0300 Subject: [PATCH] PIVector iterator operators --- libs/main/containers/pivector.h | 54 ++++++++++++++++++++++++++++----- libs/main/core/piobject.h | 8 ++--- main.cpp | 10 +++--- 3 files changed, 55 insertions(+), 17 deletions(-) diff --git a/libs/main/containers/pivector.h b/libs/main/containers/pivector.h index 83ec4659..742b0657 100644 --- a/libs/main/containers/pivector.h +++ b/libs/main/containers/pivector.h @@ -227,12 +227,31 @@ public: inline iterator(): parent(0), pos(0) {} inline T & operator *() {return (*parent)[pos];} inline const T & operator *() const {return (*parent)[pos];} - inline void operator ++() {++pos;} - inline void operator ++(int) {++pos;} - inline void operator --() {--pos;} - inline void operator --(int) {--pos;} + inline T & operator->() {return (*parent)[pos];} + + inline iterator & operator ++() {++pos; return *this;} + inline iterator & operator ++(int) {const auto tmp = *this; ++*this; return tmp;} + inline iterator & operator --() {--pos; return *this;} + inline iterator & operator --(int) {const auto tmp = *this; --*this; return tmp;} + + inline iterator & operator +=(const iterator & it) {pos += it.pos; return *this;} + inline iterator & operator +=(size_t p) {pos += p; return *this;} + inline iterator & operator -=(const iterator & it) {pos -= it.pos; return *this;} + inline iterator & operator -=(size_t p) {pos -= p; return *this;} + + friend inline iterator operator-(const iterator & it, size_t p) {auto tmp = it; tmp -= p; return tmp;} + friend inline iterator operator-(size_t p, const iterator & it) {return it - p;} + friend inline size_t operator-(const iterator & it1, const iterator & it2) {return it1.pos - it2.pos;} + + friend inline iterator operator+(const iterator & it, size_t p) {auto tmp = it; tmp += p; return tmp;} + friend inline iterator operator+(size_t p, const iterator & it) {return it + p;} + inline bool operator ==(const iterator & it) const {return (pos == it.pos);} inline bool operator !=(const iterator & it) const {return (pos != it.pos);} + friend inline bool operator <(const iterator & it1, const iterator & it2) {return it1.pos < it2.pos;} + friend inline bool operator <=(const iterator & it1, const iterator & it2) {return it1.pos <= it2.pos;} + friend inline bool operator >(const iterator & it1, const iterator & it2) {return it1.pos > it2.pos;} + friend inline bool operator >=(const iterator & it1, const iterator & it2) {return it1.pos >= it2.pos;} }; class const_iterator { @@ -244,12 +263,31 @@ public: public: inline const_iterator(): parent(0), pos(0) {} inline const T & operator *() const {return (*parent)[pos];} - inline void operator ++() {++pos;} - inline void operator ++(int) {++pos;} - inline void operator --() {--pos;} - inline void operator --(int) {--pos;} + inline const T & operator->() {return (*parent)[pos];} + + inline const_iterator & operator ++() {++pos; return *this;} + inline const_iterator & operator ++(int) {const auto tmp = *this; ++*this; return tmp;} + inline const_iterator & operator --() {--pos; return *this;} + inline const_iterator & operator --(int) {const auto tmp = *this; --*this; return tmp;} + + inline const_iterator & operator +=(const const_iterator & it) {pos += it.pos; return *this;} + inline const_iterator & operator +=(size_t p) {pos += p; return *this;} + inline const_iterator & operator -=(const const_iterator & it) {pos -= it.pos; return *this;} + inline const_iterator & operator -=(size_t p) {pos -= p; return *this;} + + friend inline const_iterator operator-(const const_iterator & it, size_t p) {auto tmp = it; tmp -= p; return tmp;} + friend inline const_iterator operator-(size_t p, const const_iterator & it) {return it - p;} + friend inline size_t operator-(const const_iterator & it1, const const_iterator & it2) {return it1.pos - it2.pos;} + + friend inline const_iterator operator+(const const_iterator & it, size_t p) {auto tmp = it; tmp += p; return tmp;} + friend inline const_iterator operator+(size_t p, const const_iterator & it) {return it + p;} + inline bool operator ==(const const_iterator & it) const {return (pos == it.pos);} inline bool operator !=(const const_iterator & it) const {return (pos != it.pos);} + friend inline bool operator <(const const_iterator & it1, const const_iterator & it2) {return it1.pos < it2.pos;} + friend inline bool operator <=(const const_iterator & it1, const const_iterator & it2) {return it1.pos <= it2.pos;} + friend inline bool operator >(const const_iterator & it1, const const_iterator & it2) {return it1.pos > it2.pos;} + friend inline bool operator >=(const const_iterator & it1, const const_iterator & it2) {return it1.pos >= it2.pos;} }; class reverse_iterator { diff --git a/libs/main/core/piobject.h b/libs/main/core/piobject.h index 1b194ee1..1ae3b5d5 100644 --- a/libs/main/core/piobject.h +++ b/libs/main/core/piobject.h @@ -130,8 +130,8 @@ public: virtual const char * parentClassName() const {return "";} - //! \~english Return if debug of this object is active - //! \~russian Возвращает включен ли вывод на консоль для этого объекта + //! \~english Return if \a piCoutObj of this object is active + //! \~russian Возвращает включен ли вывод \a piCoutObj для этого объекта bool debug() const {return property(PIStringAscii("debug")).toBool();} @@ -140,8 +140,8 @@ public: void setName(const PIString & name) {setProperty(PIStringAscii("name"), name);} void setName(const char * name) {setName(PIStringAscii(name));} - //! \~english Set object debug active - //! \~russian Включает или отключает вывод на консоль для этого объекта + //! \~english Set object \a piCoutObj active + //! \~russian Включает или отключает вывод \a piCoutObj для этого объекта void setDebug(bool debug) {setProperty(PIStringAscii("debug"), debug);} //! \~english Returns properties of the object diff --git a/main.cpp b/main.cpp index 7525baea..fd92fbcd 100644 --- a/main.cpp +++ b/main.cpp @@ -1,13 +1,13 @@ #include "pip.h" - +#include int main(int argc, char * argv[]) { PIVector v(5, [](size_t i){return i*2;}); v.prepend({1, 2, 3}); piCout << v; - piCout << v.reduce([](int v, int s){return v+s;}); - piCout << v.reduce([](int v, PIString s){return s+PIString::fromNumber(v);}); - PIStringList sl = v.map([](int v){return PIString::fromNumber(v);}); - piCout << sl; + for (auto i: v) piCout << i; + piCout << "sz" << v.end() - v.begin(); + std::sort(v.begin(), v.end()); + piCout << v; return 0; }