PIMapIterators refactoring
PIChunkStream some refactoring
This commit is contained in:
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user