PIP Bugfixes #207

Merged
peri4 merged 12 commits from bugfixes into master 2026-08-05 13:32:11 +03:00
Showing only changes of commit 6f11eeb895 - Show all commits
+28 -18
View File
@@ -56,17 +56,17 @@
#else #else
# define BINARY_STREAM_FRIEND(T) \ # define BINARY_STREAM_FRIEND(T) \
template<typename P> \ template<typename P> \
friend PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T & v); \ friend PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T & v); \
template<typename P> \ template<typename P> \
friend PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T & v); friend PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T & v);
# define BINARY_STREAM_WRITE(T) \ # define BINARY_STREAM_WRITE(T) \
template<typename P> \ template<typename P> \
inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T & v) inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const T & v)
# define BINARY_STREAM_READ(T) \ # define BINARY_STREAM_READ(T) \
template<typename P> \ template<typename P> \
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T & v) inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, T & v)
#endif #endif
@@ -410,7 +410,7 @@ template<typename P,
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) { inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
// piCout << ">> vector trivial default"; // piCout << ">> vector trivial default";
int sz = s.binaryStreamTakeInt(); int sz = s.binaryStreamTakeInt();
if (s.wasReadError()) { if (s.wasReadError() || sz < 0) {
fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T)); fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T));
v.clear(); v.clear();
return s; return s;
@@ -433,7 +433,7 @@ template<typename P,
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) { inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
// piCout << ">> vector trivial custom"; // piCout << ">> vector trivial custom";
int sz = s.binaryStreamTakeInt(); int sz = s.binaryStreamTakeInt();
if (s.wasReadError()) { if (s.wasReadError() || sz < 0) {
fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T)); fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T));
v.clear(); v.clear();
return s; return s;
@@ -462,7 +462,7 @@ template<typename P,
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) { inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
// piCout << ">> deque trivial default"; // piCout << ">> deque trivial default";
int sz = s.binaryStreamTakeInt(); int sz = s.binaryStreamTakeInt();
if (s.wasReadError()) { if (s.wasReadError() || sz < 0) {
fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T)); fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T));
v.clear(); v.clear();
return s; return s;
@@ -485,7 +485,7 @@ template<typename P,
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) { inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
// piCout << ">> deque trivial custom"; // piCout << ">> deque trivial custom";
int sz = s.binaryStreamTakeInt(); int sz = s.binaryStreamTakeInt();
if (s.wasReadError()) { if (s.wasReadError() || sz < 0) {
fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T)); fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T));
v.clear(); v.clear();
return s; return s;
@@ -516,7 +516,7 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector2D<T> & v)
int r, c; int r, c;
r = s.binaryStreamTakeInt(); r = s.binaryStreamTakeInt();
c = s.binaryStreamTakeInt(); c = s.binaryStreamTakeInt();
if (s.wasReadError()) { if (s.wasReadError() || r < 0 || c < 0) {
fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T)); fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T));
v.clear(); v.clear();
return s; return s;
@@ -542,6 +542,11 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector2D<T> & v)
PIVector<T> tmp; PIVector<T> tmp;
r = s.binaryStreamTakeInt(); r = s.binaryStreamTakeInt();
c = s.binaryStreamTakeInt(); c = s.binaryStreamTakeInt();
if (s.wasReadError() || r < 0 || c < 0) {
fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T));
v.clear();
return s;
}
s >> tmp; s >> tmp;
if (s.wasReadError()) { if (s.wasReadError()) {
fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T)); fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T));
@@ -618,7 +623,7 @@ template<typename P, typename T, typename std::enable_if<!std::is_trivially_copy
//! \~russian Восстанавливает %PIVector из нетривиальных элементов по одному. //! \~russian Восстанавливает %PIVector из нетривиальных элементов по одному.
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) { inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
int sz = s.binaryStreamTakeInt(); int sz = s.binaryStreamTakeInt();
if (s.wasReadError()) { if (s.wasReadError() || sz < 0) {
fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T)); fprintf(stderr, "error with PIVector<%s>\n", __PIP_TYPENAME__(T));
v.clear(); v.clear();
return s; return s;
@@ -641,7 +646,7 @@ template<typename P, typename T, typename std::enable_if<!std::is_trivially_copy
//! \~russian Восстанавливает %PIDeque из нетривиальных элементов по одному. //! \~russian Восстанавливает %PIDeque из нетривиальных элементов по одному.
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) { inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
int sz = s.binaryStreamTakeInt(); int sz = s.binaryStreamTakeInt();
if (s.wasReadError()) { if (s.wasReadError() || sz < 0) {
fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T)); fprintf(stderr, "error with PIDeque<%s>\n", __PIP_TYPENAME__(T));
v.clear(); v.clear();
return s; return s;
@@ -667,6 +672,11 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector2D<T> & v)
PIVector<T> tmp; PIVector<T> tmp;
r = s.binaryStreamTakeInt(); r = s.binaryStreamTakeInt();
c = s.binaryStreamTakeInt(); c = s.binaryStreamTakeInt();
if (s.wasReadError() || r < 0 || c < 0) {
fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T));
v.clear();
return s;
}
s >> tmp; s >> tmp;
if (s.wasReadError()) { if (s.wasReadError()) {
fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T)); fprintf(stderr, "error with PIVector2D<%s>\n", __PIP_TYPENAME__(T));
@@ -700,7 +710,7 @@ template<typename P, typename Key, typename T>
//! \~russian Восстанавливает ключи и значения %PIMap. //! \~russian Восстанавливает ключи и значения %PIMap.
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIMap<Key, T> & v) { inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIMap<Key, T> & v) {
int sz = s.binaryStreamTakeInt(); int sz = s.binaryStreamTakeInt();
if (s.wasReadError()) { if (s.wasReadError() || sz < 0) {
fprintf(stderr, "error with PIMap<%s, %s>\n", __PIP_TYPENAME__(Key), __PIP_TYPENAME__(T)); fprintf(stderr, "error with PIMap<%s, %s>\n", __PIP_TYPENAME__(Key), __PIP_TYPENAME__(T));
v.clear(); v.clear();
return s; return s;
@@ -749,7 +759,7 @@ template<typename P, typename Key>
//! \~russian Восстанавливает ключи %PISet. //! \~russian Восстанавливает ключи %PISet.
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PISet<Key> & v) { inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PISet<Key> & v) {
int sz = s.binaryStreamTakeInt(); int sz = s.binaryStreamTakeInt();
if (s.wasReadError()) { if (s.wasReadError() || sz < 0) {
fprintf(stderr, "error with PISet<%s>\n", __PIP_TYPENAME__(Key)); fprintf(stderr, "error with PISet<%s>\n", __PIP_TYPENAME__(Key));
v.clear(); v.clear();
return s; return s;