diff --git a/libs/main/core/pibinarystream.h b/libs/main/core/pibinarystream.h
index 02c3635c..16c2839b 100644
--- a/libs/main/core/pibinarystream.h
+++ b/libs/main/core/pibinarystream.h
@@ -40,11 +40,23 @@ class PIBinaryStream {
public:
// one should implements next methods:
//
- // void appendImp(const void * d, size_t s);
- // void takeImp(void * d, size_t s);
+ // bool binaryStreamAppend(const void * d, size_t s);
+ // bool binaryStreamTake(void * d, size_t s);
- void append(const void * d, size_t s) {static_cast
(this)->appendImp(d, s);}
- void take(void * d, size_t s) {static_cast
(this)->takeImp(d, s);}
+ bool append(const void * d, size_t s) {
+ if (!static_cast
(this)->binaryStreamAppend(d, s)) {
+ return false;
+ printf("[PIBinaryStream] append() error\n");
+ }
+ return true;
+ }
+ bool take(void * d, size_t s) {
+ if (!static_cast
(this)->binaryStreamTake(d, s)) {
+ return false;
+ printf("[PIBinaryStream] take() error\n");
+ }
+ return true;
+ }
template
void append(T v) {append(&v, sizeof(v));}
uchar takeByte() {uchar r = 0; take(&r, sizeof(r)); return r;}
@@ -173,7 +185,10 @@ inline PIBinaryStream & operator <<(PIBinaryStream
& s, const PIPair::value, int>::type = 0>
inline PIBinaryStreamRef operator >>(PIBinaryStream
& s, T & v) {
- s.take(&v, sizeof(v));
+ if (!s.take(&v, sizeof(v))) {
+ printf("error with %s\n", __PIP_TYPENAME__(T));
+ assert(false);
+ }
return s;
}
@@ -187,7 +202,10 @@ inline PIBinaryStream
& operator >>(PIBinaryStream
& s, PIVector & v) {
piCout << ">> vector trivial default";
int sz = s.takeInt();
v._resizeRaw(sz);
- s.take(v.data(), sz*sizeof(T));
+ if (!s.take(v.data(), sz * sizeof(T))) {
+ printf("error with PIVector<%s>\n", __PIP_TYPENAME__(T));
+ assert(false);
+ }
return s;
}
template & operator >>(PIBinaryStream & s, PIDeque & v) {
piCout << ">> deque trivial default";
int sz = s.takeInt();
v._resizeRaw(sz);
- s.take(v.data(), sz*sizeof(T));
+ if (!s.take(v.data(), sz * sizeof(T))) {
+ printf("error with PIDeque<%s>\n", __PIP_TYPENAME__(T));
+ assert(false);
+ }
return s;
}
template & operator >>(PIBinaryStream & s, PIVector2D & v)
r = s.takeInt();
c = s.takeInt();
v._resizeRaw(r, c);
- s.take(v.data(), v.size() * sizeof(T));
+ if (!s.take(v.data(), v.size() * sizeof(T))) {
+ printf("error with PIVector2D<%s>\n", __PIP_TYPENAME__(T));
+ assert(false);
+ }
return s;
}
template {
public:
PIByteArray data;
- void appendImp(const void * d, size_t s) {
+ bool binaryStreamAppend(const void * d, size_t s) {
data.append(d, s);
+ return true;
}
- void takeImp(void * d, size_t s) {
+ bool binaryStreamTake(void * d, size_t s) {
+ if (data.size() < s)
+ return false;
memcpy(d, data.data(), s);
data.remove(0, s);
+ return true;
}
};
class File: public PIBinaryStream {
public:
PIFile file;
- void appendImp(const void * d, size_t s) {
+ bool binaryStreamAppend(const void * d, size_t s) {
file.write(d, s);
+ return true;
}
- void takeImp(void * d, size_t s) {
+ bool binaryStreamTake(void * d, size_t s) {
+ if (file.isEnd())
+ return false;
file.read(d, s);
+ return true;
}
};
struct TS {
- TS(int v0 = -1, float v1 = -1, PIString v2 = "") {i = v0; f = v1; s = v2;}
+ TS(int v0 = -1, float v1 = -1, PIString v2 = "") {i = v0; f = v1;/* s = v2;*/}
int i;
float f;
- PIString s;
+ //PIString s;
};
PICout operator << (PICout c, const TS & v) {c << '{' << v.i << ", " << v.f << '}'; return c;}
@@ -50,11 +58,11 @@ int main(int argc, char * argv[]) {
//f.file.open("_", PIIODevice::ReadWrite);
//f.file.clear();
//PIVector vi({TS(1,20), TS(3,40)});
- PIVector vi({'a', 'b', 'c'});
+ PIVector vi({{'a', 10}, {'b', 20}, {'c', 30}});
ba << vi;
piCout << "src" << vi;
piCout << "s" << ba.data;
- vi.fill(' ');
+ vi.fill(TS());
vi.clear();
//f.file.seekToBegin();
ba >> vi;