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;