|
|
|
@@ -39,11 +39,10 @@
|
|
|
|
|
#include "pipair.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <typename Key, typename T>
|
|
|
|
|
class PIMapIterator;
|
|
|
|
|
|
|
|
|
|
template <typename Key, typename T>
|
|
|
|
|
class PIMapReverseIterator;
|
|
|
|
|
template <typename Key, typename T> class PIMapIteratorConst;
|
|
|
|
|
template <typename Key, typename T> class PIMapIteratorConstReverse;
|
|
|
|
|
template <typename Key, typename T> class PIMapIterator;
|
|
|
|
|
template <typename Key, typename T> class PIMapIteratorReverse;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//! \addtogroup Containers
|
|
|
|
@@ -74,11 +73,13 @@ class PIMapReverseIterator;
|
|
|
|
|
//! В контейнеры этого типа заносятся элементы вместе с ключами,
|
|
|
|
|
//! по которым их можно найти, которыми могут выступать значения любого типа.
|
|
|
|
|
//! \a operator [] позволяет получить доступ к элементу по ключу,
|
|
|
|
|
//! и если такого эелемента небыло, то он будет создан.
|
|
|
|
|
//! и если такого эелемента не было, то он будет создан.
|
|
|
|
|
template <typename Key, typename T>
|
|
|
|
|
class PIMap {
|
|
|
|
|
template <typename Key1, typename T1> friend class PIMapIteratorConst;
|
|
|
|
|
template <typename Key1, typename T1> friend class PIMapIteratorConstReverse;
|
|
|
|
|
template <typename Key1, typename T1> friend class PIMapIterator;
|
|
|
|
|
template <typename Key1, typename T1> friend class PIMapReverseIterator;
|
|
|
|
|
template <typename Key1, typename T1> friend class PIMapIteratorReverse;
|
|
|
|
|
template <typename P, typename Key1, typename T1>
|
|
|
|
|
friend PIBinaryStream<P> & operator <<(PIBinaryStream<P> & s, const PIMap<Key1, T1> & v);
|
|
|
|
|
template <typename P, typename Key1, typename T1>
|
|
|
|
@@ -235,11 +236,17 @@ public:
|
|
|
|
|
|
|
|
|
|
const_reverse_iterator constRend() const {return const_reverse_iterator(this, -1);}
|
|
|
|
|
|
|
|
|
|
//! \relatesalso PIMapIterator
|
|
|
|
|
PIMapIterator<Key, T> makeIterator() const {return PIMapIterator<Key, T>(*this);}
|
|
|
|
|
//! \relatesalso PIMapIteratorConst
|
|
|
|
|
PIMapIteratorConst<Key, T> makeIterator() const {return PIMapIteratorConst<Key, T>(*this);}
|
|
|
|
|
|
|
|
|
|
//! \relatesalso PIMapReverseIterator
|
|
|
|
|
PIMapReverseIterator<Key, T> makeReverseIterator() const {return PIMapReverseIterator<Key, T>(*this);}
|
|
|
|
|
//! \relatesalso PIMapIterator
|
|
|
|
|
PIMapIterator<Key, T> makeIterator() {return PIMapIterator<Key, T>(*this);}
|
|
|
|
|
|
|
|
|
|
//! \relatesalso PIMapIteratorConstReverse
|
|
|
|
|
PIMapIteratorConstReverse<Key, T> makeReverseIterator() const {return PIMapIteratorConstReverse<Key, T>(*this);}
|
|
|
|
|
|
|
|
|
|
//! \relatesalso PIMapIteratorReverse
|
|
|
|
|
PIMapIteratorReverse<Key, T> makeReverseIterator() {return PIMapIteratorReverse<Key, T>(*this);}
|
|
|
|
|
|
|
|
|
|
size_t size() const {return pim_content.size();}
|
|
|
|
|
|
|
|
|
@@ -512,18 +519,18 @@ private:
|
|
|
|
|
|
|
|
|
|
//! \addtogroup Containers
|
|
|
|
|
//! \{
|
|
|
|
|
//! \class PIMapIterator
|
|
|
|
|
//! \class PIMapIteratorConst
|
|
|
|
|
//! \brief
|
|
|
|
|
//! \~english Java-style iterator for \a PIMap.
|
|
|
|
|
//! \~russian Итератор Java стиля для \a PIMap.
|
|
|
|
|
//! \~\}
|
|
|
|
|
//! \details
|
|
|
|
|
//! \~english
|
|
|
|
|
//! This class used to easy serial access keys and values in PIMap.
|
|
|
|
|
//! You can use constructor to create iterator, or use \a PIMap::makeIterator()
|
|
|
|
|
//! This class used to easy serial access keys and values in PIMap with read only permitions.
|
|
|
|
|
//! Use constructor to create iterator, or use \a PIMap::makeIterator()
|
|
|
|
|
//! \~russian
|
|
|
|
|
//! Этот класс используется для удобного перебора ключей и значений всего словаря в обратном порядке.
|
|
|
|
|
//! Ты можешь использовать конструктор, в который передать словарь, или функцию словаря \a PIMap::makeReverseIterator().
|
|
|
|
|
//! Этот класс используется для удобного перебора ключей и значений всего словаря только для чтения.
|
|
|
|
|
//! Можно использовать конструктор, в который передаётся словарь, или функцию словаря \a PIMap::makeIterator().
|
|
|
|
|
//! \~
|
|
|
|
|
//! \code
|
|
|
|
|
//! PIMap<int, PIString> m;
|
|
|
|
@@ -533,46 +540,42 @@ private:
|
|
|
|
|
//! auto it = m.makeIterator();
|
|
|
|
|
//! while (it.next()) {
|
|
|
|
|
//! piCout << it.key() << it.value();
|
|
|
|
|
//! }
|
|
|
|
|
//! // 1 one
|
|
|
|
|
//! // 2 two
|
|
|
|
|
//! // 4 four
|
|
|
|
|
//! \endcode
|
|
|
|
|
template <typename Key, typename T>
|
|
|
|
|
class PIMapIterator {
|
|
|
|
|
class PIMapIteratorConst {
|
|
|
|
|
typedef PIMap<Key, T> MapType;
|
|
|
|
|
public:
|
|
|
|
|
PIMapIterator(const PIMap<Key, T> & map, bool reverse = false): m(map), pos(-1) {}
|
|
|
|
|
PIMapIteratorConst(const PIMap<Key, T> & map): m(map), pos(-1) {}
|
|
|
|
|
|
|
|
|
|
//! \~english Returns current key.
|
|
|
|
|
//! \~russian Возвращает ключ текущего элемента.
|
|
|
|
|
//! \~\sa \a value(), \a valueRef()
|
|
|
|
|
//! \~\sa \a value()
|
|
|
|
|
const Key & key() const {
|
|
|
|
|
return m._key(pos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Returns current value.
|
|
|
|
|
//! \~russian Возвращает значение текущего элемента.
|
|
|
|
|
//! \~\sa \a key(), \a valueRef()
|
|
|
|
|
//! \~\sa \a key()
|
|
|
|
|
const T & value() const {
|
|
|
|
|
return m._value(pos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//! \~english Returns current value reference.
|
|
|
|
|
//! \~russian Возвращает изменяемую ссылку на значение текущего элемента.
|
|
|
|
|
//! \~\sa \a key(), \a value()
|
|
|
|
|
T & valueRef() {
|
|
|
|
|
return const_cast<MapType & >(m)._value(pos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Returns true if iterator can jump to next entry
|
|
|
|
|
//! \~russian Возвращает true если итератор может перейти к следующему элементу.
|
|
|
|
|
//! \~\sa \a next()
|
|
|
|
|
inline bool hasNext() const {
|
|
|
|
|
return pos < (m.size_s() - 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Jump to next entry and return true if new position is valid.
|
|
|
|
|
//! \~russian Переходит к следующему элементу и возвращает true если он существует.
|
|
|
|
|
//! \~\sa \a hasNext(), \a reset()
|
|
|
|
|
inline bool next() {
|
|
|
|
|
++pos;
|
|
|
|
|
return pos < m.size_s();
|
|
|
|
@@ -580,6 +583,7 @@ public:
|
|
|
|
|
|
|
|
|
|
//! \~english Reset iterator to initial position.
|
|
|
|
|
//! \~russian Переходит на начало.
|
|
|
|
|
//! \~\sa \a next()
|
|
|
|
|
inline void reset() {
|
|
|
|
|
pos = -1;
|
|
|
|
|
}
|
|
|
|
@@ -591,18 +595,18 @@ private:
|
|
|
|
|
|
|
|
|
|
//! \addtogroup Containers
|
|
|
|
|
//! \{
|
|
|
|
|
//! \class PIMapReverseIterator
|
|
|
|
|
//! \class PIMapIteratorConstReverse
|
|
|
|
|
//! \brief
|
|
|
|
|
//! \~english Java-style reverse iterator for \a PIMap.
|
|
|
|
|
//! \~russian Итератор Java стиля для \a PIMap в обратном порядке.
|
|
|
|
|
//! \~\}
|
|
|
|
|
//! \details
|
|
|
|
|
//! \~english
|
|
|
|
|
//! This class used to easy serial reverse access keys and values in PIMap.
|
|
|
|
|
//! You can use constructor to create iterator, or use \a PIMap::makeReverseIterator().
|
|
|
|
|
//! This class used to easy serial reverse access keys and values in PIMap with read only permitions.
|
|
|
|
|
//! Use constructor to create iterator, or use \a PIMap::makeReverseIterator().
|
|
|
|
|
//! \~russian
|
|
|
|
|
//! Этот класс используется для удобного перебора ключей и значений всего словаря в обратном порядке.
|
|
|
|
|
//! Ты можешь использовать конструктор, в который передать словарь, или функцию словаря \a PIMap::makeReverseIterator().
|
|
|
|
|
//! Этот класс используется для удобного перебора ключей и значений всего словаря в обратном порядке только для чтения.
|
|
|
|
|
//! Можно использовать конструктор, в который передаётся словарь, или функцию словаря \a PIMap::makeReverseIterator().
|
|
|
|
|
//! \~
|
|
|
|
|
//! \code
|
|
|
|
|
//! PIMap<int, PIString> m;
|
|
|
|
@@ -617,54 +621,36 @@ private:
|
|
|
|
|
//! // 2 two
|
|
|
|
|
//! // 1 one
|
|
|
|
|
//! \endcode
|
|
|
|
|
//! \~english Write access:
|
|
|
|
|
//! \~russian Доступ на запись:
|
|
|
|
|
//! \~
|
|
|
|
|
//! \code
|
|
|
|
|
//! while (it.next()) {
|
|
|
|
|
//! it.valueRef().append("_!");
|
|
|
|
|
//! piCout << it.key() << it.value();
|
|
|
|
|
//! }
|
|
|
|
|
//! // 4 four_!
|
|
|
|
|
//! // 2 two_!
|
|
|
|
|
//! // 1 one_!
|
|
|
|
|
//! \endcode
|
|
|
|
|
template <typename Key, typename T>
|
|
|
|
|
class PIMapReverseIterator {
|
|
|
|
|
class PIMapIteratorConstReverse {
|
|
|
|
|
typedef PIMap<Key, T> MapType;
|
|
|
|
|
public:
|
|
|
|
|
PIMapReverseIterator(const PIMap<Key, T> & map): m(map), pos(m.size_s()) {}
|
|
|
|
|
PIMapIteratorConstReverse(const PIMap<Key, T> & map): m(map), pos(m.size_s()) {}
|
|
|
|
|
|
|
|
|
|
//! \~english Returns current key.
|
|
|
|
|
//! \~russian Возвращает ключ текущего элемента.
|
|
|
|
|
//! \~\sa \a value(), \a valueRef()
|
|
|
|
|
//! \~\sa \a value()
|
|
|
|
|
const Key & key() const {
|
|
|
|
|
return m._key(pos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Returns current value.
|
|
|
|
|
//! \~russian Возвращает значение текущего элемента.
|
|
|
|
|
//! \~\sa \a key(), \a valueRef()
|
|
|
|
|
//! \~\sa \a key()
|
|
|
|
|
const T & value() const {
|
|
|
|
|
return m._value(pos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//! \~english Returns current value reference.
|
|
|
|
|
//! \~russian Возвращает изменяемую ссылку на значение текущего элемента.
|
|
|
|
|
//! \~\sa \a key(), \a value()
|
|
|
|
|
T & valueRef() {
|
|
|
|
|
return const_cast<MapType & >(m)._value(pos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Returns true if iterator can jump to next entry
|
|
|
|
|
//! \~russian Возвращает true если итератор может перейти к следующему элементу.
|
|
|
|
|
//! \~\sa \a next()
|
|
|
|
|
inline bool hasNext() const {
|
|
|
|
|
return pos > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Jump to next entry and return true if new position is valid.
|
|
|
|
|
//! \~russian Переходит к следующему элементу и возвращает true если он существует.
|
|
|
|
|
//! \~\sa \a hasNext(), \a reset()
|
|
|
|
|
inline bool next() {
|
|
|
|
|
--pos;
|
|
|
|
|
return pos >= 0;
|
|
|
|
@@ -672,6 +658,7 @@ public:
|
|
|
|
|
|
|
|
|
|
//! \~english Reset iterator to initial position.
|
|
|
|
|
//! \~russian Переходит на начало.
|
|
|
|
|
//! \~\sa \a next()
|
|
|
|
|
inline void reset() {
|
|
|
|
|
pos = m.size_s();
|
|
|
|
|
}
|
|
|
|
@@ -681,6 +668,158 @@ private:
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//! \addtogroup Containers
|
|
|
|
|
//! \{
|
|
|
|
|
//! \class PIMapIterator
|
|
|
|
|
//! \brief
|
|
|
|
|
//! \~english Java-style iterator for \a PIMap.
|
|
|
|
|
//! \~russian Итератор Java стиля для \a PIMap.
|
|
|
|
|
//! \~\}
|
|
|
|
|
//! \details
|
|
|
|
|
//! \~english
|
|
|
|
|
//! This class used to easy serial access keys and values in PIMap with write permitions.
|
|
|
|
|
//! Use constructor to create iterator, or use \a PIMap::makeIterator()
|
|
|
|
|
//! \~russian
|
|
|
|
|
//! Этот класс используется для удобного перебора ключей и значений всего словаря с доступом на запись.
|
|
|
|
|
//! Можно использовать конструктор, в который передаётся словарь, или функцию словаря \a PIMap::makeIterator().
|
|
|
|
|
//! \~
|
|
|
|
|
//! \code
|
|
|
|
|
//! PIMap<int, PIString> m;
|
|
|
|
|
//! m[1] = "one";
|
|
|
|
|
//! m[2] = "two";
|
|
|
|
|
//! m[4] = "four";
|
|
|
|
|
//! auto it = m.makeIterator();
|
|
|
|
|
//! while (it.next()) {
|
|
|
|
|
//! it.value().append("_!");
|
|
|
|
|
//! piCout << it.key() << it.value();
|
|
|
|
|
//! }
|
|
|
|
|
//! // 1 one_!
|
|
|
|
|
//! // 2 two_!
|
|
|
|
|
//! // 4 four_!
|
|
|
|
|
//! \endcode
|
|
|
|
|
template <typename Key, typename T>
|
|
|
|
|
class PIMapIterator {
|
|
|
|
|
typedef PIMap<Key, T> MapType;
|
|
|
|
|
public:
|
|
|
|
|
PIMapIterator(PIMap<Key, T> & map): m(map), pos(-1) {}
|
|
|
|
|
|
|
|
|
|
//! \~english Returns current key.
|
|
|
|
|
//! \~russian Возвращает ключ текущего элемента.
|
|
|
|
|
//! \~\sa \a value()
|
|
|
|
|
const Key & key() const {
|
|
|
|
|
return m._key(pos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Returns current value.
|
|
|
|
|
//! \~russian Возвращает значение текущего элемента.
|
|
|
|
|
//! \~\sa \a key()
|
|
|
|
|
T & value() {
|
|
|
|
|
return m._value(pos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Returns true if iterator can jump to next entry
|
|
|
|
|
//! \~russian Возвращает true если итератор может перейти к следующему элементу.
|
|
|
|
|
//! \~\sa \a next()
|
|
|
|
|
inline bool hasNext() const {
|
|
|
|
|
return pos < (m.size_s() - 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Jump to next entry and return true if new position is valid.
|
|
|
|
|
//! \~russian Переходит к следующему элементу и возвращает true если он существует.
|
|
|
|
|
//! \~\sa \a hasNext(), \a reset()
|
|
|
|
|
inline bool next() {
|
|
|
|
|
++pos;
|
|
|
|
|
return pos < m.size_s();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Reset iterator to initial position.
|
|
|
|
|
//! \~russian Переходит на начало.
|
|
|
|
|
//! \~\sa \a next()
|
|
|
|
|
inline void reset() {
|
|
|
|
|
pos = -1;
|
|
|
|
|
}
|
|
|
|
|
private:
|
|
|
|
|
MapType & m;
|
|
|
|
|
ssize_t pos;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//! \addtogroup Containers
|
|
|
|
|
//! \{
|
|
|
|
|
//! \class PIMapIteratorReverse
|
|
|
|
|
//! \brief
|
|
|
|
|
//! \~english Java-style reverse iterator for \a PIMap.
|
|
|
|
|
//! \~russian Итератор Java стиля для \a PIMap в обратном порядке.
|
|
|
|
|
//! \~\}
|
|
|
|
|
//! \details
|
|
|
|
|
//! \~english
|
|
|
|
|
//! This class used to easy serial reverse access keys and values in PIMap with write permitions.
|
|
|
|
|
//! Use constructor to create iterator, or use \a PIMap::makeReverseIterator().
|
|
|
|
|
//! \~russian
|
|
|
|
|
//! Этот класс используется для удобного перебора ключей и значений всего словаря в обратном порядке с доступом на запись.
|
|
|
|
|
//! Можно использовать конструктор, в который передаётся словарь, или функцию словаря \a PIMap::makeReverseIterator().
|
|
|
|
|
//! \~
|
|
|
|
|
//! \code
|
|
|
|
|
//! PIMap<int, PIString> m;
|
|
|
|
|
//! m[1] = "one";
|
|
|
|
|
//! m[2] = "two";
|
|
|
|
|
//! m[4] = "four";
|
|
|
|
|
//! auto it = m.makeReverseIterator();
|
|
|
|
|
//! while (it.next()) {
|
|
|
|
|
//! it.value().append("_!");
|
|
|
|
|
//! piCout << it.key() << it.value();
|
|
|
|
|
//! }
|
|
|
|
|
//! // 4 four_!
|
|
|
|
|
//! // 2 two_!
|
|
|
|
|
//! // 1 one_!
|
|
|
|
|
//! \endcode
|
|
|
|
|
template <typename Key, typename T>
|
|
|
|
|
class PIMapIteratorReverse {
|
|
|
|
|
typedef PIMap<Key, T> MapType;
|
|
|
|
|
public:
|
|
|
|
|
PIMapIteratorReverse(PIMap<Key, T> & map): m(map), pos(m.size_s()) {}
|
|
|
|
|
|
|
|
|
|
//! \~english Returns current key.
|
|
|
|
|
//! \~russian Возвращает ключ текущего элемента.
|
|
|
|
|
//! \~\sa \a value()
|
|
|
|
|
const Key & key() const {
|
|
|
|
|
return m._key(pos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Returns current value.
|
|
|
|
|
//! \~russian Возвращает значение текущего элемента.
|
|
|
|
|
//! \~\sa \a key()
|
|
|
|
|
T & value() {
|
|
|
|
|
return m._value(pos);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Returns true if iterator can jump to next entry
|
|
|
|
|
//! \~russian Возвращает true если итератор может перейти к следующему элементу.
|
|
|
|
|
//! \~\sa \a next()
|
|
|
|
|
inline bool hasNext() const {
|
|
|
|
|
return pos > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Jump to next entry and return true if new position is valid.
|
|
|
|
|
//! \~russian Переходит к следующему элементу и возвращает true если он существует.
|
|
|
|
|
//! \~\sa \a hasNext(), \a reset()
|
|
|
|
|
inline bool next() {
|
|
|
|
|
--pos;
|
|
|
|
|
return pos >= 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//! \~english Reset iterator to initial position.
|
|
|
|
|
//! \~russian Переходит на начало.
|
|
|
|
|
//! \~\sa \a next()
|
|
|
|
|
inline void reset() {
|
|
|
|
|
pos = m.size_s();
|
|
|
|
|
}
|
|
|
|
|
private:
|
|
|
|
|
MapType & m;
|
|
|
|
|
ssize_t pos;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef PIP_STD_IOSTREAM
|
|
|
|
|
//! \~english Output operator to [std::ostream](https://en.cppreference.com/w/cpp/io/basic_ostream).
|
|
|
|
|
//! \~russian Оператор вывода в [std::ostream](https://ru.cppreference.com/w/cpp/io/basic_ostream).
|
|
|
|
|