From 7cd2f7a310bf339912a76122704e35a5946672be Mon Sep 17 00:00:00 2001 From: peri4 Date: Mon, 21 Oct 2024 13:47:28 +0300 Subject: [PATCH] PIBinaryStream supports PISet --- libs/main/containers/piset.h | 4 +++ libs/main/serialization/pibinarystream.h | 41 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/libs/main/containers/piset.h b/libs/main/containers/piset.h index 431f41cf..3b29eac0 100644 --- a/libs/main/containers/piset.h +++ b/libs/main/containers/piset.h @@ -37,6 +37,10 @@ template class PISet: public PIMap { typedef PIMap _CSet; + template + friend PIBinaryStream

& operator<<(PIBinaryStream

& s, const PISet & v); + template + friend PIBinaryStream

& operator>>(PIBinaryStream

& s, PISet & v); public: //! Contructs an empty set diff --git a/libs/main/serialization/pibinarystream.h b/libs/main/serialization/pibinarystream.h index ab294417..bab6a8b0 100644 --- a/libs/main/serialization/pibinarystream.h +++ b/libs/main/serialization/pibinarystream.h @@ -29,6 +29,7 @@ #include "pibitarray.h" #include "pimap.h" #include "pimemoryblock.h" +#include "piset.h" #include "pivector2d.h" #define PIP_BINARY_STREAM @@ -655,6 +656,46 @@ inline PIBinaryStream

& operator>>(PIBinaryStream

& s, PIMap & v) } +//! \~english Store operator +//! \~russian Оператор сохранения +template +inline PIBinaryStream

& operator<<(PIBinaryStream

& s, const PISet & v) { + s.binaryStreamAppend((int)v.pim_index.size_s()); + for (uint i = 0; i < v.size(); ++i) { + s.binaryStreamAppend((int)v.pim_index[i].index); + s << v.pim_index[i].key; + } + return s; +} + + +//! \~english Restore operator +//! \~russian Оператор извлечения +template +inline PIBinaryStream

& operator>>(PIBinaryStream

& s, PISet & v) { + int sz = s.binaryStreamTakeInt(); + if (s.wasReadError()) { + fprintf(stderr, "error with PISet<%s>\n", __PIP_TYPENAME__(Key)); + v.clear(); + return s; + } + v.pim_index.resize(sz); + v.pim_content.resize(sz, 0); + int ind = 0; + for (int i = 0; i < sz; ++i) { + ind = s.binaryStreamTakeInt(); + s >> v.pim_index[i].key; + if (s.wasReadError()) { + fprintf(stderr, "error with PISet<%s>\n", __PIP_TYPENAME__(Key)); + v.clear(); + return s; + } + v.pim_index[i].index = ind; + } + return s; +} + + // non-defined complex types