PIMapIterators refactoring
PIChunkStream some refactoring
This commit is contained in:
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0)
|
|||||||
cmake_policy(SET CMP0017 NEW) # need include() with .cmake
|
cmake_policy(SET CMP0017 NEW) # need include() with .cmake
|
||||||
project(pip)
|
project(pip)
|
||||||
set(pip_MAJOR 2)
|
set(pip_MAJOR 2)
|
||||||
set(pip_MINOR 98)
|
set(pip_MINOR 99)
|
||||||
set(pip_REVISION 0)
|
set(pip_REVISION 0)
|
||||||
set(pip_SUFFIX )
|
set(pip_SUFFIX )
|
||||||
set(pip_COMPANY SHS)
|
set(pip_COMPANY SHS)
|
||||||
|
|||||||
@@ -39,11 +39,10 @@
|
|||||||
#include "pipair.h"
|
#include "pipair.h"
|
||||||
|
|
||||||
|
|
||||||
template <typename Key, typename T>
|
template <typename Key, typename T> class PIMapIteratorConst;
|
||||||
class PIMapIterator;
|
template <typename Key, typename T> class PIMapIteratorConstReverse;
|
||||||
|
template <typename Key, typename T> class PIMapIterator;
|
||||||
template <typename Key, typename T>
|
template <typename Key, typename T> class PIMapIteratorReverse;
|
||||||
class PIMapReverseIterator;
|
|
||||||
|
|
||||||
|
|
||||||
//! \addtogroup Containers
|
//! \addtogroup Containers
|
||||||
@@ -77,8 +76,10 @@ class PIMapReverseIterator;
|
|||||||
//! и если такого эелемента не было, то он будет создан.
|
//! и если такого эелемента не было, то он будет создан.
|
||||||
template <typename Key, typename T>
|
template <typename Key, typename T>
|
||||||
class PIMap {
|
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 PIMapIterator;
|
||||||
template <typename Key1, typename T1> friend class PIMapReverseIterator;
|
template <typename Key1, typename T1> friend class PIMapIteratorReverse;
|
||||||
template <typename P, typename Key1, typename T1>
|
template <typename P, typename Key1, typename T1>
|
||||||
friend PIBinaryStream<P> & operator <<(PIBinaryStream<P> & s, const PIMap<Key1, T1> & v);
|
friend PIBinaryStream<P> & operator <<(PIBinaryStream<P> & s, const PIMap<Key1, T1> & v);
|
||||||
template <typename P, typename Key1, typename T1>
|
template <typename P, typename Key1, typename T1>
|
||||||
@@ -235,11 +236,17 @@ public:
|
|||||||
|
|
||||||
const_reverse_iterator constRend() const {return const_reverse_iterator(this, -1);}
|
const_reverse_iterator constRend() const {return const_reverse_iterator(this, -1);}
|
||||||
|
|
||||||
//! \relatesalso PIMapIterator
|
//! \relatesalso PIMapIteratorConst
|
||||||
PIMapIterator<Key, T> makeIterator() const {return PIMapIterator<Key, T>(*this);}
|
PIMapIteratorConst<Key, T> makeIterator() const {return PIMapIteratorConst<Key, T>(*this);}
|
||||||
|
|
||||||
//! \relatesalso PIMapReverseIterator
|
//! \relatesalso PIMapIterator
|
||||||
PIMapReverseIterator<Key, T> makeReverseIterator() const {return PIMapReverseIterator<Key, T>(*this);}
|
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();}
|
size_t size() const {return pim_content.size();}
|
||||||
|
|
||||||
@@ -512,18 +519,18 @@ private:
|
|||||||
|
|
||||||
//! \addtogroup Containers
|
//! \addtogroup Containers
|
||||||
//! \{
|
//! \{
|
||||||
//! \class PIMapIterator
|
//! \class PIMapIteratorConst
|
||||||
//! \brief
|
//! \brief
|
||||||
//! \~english Java-style iterator for \a PIMap.
|
//! \~english Java-style iterator for \a PIMap.
|
||||||
//! \~russian Итератор Java стиля для \a PIMap.
|
//! \~russian Итератор Java стиля для \a PIMap.
|
||||||
//! \~\}
|
//! \~\}
|
||||||
//! \details
|
//! \details
|
||||||
//! \~english
|
//! \~english
|
||||||
//! This class used to easy serial access keys and values in PIMap.
|
//! This class used to easy serial access keys and values in PIMap with read only permitions.
|
||||||
//! You can use constructor to create iterator, or use \a PIMap::makeIterator()
|
//! Use constructor to create iterator, or use \a PIMap::makeIterator()
|
||||||
//! \~russian
|
//! \~russian
|
||||||
//! Этот класс используется для удобного перебора ключей и значений всего словаря в обратном порядке.
|
//! Этот класс используется для удобного перебора ключей и значений всего словаря только для чтения.
|
||||||
//! Ты можешь использовать конструктор, в который передать словарь, или функцию словаря \a PIMap::makeReverseIterator().
|
//! Можно использовать конструктор, в который передаётся словарь, или функцию словаря \a PIMap::makeIterator().
|
||||||
//! \~
|
//! \~
|
||||||
//! \code
|
//! \code
|
||||||
//! PIMap<int, PIString> m;
|
//! PIMap<int, PIString> m;
|
||||||
@@ -533,46 +540,42 @@ private:
|
|||||||
//! auto it = m.makeIterator();
|
//! auto it = m.makeIterator();
|
||||||
//! while (it.next()) {
|
//! while (it.next()) {
|
||||||
//! piCout << it.key() << it.value();
|
//! piCout << it.key() << it.value();
|
||||||
|
//! }
|
||||||
//! // 1 one
|
//! // 1 one
|
||||||
//! // 2 two
|
//! // 2 two
|
||||||
//! // 4 four
|
//! // 4 four
|
||||||
//! \endcode
|
//! \endcode
|
||||||
template <typename Key, typename T>
|
template <typename Key, typename T>
|
||||||
class PIMapIterator {
|
class PIMapIteratorConst {
|
||||||
typedef PIMap<Key, T> MapType;
|
typedef PIMap<Key, T> MapType;
|
||||||
public:
|
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.
|
//! \~english Returns current key.
|
||||||
//! \~russian Возвращает ключ текущего элемента.
|
//! \~russian Возвращает ключ текущего элемента.
|
||||||
//! \~\sa \a value(), \a valueRef()
|
//! \~\sa \a value()
|
||||||
const Key & key() const {
|
const Key & key() const {
|
||||||
return m._key(pos);
|
return m._key(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! \~english Returns current value.
|
//! \~english Returns current value.
|
||||||
//! \~russian Возвращает значение текущего элемента.
|
//! \~russian Возвращает значение текущего элемента.
|
||||||
//! \~\sa \a key(), \a valueRef()
|
//! \~\sa \a key()
|
||||||
const T & value() const {
|
const T & value() const {
|
||||||
return m._value(pos);
|
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
|
//! \~english Returns true if iterator can jump to next entry
|
||||||
//! \~russian Возвращает true если итератор может перейти к следующему элементу.
|
//! \~russian Возвращает true если итератор может перейти к следующему элементу.
|
||||||
|
//! \~\sa \a next()
|
||||||
inline bool hasNext() const {
|
inline bool hasNext() const {
|
||||||
return pos < (m.size_s() - 1);
|
return pos < (m.size_s() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! \~english Jump to next entry and return true if new position is valid.
|
//! \~english Jump to next entry and return true if new position is valid.
|
||||||
//! \~russian Переходит к следующему элементу и возвращает true если он существует.
|
//! \~russian Переходит к следующему элементу и возвращает true если он существует.
|
||||||
|
//! \~\sa \a hasNext(), \a reset()
|
||||||
inline bool next() {
|
inline bool next() {
|
||||||
++pos;
|
++pos;
|
||||||
return pos < m.size_s();
|
return pos < m.size_s();
|
||||||
@@ -580,6 +583,7 @@ public:
|
|||||||
|
|
||||||
//! \~english Reset iterator to initial position.
|
//! \~english Reset iterator to initial position.
|
||||||
//! \~russian Переходит на начало.
|
//! \~russian Переходит на начало.
|
||||||
|
//! \~\sa \a next()
|
||||||
inline void reset() {
|
inline void reset() {
|
||||||
pos = -1;
|
pos = -1;
|
||||||
}
|
}
|
||||||
@@ -591,18 +595,18 @@ private:
|
|||||||
|
|
||||||
//! \addtogroup Containers
|
//! \addtogroup Containers
|
||||||
//! \{
|
//! \{
|
||||||
//! \class PIMapReverseIterator
|
//! \class PIMapIteratorConstReverse
|
||||||
//! \brief
|
//! \brief
|
||||||
//! \~english Java-style reverse iterator for \a PIMap.
|
//! \~english Java-style reverse iterator for \a PIMap.
|
||||||
//! \~russian Итератор Java стиля для \a PIMap в обратном порядке.
|
//! \~russian Итератор Java стиля для \a PIMap в обратном порядке.
|
||||||
//! \~\}
|
//! \~\}
|
||||||
//! \details
|
//! \details
|
||||||
//! \~english
|
//! \~english
|
||||||
//! This class used to easy serial reverse access keys and values in PIMap.
|
//! This class used to easy serial reverse access keys and values in PIMap with read only permitions.
|
||||||
//! You can use constructor to create iterator, or use \a PIMap::makeReverseIterator().
|
//! Use constructor to create iterator, or use \a PIMap::makeReverseIterator().
|
||||||
//! \~russian
|
//! \~russian
|
||||||
//! Этот класс используется для удобного перебора ключей и значений всего словаря в обратном порядке.
|
//! Этот класс используется для удобного перебора ключей и значений всего словаря в обратном порядке только для чтения.
|
||||||
//! Ты можешь использовать конструктор, в который передать словарь, или функцию словаря \a PIMap::makeReverseIterator().
|
//! Можно использовать конструктор, в который передаётся словарь, или функцию словаря \a PIMap::makeReverseIterator().
|
||||||
//! \~
|
//! \~
|
||||||
//! \code
|
//! \code
|
||||||
//! PIMap<int, PIString> m;
|
//! PIMap<int, PIString> m;
|
||||||
@@ -617,54 +621,36 @@ private:
|
|||||||
//! // 2 two
|
//! // 2 two
|
||||||
//! // 1 one
|
//! // 1 one
|
||||||
//! \endcode
|
//! \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>
|
template <typename Key, typename T>
|
||||||
class PIMapReverseIterator {
|
class PIMapIteratorConstReverse {
|
||||||
typedef PIMap<Key, T> MapType;
|
typedef PIMap<Key, T> MapType;
|
||||||
public:
|
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.
|
//! \~english Returns current key.
|
||||||
//! \~russian Возвращает ключ текущего элемента.
|
//! \~russian Возвращает ключ текущего элемента.
|
||||||
//! \~\sa \a value(), \a valueRef()
|
//! \~\sa \a value()
|
||||||
const Key & key() const {
|
const Key & key() const {
|
||||||
return m._key(pos);
|
return m._key(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! \~english Returns current value.
|
//! \~english Returns current value.
|
||||||
//! \~russian Возвращает значение текущего элемента.
|
//! \~russian Возвращает значение текущего элемента.
|
||||||
//! \~\sa \a key(), \a valueRef()
|
//! \~\sa \a key()
|
||||||
const T & value() const {
|
const T & value() const {
|
||||||
return m._value(pos);
|
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
|
//! \~english Returns true if iterator can jump to next entry
|
||||||
//! \~russian Возвращает true если итератор может перейти к следующему элементу.
|
//! \~russian Возвращает true если итератор может перейти к следующему элементу.
|
||||||
|
//! \~\sa \a next()
|
||||||
inline bool hasNext() const {
|
inline bool hasNext() const {
|
||||||
return pos > 0;
|
return pos > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! \~english Jump to next entry and return true if new position is valid.
|
//! \~english Jump to next entry and return true if new position is valid.
|
||||||
//! \~russian Переходит к следующему элементу и возвращает true если он существует.
|
//! \~russian Переходит к следующему элементу и возвращает true если он существует.
|
||||||
|
//! \~\sa \a hasNext(), \a reset()
|
||||||
inline bool next() {
|
inline bool next() {
|
||||||
--pos;
|
--pos;
|
||||||
return pos >= 0;
|
return pos >= 0;
|
||||||
@@ -672,6 +658,7 @@ public:
|
|||||||
|
|
||||||
//! \~english Reset iterator to initial position.
|
//! \~english Reset iterator to initial position.
|
||||||
//! \~russian Переходит на начало.
|
//! \~russian Переходит на начало.
|
||||||
|
//! \~\sa \a next()
|
||||||
inline void reset() {
|
inline void reset() {
|
||||||
pos = m.size_s();
|
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
|
#ifdef PIP_STD_IOSTREAM
|
||||||
//! \~english Output operator to [std::ostream](https://en.cppreference.com/w/cpp/io/basic_ostream).
|
//! \~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).
|
//! \~russian Оператор вывода в [std::ostream](https://ru.cppreference.com/w/cpp/io/basic_ostream).
|
||||||
|
|||||||
@@ -125,15 +125,14 @@ int PIChunkStream::read() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int PIChunkStream::peekVInt(Version version_, PIByteArray * data_, int pos, PIByteArray & hdr, uint & ret) {
|
int PIChunkStream::peekVInt(Version version_, uchar * data_, int sz, uint & ret) {
|
||||||
switch (version_) {
|
switch (version_) {
|
||||||
case Version_1:
|
case Version_1:
|
||||||
memcpy(&ret, data_->data(pos), 4);
|
memcpy(&ret, data_, 4);
|
||||||
return 4;
|
return 4;
|
||||||
case Version_2: {
|
case Version_2: {
|
||||||
|
PIByteArray hdr(data_, piMini(4, sz));
|
||||||
hdr.resize(4);
|
hdr.resize(4);
|
||||||
hdr.fill(uchar(0));
|
|
||||||
memcpy(hdr.data(), data_->data(pos), piMini(4, data_->size_s() - pos));
|
|
||||||
uchar hsz = 0;
|
uchar hsz = 0;
|
||||||
ret = readVInt(hdr, &hsz);
|
ret = readVInt(hdr, &hsz);
|
||||||
return hsz;
|
return hsz;
|
||||||
@@ -153,14 +152,17 @@ void PIChunkStream::replaceChunk(int id, const PIByteArray & v) {
|
|||||||
pos.length = v.size_s();
|
pos.length = v.size_s();
|
||||||
if (size_mod != 0) {
|
if (size_mod != 0) {
|
||||||
auto it = data_map.makeIterator();
|
auto it = data_map.makeIterator();
|
||||||
while (it.next())
|
while (it.next()) {
|
||||||
if (it.valueRef().start > pos.start)
|
if (it.value().start > pos.start) {
|
||||||
it.valueRef().start += size_mod;
|
it.value().start += size_mod;
|
||||||
if (size_mod > 0)
|
}
|
||||||
|
}
|
||||||
|
if (size_mod > 0) {
|
||||||
data_->insert(pos.start, PIByteArray(size_mod));
|
data_->insert(pos.start, PIByteArray(size_mod));
|
||||||
else
|
} else {
|
||||||
data_->remove(pos.start, -size_mod);
|
data_->remove(pos.start, -size_mod);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
memcpy(data_->data(pos.start - pos.size_bytes), nsba.data(), nsba.size());
|
memcpy(data_->data(pos.start - pos.size_bytes), nsba.data(), nsba.size());
|
||||||
pos.start += nsba.size_s() - pos.size_bytes;
|
pos.start += nsba.size_s() - pos.size_bytes;
|
||||||
memcpy(data_->data(pos.start), v.data(), pos.length);
|
memcpy(data_->data(pos.start), v.data(), pos.length);
|
||||||
@@ -172,10 +174,9 @@ void PIChunkStream::readAll() {
|
|||||||
if (!data_) return;
|
if (!data_) return;
|
||||||
int pos = 0, sz = data_->size_s(), hsz = 0;
|
int pos = 0, sz = data_->size_s(), hsz = 0;
|
||||||
uint csz = 0, cid = 0;
|
uint csz = 0, cid = 0;
|
||||||
PIByteArray hdr;
|
|
||||||
while (pos < sz) {
|
while (pos < sz) {
|
||||||
pos += peekVInt((Version)version_, data_, pos, hdr, cid);
|
pos += peekVInt((Version)version_, data_->data(pos), data_->size_s() - pos, cid);
|
||||||
hsz = peekVInt((Version)version_, data_, pos, hdr, csz);
|
hsz = peekVInt((Version)version_, data_->data(pos), data_->size_s() - pos, csz);
|
||||||
pos += hsz;
|
pos += hsz;
|
||||||
data_map[cid] = CacheEntry(pos, csz, hsz);
|
data_map[cid] = CacheEntry(pos, csz, hsz);
|
||||||
pos += csz;
|
pos += csz;
|
||||||
@@ -193,8 +194,7 @@ bool PIChunkStream::extract(PIByteArray & data, bool read_all) {
|
|||||||
if (tmp_data.size_s() < 4) return false;
|
if (tmp_data.size_s() < 4) return false;
|
||||||
data_ = &tmp_data;
|
data_ = &tmp_data;
|
||||||
_init();
|
_init();
|
||||||
if (read_all)
|
if (read_all) readAll();
|
||||||
readAll();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,19 +208,27 @@ void PIChunkStream::_init() {
|
|||||||
if ((v & 0x80) == 0x80) {
|
if ((v & 0x80) == 0x80) {
|
||||||
v &= 0x7f;
|
v &= 0x7f;
|
||||||
switch (v) {
|
switch (v) {
|
||||||
case 2: version_ = (uchar)Version_2; data_->pop_front(); first_byte_taken = true; break;
|
case 2:
|
||||||
default: version_ = Version_1; break;
|
version_ = (uchar)Version_2;
|
||||||
}
|
data_->pop_front();
|
||||||
} else
|
first_byte_taken = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
version_ = Version_1;
|
version_ = Version_1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
version_ = Version_1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint PIChunkStream::readVInt(PIByteArray & s, uchar * bytes_cnt) {
|
uint PIChunkStream::readVInt(PIByteArray & s, uchar * bytes_cnt) {
|
||||||
if (s.isEmpty()) return 0;
|
if (s.isEmpty()) return 0;
|
||||||
uchar bytes[4]; s >> bytes[0];
|
uchar bytes[4];
|
||||||
uchar abc = 0;
|
uchar abc;
|
||||||
|
s >> bytes[0];
|
||||||
for (abc = 0; abc < 3; ++abc) {
|
for (abc = 0; abc < 3; ++abc) {
|
||||||
uchar mask = (0x80 >> abc);
|
uchar mask = (0x80 >> abc);
|
||||||
if ((bytes[0] & mask) == mask) {
|
if ((bytes[0] & mask) == mask) {
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ private:
|
|||||||
|
|
||||||
static uint readVInt(PIByteArray & s, uchar * bytes = 0);
|
static uint readVInt(PIByteArray & s, uchar * bytes = 0);
|
||||||
static void writeVInt(PIByteArray & s, uint val);
|
static void writeVInt(PIByteArray & s, uint val);
|
||||||
static int peekVInt(Version version_, PIByteArray * data_, int pos, PIByteArray & hdr, uint & ret);
|
static int peekVInt(Version version_, uchar * data_, int sz, uint & ret);
|
||||||
void replaceChunk(int id, const PIByteArray & v);
|
void replaceChunk(int id, const PIByteArray & v);
|
||||||
|
|
||||||
int last_id;
|
int last_id;
|
||||||
|
|||||||
@@ -140,8 +140,8 @@ PIByteArray PIIntrospection::packThreads() {
|
|||||||
PIMap<PIThread*, PIIntrospectionThreads::ThreadInfo> & tm(p->threads);
|
PIMap<PIThread*, PIIntrospectionThreads::ThreadInfo> & tm(p->threads);
|
||||||
auto it = tm.makeIterator();
|
auto it = tm.makeIterator();
|
||||||
while (it.next()) {
|
while (it.next()) {
|
||||||
it.valueRef().classname = PIStringAscii(it.key()->className());
|
it.value().classname = PIStringAscii(it.key()->className());
|
||||||
it.valueRef().name = it.key()->name();
|
it.value().name = it.key()->name();
|
||||||
}
|
}
|
||||||
ret << tm.values();
|
ret << tm.values();
|
||||||
p->mutex.unlock();
|
p->mutex.unlock();
|
||||||
|
|||||||
@@ -393,7 +393,7 @@ bool PIConnection::removeDevice(const PIString & full_path) {
|
|||||||
channels_.remove(dev);
|
channels_.remove(dev);
|
||||||
auto it = channels_.makeIterator();
|
auto it = channels_.makeIterator();
|
||||||
while (it.next()) {
|
while (it.next()) {
|
||||||
it.valueRef().removeAll(dev);
|
it.value().removeAll(dev);
|
||||||
}
|
}
|
||||||
__device_pool__->lock();
|
__device_pool__->lock();
|
||||||
PIDiagnostics * dg = diags_.value(dev, nullptr);
|
PIDiagnostics * dg = diags_.value(dev, nullptr);
|
||||||
@@ -418,7 +418,7 @@ void PIConnection::removeAllDevices() {
|
|||||||
channels_.remove(d);
|
channels_.remove(d);
|
||||||
auto it = channels_.makeIterator();
|
auto it = channels_.makeIterator();
|
||||||
while (it.next()) {
|
while (it.next()) {
|
||||||
it.valueRef().removeAll(d);
|
it.value().removeAll(d);
|
||||||
}
|
}
|
||||||
PIDiagnostics * dg = diags_.value(d, nullptr);
|
PIDiagnostics * dg = diags_.value(d, nullptr);
|
||||||
if (dg) delete dg;
|
if (dg) delete dg;
|
||||||
@@ -572,7 +572,7 @@ void PIConnection::removeAllFilters() {
|
|||||||
channels_.remove(i.value()->extractor);
|
channels_.remove(i.value()->extractor);
|
||||||
auto it = channels_.makeIterator();
|
auto it = channels_.makeIterator();
|
||||||
while (it.next()) {
|
while (it.next()) {
|
||||||
it.valueRef().removeAll(i.value()->extractor);
|
it.value().removeAll(i.value()->extractor);
|
||||||
}
|
}
|
||||||
if (diags_.value(i.value()->extractor)) {
|
if (diags_.value(i.value()->extractor)) {
|
||||||
delete diags_.value(i.value()->extractor);
|
delete diags_.value(i.value()->extractor);
|
||||||
@@ -677,7 +677,7 @@ bool PIConnection::removeChannel(const PIString & name0) {
|
|||||||
channels_.remove(dev0);
|
channels_.remove(dev0);
|
||||||
auto it = channels_.makeIterator();
|
auto it = channels_.makeIterator();
|
||||||
while (it.next()) {
|
while (it.next()) {
|
||||||
it.valueRef().removeAll(dev0);
|
it.value().removeAll(dev0);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1234,7 +1234,7 @@ void PIConnection::unboundExtractor(PIPacketExtractor * pe) {
|
|||||||
channels_.remove(pe);
|
channels_.remove(pe);
|
||||||
auto it = channels_.makeIterator();
|
auto it = channels_.makeIterator();
|
||||||
while (it.next()) {
|
while (it.next()) {
|
||||||
it.valueRef().removeAll(pe);
|
it.value().removeAll(pe);
|
||||||
}
|
}
|
||||||
bounded_extractors.remove(pe);
|
bounded_extractors.remove(pe);
|
||||||
PIVector<PIIODevice * > k = bounded_extractors.keys();
|
PIVector<PIIODevice * > k = bounded_extractors.keys();
|
||||||
|
|||||||
@@ -321,7 +321,7 @@ void PISystemMonitor::run() {
|
|||||||
auto i = cur_tm.makeIterator();
|
auto i = cur_tm.makeIterator();
|
||||||
while (i.next()) {
|
while (i.next()) {
|
||||||
if (!last_tm.contains(i.key())) continue;
|
if (!last_tm.contains(i.key())) continue;
|
||||||
ThreadStats & ts_new(i.valueRef());
|
ThreadStats & ts_new(i.value());
|
||||||
ThreadStats & ts_old(last_tm[i.key()]);
|
ThreadStats & ts_old(last_tm[i.key()]);
|
||||||
ts_new.cpu_load_kernel = calcThreadUsage(ts_new.kernel_time, ts_old.kernel_time);
|
ts_new.cpu_load_kernel = calcThreadUsage(ts_new.kernel_time, ts_old.kernel_time);
|
||||||
ts_new.cpu_load_user = calcThreadUsage(ts_new.user_time, ts_old.user_time);
|
ts_new.cpu_load_user = calcThreadUsage(ts_new.user_time, ts_old.user_time);
|
||||||
|
|||||||
@@ -663,7 +663,7 @@ int main(int argc, char * argv[]) {
|
|||||||
|
|
||||||
auto it = qt_filters.makeIterator();
|
auto it = qt_filters.makeIterator();
|
||||||
while (it.next())
|
while (it.next())
|
||||||
it.valueRef().forEach([](PIString & i){
|
it.value().forEach([](PIString & i){
|
||||||
if (!i.startsWith("*")) i.prepend("*");
|
if (!i.startsWith("*")) i.prepend("*");
|
||||||
if (!i.endsWith("*")) i.append("*");
|
if (!i.endsWith("*")) i.append("*");
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user