fix pievaluator and PIDeque sort
This commit is contained in:
@@ -31,6 +31,8 @@
|
||||
template <typename T>
|
||||
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<T> * 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<T> * 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<T> * 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<T> * 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<ssize_t>(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<T> & 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<int> 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<bool(const T &a, const T &b)> comp)
|
||||
inline PIDeque<T> & 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<int> 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<T> & sort(std::function<bool(const T &a, const T &b)> comp) {
|
||||
std::sort(begin(), end(), comp);
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user