@@ -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 PIMapReverse Iterator ;
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 PIMapReverse Iterator
PIMapReverse Iterator < Key , T > makeReverse Iterator ( ) const { return PIMapReverse Iterator < 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 u se 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 .
//! U se constructor to create iterator, or use \a PIMap::makeIterator()
//! \~russian
//! Этот класс используется для удобного перебора ключей и значений всего словаря в обратном порядке .
//! Ты можешь использовать конструктор, в который передать словарь, или функцию словаря \a PIMap::makeReverse Iterator().
//! Этот класс используется для удобного перебора ключей и значений всего словаря только для чтения .
//! Можно использовать конструктор, в который передаётся словарь, или функцию словаря \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 PIMapReverse Iterator
//! \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 u se 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 .
//! U se 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 PIMapReverse Iterator {
class PIMapIteratorConstReverse {
typedef PIMap < Key , T > MapType ;
public :
PIMapReverse Iterator ( 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).