diff --git a/libs/main/containers/pideque.h b/libs/main/containers/pideque.h index 62ea32c3..100d38bf 100644 --- a/libs/main/containers/pideque.h +++ b/libs/main/containers/pideque.h @@ -31,6 +31,8 @@ template class PIDeque { public: + typedef bool (*CompareFunc)(const T & , const T & ); + inline PIDeque(): pid_data(0), pid_size(0), pid_rsize(0), pid_start(0) { PIINTROSPECTION_CONTAINER_NEW(T, sizeof(T)) } @@ -96,15 +98,42 @@ public: PIDeque * parent; size_t pos; public: + typedef T value_type; + typedef T* pointer; + typedef T& reference; + typedef std::ptrdiff_t difference_type; + typedef std::random_access_iterator_tag iterator_category; + 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 const T & operator ->() const {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 std::ptrdiff_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 { @@ -114,14 +143,40 @@ public: const PIDeque * parent; size_t pos; public: + typedef T value_type; + typedef T* pointer; + typedef T& reference; + typedef std::ptrdiff_t difference_type; + typedef std::random_access_iterator_tag iterator_category; + 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 ->() const {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 std::ptrdiff_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 { @@ -131,15 +186,42 @@ public: PIDeque * parent; size_t pos; public: + typedef T value_type; + typedef T* pointer; + typedef T& reference; + typedef std::ptrdiff_t difference_type; + typedef std::random_access_iterator_tag iterator_category; + inline reverse_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 const T & operator ->() const {return (*parent)[pos];} + + inline reverse_iterator & operator ++() {--pos; return *this;} + inline reverse_iterator & operator ++(int) {const auto tmp = *this; --*this; return tmp;} + inline reverse_iterator & operator --() {++pos; return *this;} + inline reverse_iterator & operator --(int) {const auto tmp = *this; ++*this; return tmp;} + + inline reverse_iterator & operator +=(const reverse_iterator & it) {pos -= it.pos; return *this;} + inline reverse_iterator & operator +=(size_t p) {pos -= p; return *this;} + inline reverse_iterator & operator -=(const reverse_iterator & it) {pos += it.pos; return *this;} + inline reverse_iterator & operator -=(size_t p) {pos += p; return *this;} + + friend inline reverse_iterator operator -(const reverse_iterator & it, size_t p) {auto tmp = it; tmp -= p; return tmp;} + friend inline reverse_iterator operator -(size_t p, const reverse_iterator & it) {return it - p;} + friend inline std::ptrdiff_t operator -(const reverse_iterator & it1, const reverse_iterator & it2) {return it2.pos - it1.pos;} + + friend inline reverse_iterator operator +(const reverse_iterator & it, size_t p) {auto tmp = it; tmp += p; return tmp;} + friend inline reverse_iterator operator +(size_t p, const reverse_iterator & it) {return it + p;} + inline bool operator ==(const reverse_iterator & it) const {return (pos == it.pos);} inline bool operator !=(const reverse_iterator & it) const {return (pos != it.pos);} + friend inline bool operator <(const reverse_iterator & it1, const reverse_iterator & it2) {return it1.pos < it2.pos;} + friend inline bool operator <=(const reverse_iterator & it1, const reverse_iterator & it2) {return it1.pos <= it2.pos;} + friend inline bool operator >(const reverse_iterator & it1, const reverse_iterator & it2) {return it1.pos > it2.pos;} + friend inline bool operator >=(const reverse_iterator & it1, const reverse_iterator & it2) {return it1.pos >= it2.pos;} }; class const_reverse_iterator { @@ -149,14 +231,39 @@ public: const PIDeque * parent; size_t pos; public: + typedef T value_type; + typedef T* pointer; + typedef T& reference; + typedef std::ptrdiff_t difference_type; + typedef std::random_access_iterator_tag iterator_category; + inline const_reverse_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 ->() const {return (*parent)[pos];} + + inline const_reverse_iterator & operator ++() {--pos; return *this;} + inline const_reverse_iterator & operator ++(int) {const auto tmp = *this; --*this; return tmp;} + inline const_reverse_iterator & operator --() {++pos; return *this;} + inline const_reverse_iterator & operator --(int) {const auto tmp = *this; ++*this; return tmp;} + + inline const_reverse_iterator & operator +=(const const_reverse_iterator & it) {pos -= it.pos; return *this;} + inline const_reverse_iterator & operator +=(size_t p) {pos -= p; return *this;} + inline const_reverse_iterator & operator -=(const const_reverse_iterator & it) {pos += it.pos; return *this;} + inline const_reverse_iterator & operator -=(size_t p) {pos += p; return *this;} + + friend inline const_reverse_iterator operator -(const const_reverse_iterator & it, size_t p) {auto tmp = it; tmp -= p; return tmp;} + friend inline const_reverse_iterator operator -(size_t p, const const_reverse_iterator & it) {return it - p;} + friend inline std::ptrdiff_t operator -(const const_reverse_iterator & it1, const const_reverse_iterator & it2) {return it2.pos - it1.pos;} + + friend inline const_reverse_iterator operator +(const const_reverse_iterator & it, size_t p) {auto tmp = it; tmp += p; return tmp;} + friend inline const_reverse_iterator operator +(size_t p, const const_reverse_iterator & it) {return it + p;} + inline bool operator ==(const const_reverse_iterator & it) const {return (pos == it.pos);} inline bool operator !=(const const_reverse_iterator & it) const {return (pos != it.pos);} + friend inline bool operator <(const const_reverse_iterator & it1, const const_reverse_iterator & it2) {return it1.pos < it2.pos;} + friend inline bool operator <=(const const_reverse_iterator & it1, const const_reverse_iterator & it2) {return it1.pos <= it2.pos;} + friend inline bool operator >(const const_reverse_iterator & it1, const const_reverse_iterator & it2) {return it1.pos > it2.pos;} + friend inline bool operator >=(const const_reverse_iterator & it1, const const_reverse_iterator & it2) {return it1.pos >= it2.pos;} }; inline iterator begin() {return iterator(this, 0);} @@ -492,10 +599,61 @@ public: piSwap(pid_start, other.pid_start); } - typedef int (*CompareFunc)(const T * , const T * ); - static int compare_func(const T * t0, const T * t1) {return (*t0) < (*t1) ? -1 : ((*t0) == (*t1) ? 0 : 1);} - inline PIDeque & sort(CompareFunc compare = compare_func) { - piqsort(pid_data + pid_start, pid_size, sizeof(T), (int(*)(const void * , const void * ))compare); + //! \~\brief + //! \~english Sorts the elements in non-descending order. + //! \~russian Сортировка элементов в порядке возрастания. + //! \~\details + //! \~english The order of equal elements is not guaranteed to be preserved. + //! Elements are compared using operator<. + //! Sorting provided by [std::sort](https://en.cppreference.com/w/cpp/algorithm/sort). + //! Complexity `O(N·log(N))`. + //! \~russian Сохранность порядка элементов, имеющих одинаковое значение, не гарантируется. + //! Для сравнения элементов используется оператор `operator<`. + //! Для сортировки используется функция [std::sort](https://ru.cppreference.com/w/cpp/algorithm/sort). + //! Сложность сортировки `O(N·log(N))`. + //! \~\code + //! PIDeque v{5, 7, 4, 2, 8, 6, 1, 9, 0, 3}; + //! v.sort(); + //! piCout << v; // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 + //! \endcode + //! \~\sa \a sort(std::function comp) + inline PIDeque & sort() { + std::sort(begin(), end()); + return *this; + } + + //! \~\brief + //! \~english Sorts the elements in non-descending order. + //! \~russian Сортировка элементов в порядке возрастания. + //! \~\details + //! \~english The order of equal elements is not guaranteed to be preserved. + //! Elements are compared using the given binary comparison function `comp`. + //! which returns `​true` if the first argument is less than (i.e. is ordered before) the second. + //! The signature of the comparison function should be equivalent to the following: + //! \code + //! bool comp(const T &a, const T &b); + //! \endcode + //! While the signature does not need to have const &, the function must not modify the objects passed to it. + //! Sorting provided by [std::sort](https://en.cppreference.com/w/cpp/algorithm/sort). + //! Complexity `O(N·log(N))`. + //! \~russian Сохранность порядка элементов, имеющих одинаковое значение, не гарантируется. + //! Для сравнения элементов используется функция сравнения `comp`. + //! Функция сравнения, возвращает ​`true` если первый аргумент меньше второго. + //! Сигнатура функции сравнения должна быть эквивалентна следующей: + //! \code + //! bool comp(const T &a, const T &b); + //! \endcode + //! Сигнатура не обязана содержать const &, однако, функция не может изменять переданные объекты. + //! Для сортировки используется функция [std::sort](https://ru.cppreference.com/w/cpp/algorithm/sort). + //! Сложность сортировки `O(N·log(N))`. + //! \~\code + //! PIDeque v{5, 7, 4, 2, 8, 6, 1, 9, 0, 3}; + //! v.sort([](const int & a, const int & b){return a > b;}); + //! piCout << v; // 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 + //! \endcode + //! \~\sa \a sort() + inline PIDeque & sort(std::function comp) { + std::sort(begin(), end(), comp); return *this; } diff --git a/libs/main/math/pievaluator.cpp b/libs/main/math/pievaluator.cpp index ce6f2c1c..60f25658 100644 --- a/libs/main/math/pievaluator.cpp +++ b/libs/main/math/pievaluator.cpp @@ -479,7 +479,7 @@ bool PIEvaluator::fillElements() { for (int i = 0; i < content.variables.size_s(); ++i) { var_index << PairII(i, content.variables[i].name.length()); } - var_index.sort([](const PairII & v1, const PairII & v2)->bool{return v1.second < v2.second;}); + var_index.sort([](const PairII & v1, const PairII & v2){return v1.second > v2.second;}); for (int i = 0; i < var_index.size_s(); i++) { int vind = var_index[i].first; curfind = content.variables[vind].name;