merged AI doc, some new pages
This commit is contained in:
@@ -34,40 +34,64 @@
|
||||
|
||||
#define PIP_BINARY_STREAM
|
||||
|
||||
#define BINARY_STREAM_FRIEND(T) \
|
||||
template<typename P> \
|
||||
friend PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T & v); \
|
||||
template<typename P> \
|
||||
friend PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T & v);
|
||||
#define BINARY_STREAM_WRITE(T) \
|
||||
template<typename P> \
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T & v)
|
||||
#define BINARY_STREAM_READ(T) \
|
||||
template<typename P> \
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T & v)
|
||||
#ifdef DOXYGEN
|
||||
|
||||
|
||||
//! \ingroup Serialization
|
||||
//! \relatesalso PIBinaryStream
|
||||
//! \~\brief
|
||||
//! \~english Binary serialization interface.
|
||||
//! \~russian Интерфейс бинарной сериализации.
|
||||
//! \~english Declares templated binary stream operators as friends of \c T.
|
||||
//! \~russian Объявляет шаблонные операторы бинарного потока дружественными для \c T.
|
||||
# define BINARY_STREAM_FRIEND(T)
|
||||
|
||||
//! \relatesalso PIBinaryStream
|
||||
//! \~\brief
|
||||
//! \~english Starts definition of a templated binary write operator for \c T.
|
||||
//! \~russian Начинает определение шаблонного оператора записи в бинарный поток для \c T.
|
||||
# define BINARY_STREAM_WRITE(T)
|
||||
|
||||
//! \relatesalso PIBinaryStream
|
||||
//! \~\brief
|
||||
//! \~english Starts definition of a templated binary read operator for \c T.
|
||||
//! \~russian Начинает определение шаблонного оператора чтения из бинарного потока для \c T.
|
||||
# define BINARY_STREAM_READ(T)
|
||||
|
||||
#else
|
||||
|
||||
# define BINARY_STREAM_FRIEND(T) \
|
||||
template<typename P> \
|
||||
friend PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T & v); \
|
||||
template<typename P> \
|
||||
friend PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T & v);
|
||||
# define BINARY_STREAM_WRITE(T) \
|
||||
template<typename P> \
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T & v)
|
||||
# define BINARY_STREAM_READ(T) \
|
||||
template<typename P> \
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T & v)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
//! \~\ingroup Serialization
|
||||
//! \~\brief
|
||||
//! \~english CRTP interface for binary serialization streams.
|
||||
//! \~russian CRTP-интерфейс для потоков бинарной сериализации.
|
||||
//! \~\details
|
||||
//! \~english In your class you should implement this methods:
|
||||
//! \~russian В производном классе вы должны реализовать следующие методы:
|
||||
//! \~english
|
||||
//! Derived stream classes should implement:
|
||||
//! \~\code
|
||||
//! bool binaryStreamAppendImp (const void * d, size_t s);
|
||||
//! bool binaryStreamTakeImp (void * d, size_t s);
|
||||
//! ssize_t binaryStreamSizeImp () const;
|
||||
//! \endcode
|
||||
//! \~english Function binaryStreamSizeImp should return -1 if size unknown.
|
||||
//! \~russian Функция binaryStreamSizeImp должна возвращать -1 если нет информации о размере.
|
||||
//! \~english See details \ref iostream.
|
||||
//! \~russian Подробнее \ref iostream.
|
||||
//! \a binaryStreamSizeImp() should return \c -1 when the remaining size is unknown. See details \ref iostream.
|
||||
//! \~russian
|
||||
//! Производные классы потока должны реализовать методы из примера выше. \a binaryStreamSizeImp() должен возвращать \c -1, когда оставшийся
|
||||
//! размер неизвестен. Подробнее \ref iostream.
|
||||
template<typename P>
|
||||
class PIBinaryStream {
|
||||
public:
|
||||
//! \~english Write data
|
||||
//! \~russian Записать данные
|
||||
//! \~english Writes raw bytes to the underlying stream.
|
||||
//! \~russian Записывает сырые байты в нижележащий поток.
|
||||
bool binaryStreamAppend(const void * d, size_t s) {
|
||||
if (!static_cast<P *>(this)->binaryStreamAppendImp(d, s)) {
|
||||
return false;
|
||||
@@ -76,8 +100,8 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
//! \~english Read data
|
||||
//! \~russian Прочитать данные
|
||||
//! \~english Reads raw bytes from the underlying stream and sets read error state on short reads.
|
||||
//! \~russian Читает сырые байты из нижележащего потока и устанавливает состояние ошибки чтения при неполном чтении.
|
||||
bool binaryStreamTake(void * d, size_t s) {
|
||||
if (!static_cast<P *>(this)->binaryStreamTakeImp(d, s)) {
|
||||
_was_read_error_ = true;
|
||||
@@ -87,22 +111,24 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
//! \~english Returns remain size
|
||||
//! \~russian Возвращает оставшийся размер
|
||||
//! \~english Returns remaining readable byte count.
|
||||
//! \~russian Возвращает число байтов, доступных для чтения.
|
||||
//! \~\details
|
||||
//! \~english Returns -1 if no information about size
|
||||
//! \~russian Возвращает -1 если нет информации о размере
|
||||
//! \~english
|
||||
//! Returns \c -1 when the stream cannot report its remaining size.
|
||||
//! \~russian
|
||||
//! Возвращает \c -1, если поток не может сообщить оставшийся размер.
|
||||
ssize_t binaryStreamSize() const { return static_cast<const P *>(this)->binaryStreamSizeImp(); }
|
||||
|
||||
//! \~english Write data
|
||||
//! \~russian Записать данные
|
||||
//! \~english Writes one trivially copied value as raw bytes.
|
||||
//! \~russian Записывает одно значение прямым копированием его байтов.
|
||||
template<typename T>
|
||||
void binaryStreamAppend(T v) {
|
||||
binaryStreamAppend(&v, sizeof(v));
|
||||
}
|
||||
|
||||
//! \~english Read int
|
||||
//! \~russian Прочитать int
|
||||
//! \~english Reads one \c int value from the stream.
|
||||
//! \~russian Читает одно значение \c int из потока.
|
||||
int binaryStreamTakeInt() {
|
||||
int r = 0;
|
||||
binaryStreamTake(&r, sizeof(r));
|
||||
@@ -122,32 +148,50 @@ private:
|
||||
};
|
||||
|
||||
|
||||
// helper class to detect default operators
|
||||
//! \~\ingroup Serialization
|
||||
//! \~\brief
|
||||
//! \~english Helper wrapper used to detect default trivial streaming operators.
|
||||
//! \~russian Вспомогательная обертка для определения операторов потоковой обработки тривиальных типов по умолчанию.
|
||||
//! \~english Helper class to detect default operators
|
||||
//! \~russian Вспомогательный класс для обнаружения операторов по умолчанию
|
||||
template<typename P>
|
||||
class PIBinaryStreamTrivialRef {
|
||||
public:
|
||||
//! \~english Constructs helper reference for stream \a s.
|
||||
//! \~russian Создает вспомогательную ссылку на поток \a s.
|
||||
PIBinaryStreamTrivialRef(PIBinaryStream<P> & s): p(s) {}
|
||||
|
||||
//! \~english Referenced stream.
|
||||
//! \~russian Связанный поток.
|
||||
PIBinaryStream<P> & p;
|
||||
};
|
||||
|
||||
|
||||
template<typename P, typename T>
|
||||
//! \~english Forwards write operation through %PIBinaryStreamTrivialRef.
|
||||
//! \~russian Перенаправляет операцию записи через %PIBinaryStreamTrivialRef.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStreamTrivialRef<P> s, const T & v) {
|
||||
s.p << v;
|
||||
return s.p;
|
||||
}
|
||||
template<typename P, typename T>
|
||||
//! \~english Forwards read operation through %PIBinaryStreamTrivialRef.
|
||||
//! \~russian Перенаправляет операцию чтения через %PIBinaryStreamTrivialRef.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStreamTrivialRef<P> s, T & v) {
|
||||
s.p >> v;
|
||||
return s.p;
|
||||
}
|
||||
|
||||
template<typename P>
|
||||
//! \~english Forwards raw memory block write through %PIBinaryStreamTrivialRef.
|
||||
//! \~russian Перенаправляет запись блока памяти через %PIBinaryStreamTrivialRef.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStreamTrivialRef<P> s, const PIMemoryBlock v) {
|
||||
s.p << v;
|
||||
return s.p;
|
||||
}
|
||||
template<typename P>
|
||||
//! \~english Forwards raw memory block read through %PIBinaryStreamTrivialRef.
|
||||
//! \~russian Перенаправляет чтение блока памяти через %PIBinaryStreamTrivialRef.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStreamTrivialRef<P> s, PIMemoryBlock v) {
|
||||
s.p >> v;
|
||||
return s.p;
|
||||
@@ -156,11 +200,15 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStreamTrivialRef<P> s, PIMemoryBlo
|
||||
|
||||
// specify types
|
||||
template<typename P>
|
||||
//! \~english Stores \c bool as one unsigned byte.
|
||||
//! \~russian Сохраняет \c bool как один беззнаковый байт.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const bool v) {
|
||||
s.binaryStreamAppend((uchar)v);
|
||||
return s;
|
||||
}
|
||||
template<typename P>
|
||||
//! \~english Restores \c bool from one unsigned byte.
|
||||
//! \~russian Восстанавливает \c bool из одного беззнакового байта.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, bool & v) {
|
||||
uchar c = 0;
|
||||
s.binaryStreamTake(&c, sizeof(c));
|
||||
@@ -169,11 +217,15 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, bool & v) {
|
||||
}
|
||||
|
||||
template<typename P>
|
||||
//! \~english Writes raw bytes from %PIMemoryBlock.
|
||||
//! \~russian Записывает сырые байты из %PIMemoryBlock.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIMemoryBlock v) {
|
||||
s.binaryStreamAppend(v.data(), v.size());
|
||||
return s;
|
||||
}
|
||||
template<typename P>
|
||||
//! \~english Reads raw bytes into %PIMemoryBlock.
|
||||
//! \~russian Читает сырые байты в %PIMemoryBlock.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIMemoryBlock v) {
|
||||
s.binaryStreamTake(v.data(), v.size());
|
||||
return s;
|
||||
@@ -184,6 +236,8 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIMemoryBlock v) {
|
||||
|
||||
|
||||
template<typename P, typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
|
||||
//! \~english Stores enum values as \c int.
|
||||
//! \~russian Сохраняет значения перечислений как \c int.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T & v) {
|
||||
// piCout << "<< enum";
|
||||
s.binaryStreamAppend((int)v);
|
||||
@@ -195,14 +249,17 @@ template<typename P,
|
||||
typename T,
|
||||
typename std::enable_if<!std::is_enum<T>::value, int>::type = 0,
|
||||
typename std::enable_if<std::is_trivially_copyable<T>::value, int>::type = 0>
|
||||
//! \~english Stores trivially copyable values by raw memory copy and returns a helper marker for bulk container paths.
|
||||
//! \~russian Сохраняет тривиально копируемые значения прямым копированием памяти и возвращает вспомогательный маркер для контейнерных путей
|
||||
//! с пакетной записью.
|
||||
inline PIBinaryStreamTrivialRef<P> operator<<(PIBinaryStream<P> & s, const T & v) {
|
||||
s.binaryStreamAppend(&v, sizeof(v));
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
//! \~english Store operator for PIVector of any trivial copyable type
|
||||
//! \~russian Оператор сохранения для PIVector тривиальных типов
|
||||
//! \~english Stores %PIVector of trivial elements in bulk.
|
||||
//! \~russian Сохраняет %PIVector из тривиальных элементов пакетно.
|
||||
template<typename P,
|
||||
typename T,
|
||||
typename std::enable_if<std::is_trivially_copyable<T>::value, int>::type = 0,
|
||||
@@ -221,6 +278,8 @@ template<typename P,
|
||||
typename std::enable_if<
|
||||
!std::is_same<decltype(std::declval<PIBinaryStream<P> &>() << std::declval<const T &>()), PIBinaryStreamTrivialRef<P>>::value,
|
||||
int>::type = 0>
|
||||
//! \~english Stores %PIVector element-by-element when the element type has custom binary streaming.
|
||||
//! \~russian Сохраняет %PIVector поэлементно, когда тип элемента использует собственные операторы бинарного потока.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIVector<T> & v) {
|
||||
// piCout << "<< vector trivial custom";
|
||||
s.binaryStreamAppend((int)v.size());
|
||||
@@ -230,14 +289,14 @@ inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIVector<T> &
|
||||
}
|
||||
|
||||
|
||||
//! \~english Store operator for PIDeque of any trivial copyable type
|
||||
//! \~russian Оператор сохранения для PIDeque тривиальных типов
|
||||
template<typename P,
|
||||
typename T,
|
||||
typename std::enable_if<std::is_trivially_copyable<T>::value, int>::type = 0,
|
||||
typename std::enable_if<
|
||||
std::is_same<decltype(std::declval<PIBinaryStream<P> &>() << std::declval<const T &>()), PIBinaryStreamTrivialRef<P>>::value,
|
||||
int>::type = 0>
|
||||
//! \~english Stores %PIDeque of trivial elements in bulk.
|
||||
//! \~russian Сохраняет %PIDeque из тривиальных элементов пакетно.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIDeque<T> & v) {
|
||||
// piCout << "<< deque trivial default";
|
||||
s.binaryStreamAppend((int)v.size());
|
||||
@@ -250,6 +309,8 @@ template<typename P,
|
||||
typename std::enable_if<
|
||||
!std::is_same<decltype(std::declval<PIBinaryStream<P> &>() << std::declval<const T &>()), PIBinaryStreamTrivialRef<P>>::value,
|
||||
int>::type = 0>
|
||||
//! \~english Stores %PIDeque element-by-element when the element type has custom binary streaming.
|
||||
//! \~russian Сохраняет %PIDeque поэлементно, когда тип элемента использует собственные операторы бинарного потока.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIDeque<T> & v) {
|
||||
// piCout << "<< deque trivial custom";
|
||||
s.binaryStreamAppend((int)v.size());
|
||||
@@ -259,14 +320,14 @@ inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIDeque<T> &
|
||||
}
|
||||
|
||||
|
||||
//! \~english Store operator for PIVector2D of any trivial copyable type
|
||||
//! \~russian Оператор сохранения для PIVector2D тривиальных типов
|
||||
template<typename P,
|
||||
typename T,
|
||||
typename std::enable_if<std::is_trivially_copyable<T>::value, int>::type = 0,
|
||||
typename std::enable_if<
|
||||
std::is_same<decltype(std::declval<PIBinaryStream<P> &>() << std::declval<const T &>()), PIBinaryStreamTrivialRef<P>>::value,
|
||||
int>::type = 0>
|
||||
//! \~english Stores %PIVector2D of trivial elements in bulk.
|
||||
//! \~russian Сохраняет %PIVector2D из тривиальных элементов пакетно.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIVector2D<T> & v) {
|
||||
// piCout << "<< vector2d trivial default";
|
||||
s.binaryStreamAppend((int)v.rows());
|
||||
@@ -280,6 +341,8 @@ template<typename P,
|
||||
typename std::enable_if<
|
||||
!std::is_same<decltype(std::declval<PIBinaryStream<P> &>() << std::declval<const T &>()), PIBinaryStreamTrivialRef<P>>::value,
|
||||
int>::type = 0>
|
||||
//! \~english Stores %PIVector2D row data through the element streaming path.
|
||||
//! \~russian Сохраняет данные %PIVector2D через путь потоковой обработки элементов.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIVector2D<T> & v) {
|
||||
// piCout << "<< vector2d trivial custom";
|
||||
s.binaryStreamAppend((int)v.rows());
|
||||
@@ -289,18 +352,18 @@ inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIVector2D<T>
|
||||
}
|
||||
|
||||
|
||||
//! \~english Store operator
|
||||
//! \~russian Оператор сохранения
|
||||
template<typename P>
|
||||
//! \~english Stores %PIBitArray content.
|
||||
//! \~russian Сохраняет содержимое %PIBitArray.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIBitArray & v) {
|
||||
s << v.size_ << v.data_;
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
//! \~english Store operator
|
||||
//! \~russian Оператор сохранения
|
||||
template<typename P, typename Type0, typename Type1>
|
||||
//! \~english Stores both members of %PIPair.
|
||||
//! \~russian Сохраняет оба элемента %PIPair.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIPair<Type0, Type1> & v) {
|
||||
s << v.first << v.second;
|
||||
return s;
|
||||
@@ -311,6 +374,8 @@ inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIPair<Type0,
|
||||
|
||||
|
||||
template<typename P, typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
|
||||
//! \~english Restores enum values from \c int.
|
||||
//! \~russian Восстанавливает значения перечислений из \c int.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T & v) {
|
||||
// piCout << ">> enum";
|
||||
v = (T)s.binaryStreamTakeInt();
|
||||
@@ -322,6 +387,9 @@ template<typename P,
|
||||
typename T,
|
||||
typename std::enable_if<!std::is_enum<T>::value, int>::type = 0,
|
||||
typename std::enable_if<std::is_trivially_copyable<T>::value, int>::type = 0>
|
||||
//! \~english Restores trivially copyable values by raw memory copy and returns a helper marker for bulk container paths.
|
||||
//! \~russian Восстанавливает тривиально копируемые значения прямым копированием памяти и возвращает вспомогательный маркер для контейнерных
|
||||
//! путей с пакетным чтением.
|
||||
inline PIBinaryStreamTrivialRef<P> operator>>(PIBinaryStream<P> & s, T & v) {
|
||||
if (!s.binaryStreamTake(&v, sizeof(v))) {
|
||||
fprintf(stderr, "error with %s\n", __PIP_TYPENAME__(T));
|
||||
@@ -330,14 +398,14 @@ inline PIBinaryStreamTrivialRef<P> operator>>(PIBinaryStream<P> & s, T & v) {
|
||||
}
|
||||
|
||||
|
||||
//! \~english Restore operator for PIVector of any trivial copyable type
|
||||
//! \~russian Оператор извлечения для PIVector тривиальных типов
|
||||
template<typename P,
|
||||
typename T,
|
||||
typename std::enable_if<std::is_trivially_copyable<T>::value, int>::type = 0,
|
||||
typename std::enable_if<
|
||||
std::is_same<decltype(std::declval<PIBinaryStream<P> &>() >> std::declval<T &>()), PIBinaryStreamTrivialRef<P>>::value,
|
||||
int>::type = 0>
|
||||
//! \~english Restores %PIVector of trivial elements in bulk.
|
||||
//! \~russian Восстанавливает %PIVector из тривиальных элементов пакетно.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
|
||||
// piCout << ">> vector trivial default";
|
||||
int sz = s.binaryStreamTakeInt();
|
||||
@@ -359,6 +427,8 @@ template<typename P,
|
||||
typename std::enable_if<
|
||||
!std::is_same<decltype(std::declval<PIBinaryStream<P> &>() >> std::declval<T &>()), PIBinaryStreamTrivialRef<P>>::value,
|
||||
int>::type = 0>
|
||||
//! \~english Restores %PIVector element-by-element when the element type has custom binary streaming.
|
||||
//! \~russian Восстанавливает %PIVector поэлементно, когда тип элемента использует собственные операторы бинарного потока.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
|
||||
// piCout << ">> vector trivial custom";
|
||||
int sz = s.binaryStreamTakeInt();
|
||||
@@ -380,14 +450,14 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
|
||||
}
|
||||
|
||||
|
||||
//! \~english Restore operator for PIDeque of any trivial copyable type
|
||||
//! \~russian Оператор извлечения для PIDeque тривиальных типов
|
||||
template<typename P,
|
||||
typename T,
|
||||
typename std::enable_if<std::is_trivially_copyable<T>::value, int>::type = 0,
|
||||
typename std::enable_if<
|
||||
std::is_same<decltype(std::declval<PIBinaryStream<P> &>() >> std::declval<T &>()), PIBinaryStreamTrivialRef<P>>::value,
|
||||
int>::type = 0>
|
||||
//! \~english Restores %PIDeque of trivial elements in bulk.
|
||||
//! \~russian Восстанавливает %PIDeque из тривиальных элементов пакетно.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
|
||||
// piCout << ">> deque trivial default";
|
||||
int sz = s.binaryStreamTakeInt();
|
||||
@@ -409,6 +479,8 @@ template<typename P,
|
||||
typename std::enable_if<
|
||||
!std::is_same<decltype(std::declval<PIBinaryStream<P> &>() >> std::declval<T &>()), PIBinaryStreamTrivialRef<P>>::value,
|
||||
int>::type = 0>
|
||||
//! \~english Restores %PIDeque element-by-element when the element type has custom binary streaming.
|
||||
//! \~russian Восстанавливает %PIDeque поэлементно, когда тип элемента использует собственные операторы бинарного потока.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
|
||||
// piCout << ">> deque trivial custom";
|
||||
int sz = s.binaryStreamTakeInt();
|
||||
@@ -430,14 +502,14 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
|
||||
}
|
||||
|
||||
|
||||
//! \~english Restore operator for PIVector2D of any trivial copyable type
|
||||
//! \~russian Оператор извлечения для PIVector2D тривиальных типов
|
||||
template<typename P,
|
||||
typename T,
|
||||
typename std::enable_if<std::is_trivially_copyable<T>::value, int>::type = 0,
|
||||
typename std::enable_if<
|
||||
std::is_same<decltype(std::declval<PIBinaryStream<P> &>() >> std::declval<T &>()), PIBinaryStreamTrivialRef<P>>::value,
|
||||
int>::type = 0>
|
||||
//! \~english Restores %PIVector2D of trivial elements in bulk.
|
||||
//! \~russian Восстанавливает %PIVector2D из тривиальных элементов пакетно.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector2D<T> & v) {
|
||||
// piCout << ">> vector2d trivial default";
|
||||
int r, c;
|
||||
@@ -461,6 +533,8 @@ template<typename P,
|
||||
typename std::enable_if<
|
||||
!std::is_same<decltype(std::declval<PIBinaryStream<P> &>() >> std::declval<T &>()), PIBinaryStreamTrivialRef<P>>::value,
|
||||
int>::type = 0>
|
||||
//! \~english Restores %PIVector2D through the element streaming path.
|
||||
//! \~russian Восстанавливает %PIVector2D через путь потоковой обработки элементов.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector2D<T> & v) {
|
||||
// piCout << ">> vector2d trivial custom";
|
||||
int r, c;
|
||||
@@ -478,18 +552,18 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector2D<T> & v)
|
||||
}
|
||||
|
||||
|
||||
//! \~english Restore operator
|
||||
//! \~russian Оператор извлечения
|
||||
template<typename P>
|
||||
//! \~english Restores %PIBitArray content.
|
||||
//! \~russian Восстанавливает содержимое %PIBitArray.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIBitArray & v) {
|
||||
s >> v.size_ >> v.data_;
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
//! \~english Restore operator
|
||||
//! \~russian Оператор извлечения
|
||||
template<typename P, typename Type0, typename Type1>
|
||||
//! \~english Restores both members of %PIPair.
|
||||
//! \~russian Восстанавливает оба элемента %PIPair.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIPair<Type0, Type1> & v) {
|
||||
s >> v.first >> v.second;
|
||||
return s;
|
||||
@@ -499,9 +573,9 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIPair<Type0, Type1
|
||||
// store complex types
|
||||
|
||||
|
||||
//! \~english Store operator for PIVector of any compound type
|
||||
//! \~russian Оператор сохранения для PIVector сложных типов
|
||||
template<typename P, typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
|
||||
//! \~english Stores %PIVector of non-trivial elements one-by-one.
|
||||
//! \~russian Сохраняет %PIVector из нетривиальных элементов по одному.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIVector<T> & v) {
|
||||
// piCout << "<< vector complex";
|
||||
s.binaryStreamAppend(int(v.size_s()));
|
||||
@@ -511,9 +585,9 @@ inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIVector<T> &
|
||||
}
|
||||
|
||||
|
||||
//! \~english Store operator for PIDeque of any compound type
|
||||
//! \~russian Оператор сохранения для PIDeque сложных типов
|
||||
template<typename P, typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
|
||||
//! \~english Stores %PIDeque of non-trivial elements one-by-one.
|
||||
//! \~russian Сохраняет %PIDeque из нетривиальных элементов по одному.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIDeque<T> & v) {
|
||||
// piCout << "<< deque complex";
|
||||
s.binaryStreamAppend(int(v.size_s()));
|
||||
@@ -523,9 +597,9 @@ inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIDeque<T> &
|
||||
}
|
||||
|
||||
|
||||
//! \~english Store operator for PIVector2D of any compound type
|
||||
//! \~russian Оператор сохранения для PIVector2D сложных типов
|
||||
template<typename P, typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
|
||||
//! \~english Stores %PIVector2D of non-trivial elements via its plain vector representation.
|
||||
//! \~russian Сохраняет %PIVector2D из нетривиальных элементов через его плоское векторное представление.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIVector2D<T> & v) {
|
||||
// piCout << "<< vector2d complex";
|
||||
s.binaryStreamAppend(int(v.rows()));
|
||||
@@ -538,9 +612,9 @@ inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIVector2D<T>
|
||||
// restore complex types
|
||||
|
||||
|
||||
//! \~english Restore operator for PIVector of any compound type
|
||||
//! \~russian Оператор извлечения для PIVector сложных типов
|
||||
template<typename P, typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
|
||||
//! \~english Restores %PIVector of non-trivial elements one-by-one.
|
||||
//! \~russian Восстанавливает %PIVector из нетривиальных элементов по одному.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
|
||||
int sz = s.binaryStreamTakeInt();
|
||||
if (s.wasReadError()) {
|
||||
@@ -561,9 +635,9 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
|
||||
}
|
||||
|
||||
|
||||
//! \~english Restore operator for PIDeque of any compound type
|
||||
//! \~russian Оператор извлечения для PIDeque сложных типов
|
||||
template<typename P, typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
|
||||
//! \~english Restores %PIDeque of non-trivial elements one-by-one.
|
||||
//! \~russian Восстанавливает %PIDeque из нетривиальных элементов по одному.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
|
||||
int sz = s.binaryStreamTakeInt();
|
||||
if (s.wasReadError()) {
|
||||
@@ -584,9 +658,9 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
|
||||
}
|
||||
|
||||
|
||||
//! \~english Restore operator for PIVector2D of any compound type
|
||||
//! \~russian Оператор извлечения для PIVector2D сложных типов
|
||||
template<typename P, typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
|
||||
//! \~english Restores %PIVector2D of non-trivial elements via an intermediate plain vector.
|
||||
//! \~russian Восстанавливает %PIVector2D из нетривиальных элементов через промежуточный плоский вектор.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector2D<T> & v) {
|
||||
int r, c;
|
||||
PIVector<T> tmp;
|
||||
@@ -606,9 +680,9 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector2D<T> & v)
|
||||
// other types
|
||||
|
||||
|
||||
//! \~english Store operator
|
||||
//! \~russian Оператор сохранения
|
||||
template<typename P, typename Key, typename T>
|
||||
//! \~english Stores %PIMap keys and values.
|
||||
//! \~russian Сохраняет ключи и значения %PIMap.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIMap<Key, T> & v) {
|
||||
s.binaryStreamAppend((int)v.pim_index.size_s());
|
||||
for (uint i = 0; i < v.size(); ++i) {
|
||||
@@ -620,9 +694,9 @@ inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIMap<Key, T>
|
||||
}
|
||||
|
||||
|
||||
//! \~english Restore operator
|
||||
//! \~russian Оператор извлечения
|
||||
template<typename P, typename Key, typename T>
|
||||
//! \~english Restores %PIMap keys and values.
|
||||
//! \~russian Восстанавливает ключи и значения %PIMap.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIMap<Key, T> & v) {
|
||||
int sz = s.binaryStreamTakeInt();
|
||||
if (s.wasReadError()) {
|
||||
@@ -656,9 +730,9 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIMap<Key, T> & v)
|
||||
}
|
||||
|
||||
|
||||
//! \~english Store operator
|
||||
//! \~russian Оператор сохранения
|
||||
template<typename P, typename Key>
|
||||
//! \~english Stores %PISet keys.
|
||||
//! \~russian Сохраняет ключи %PISet.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PISet<Key> & v) {
|
||||
s.binaryStreamAppend((int)v.pim_index.size_s());
|
||||
for (uint i = 0; i < v.size(); ++i) {
|
||||
@@ -669,9 +743,9 @@ inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PISet<Key> &
|
||||
}
|
||||
|
||||
|
||||
//! \~english Restore operator
|
||||
//! \~russian Оператор извлечения
|
||||
template<typename P, typename Key>
|
||||
//! \~english Restores %PISet keys.
|
||||
//! \~russian Восстанавливает ключи %PISet.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PISet<Key> & v) {
|
||||
int sz = s.binaryStreamTakeInt();
|
||||
if (s.wasReadError()) {
|
||||
@@ -700,12 +774,16 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PISet<Key> & v) {
|
||||
|
||||
|
||||
template<typename P, typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
|
||||
//! \~english Fallback overload that intentionally fails for unsupported non-trivial write types.
|
||||
//! \~russian Резервная перегрузка, которая намеренно завершает компиляцию ошибкой для неподдерживаемых нетривиальных типов записи.
|
||||
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T &) {
|
||||
static_assert(std::is_trivially_copyable<T>::value, "[PIBinaryStream] Error: using undeclared operator << for complex type!");
|
||||
return s;
|
||||
}
|
||||
|
||||
template<typename P, typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
|
||||
//! \~english Fallback overload that intentionally fails for unsupported non-trivial read types.
|
||||
//! \~russian Резервная перегрузка, которая намеренно завершает компиляцию ошибкой для неподдерживаемых нетривиальных типов чтения.
|
||||
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T &) {
|
||||
static_assert(std::is_trivially_copyable<T>::value, "[PIBinaryStream] Error: using undeclared operator >> for complex type!");
|
||||
return s;
|
||||
|
||||
Reference in New Issue
Block a user