more safety

This commit is contained in:
2023-08-30 12:29:06 +03:00
parent 0907a3eb13
commit 64a474c343

View File

@@ -109,7 +109,7 @@ public:
} }
//! \~english Returns whether there has been an incomplete read since last \a resetReadError() or after the stream was created //! \~english Returns whether there has been an incomplete read since last \a resetReadError() or after the stream was created
//! \~russian Возвращает было ли неполное чтение с момента последнего вызова \a resetReadError() //! \~russian Возвращает было ли неполное чтение с момента последнего вызова \a resetReadError() или создания потока
bool wasReadError() const { return _was_read_error_; } bool wasReadError() const { return _was_read_error_; }
//! \~english Reset incomplete read flag //! \~english Reset incomplete read flag
@@ -467,6 +467,11 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector2D<T> & v)
r = s.binaryStreamTakeInt(); r = s.binaryStreamTakeInt();
c = s.binaryStreamTakeInt(); c = s.binaryStreamTakeInt();
s >> tmp; s >> tmp;
if (s.wasReadError()) {
printf("error with PIVector2D<%s>\n", __PIP_TYPENAME__(T));
v.clear();
return s;
}
v = PIVector2D<T>(r, c, tmp); v = PIVector2D<T>(r, c, tmp);
return s; return s;
} }
@@ -536,7 +541,13 @@ inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIVector2D<T>
//! \~russian Оператор извлечения для PIVector сложных типов //! \~russian Оператор извлечения для PIVector сложных типов
template<typename P, typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0> template<typename P, typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) { inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
v.resize(s.binaryStreamTakeInt()); int sz = s.binaryStreamTakeInt();
if (s.wasReadError()) {
printf("error with PIVector<%s>\n", __PIP_TYPENAME__(T));
v.clear();
return s;
}
v.resize(sz);
for (size_t i = 0; i < v.size(); ++i) { for (size_t i = 0; i < v.size(); ++i) {
s >> v[i]; s >> v[i];
if (s.wasReadError()) { if (s.wasReadError()) {
@@ -553,7 +564,13 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector<T> & v) {
//! \~russian Оператор извлечения для PIDeque сложных типов //! \~russian Оператор извлечения для PIDeque сложных типов
template<typename P, typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0> template<typename P, typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) { inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIDeque<T> & v) {
v.resize(s.binaryStreamTakeInt()); int sz = s.binaryStreamTakeInt();
if (s.wasReadError()) {
printf("error with PIDeque<%s>\n", __PIP_TYPENAME__(T));
v.clear();
return s;
}
v.resize(sz);
for (size_t i = 0; i < v.size(); ++i) { for (size_t i = 0; i < v.size(); ++i) {
s >> v[i]; s >> v[i];
if (s.wasReadError()) { if (s.wasReadError()) {
@@ -575,6 +592,11 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIVector2D<T> & v)
r = s.binaryStreamTakeInt(); r = s.binaryStreamTakeInt();
c = s.binaryStreamTakeInt(); c = s.binaryStreamTakeInt();
s >> tmp; s >> tmp;
if (s.wasReadError()) {
printf("error with PIVector2D<%s>\n", __PIP_TYPENAME__(T));
v.clear();
return s;
}
v = PIVector2D<T>(r, c, tmp); v = PIVector2D<T>(r, c, tmp);
return s; return s;
} }
@@ -602,6 +624,11 @@ inline PIBinaryStream<P> & operator<<(PIBinaryStream<P> & s, const PIMap<Key, T>
template<typename P, typename Key, typename T> template<typename P, typename Key, typename T>
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()) {
printf("error with PIMap<%s, %s>\n", __PIP_TYPENAME__(Key), __PIP_TYPENAME__(T));
v.clear();
return s;
}
v.pim_index.resize(sz); v.pim_index.resize(sz);
int ind = 0; int ind = 0;
for (int i = 0; i < sz; ++i) { for (int i = 0; i < sz; ++i) {