ready to integrate

This commit is contained in:
2022-05-09 23:57:47 +03:00
parent 0243f588bc
commit cf4f58ed95
2 changed files with 48 additions and 16 deletions

View File

@@ -40,11 +40,23 @@ class PIBinaryStream {
public: public:
// one should implements next methods: // one should implements next methods:
// //
// void appendImp(const void * d, size_t s); // bool binaryStreamAppend(const void * d, size_t s);
// void takeImp(void * d, size_t s); // bool binaryStreamTake(void * d, size_t s);
void append(const void * d, size_t s) {static_cast<P*>(this)->appendImp(d, s);} bool append(const void * d, size_t s) {
void take(void * d, size_t s) {static_cast<P*>(this)->takeImp(d, s);} if (!static_cast<P*>(this)->binaryStreamAppend(d, s)) {
return false;
printf("[PIBinaryStream] append() error\n");
}
return true;
}
bool take(void * d, size_t s) {
if (!static_cast<P*>(this)->binaryStreamTake(d, s)) {
return false;
printf("[PIBinaryStream] take() error\n");
}
return true;
}
template<typename T> template<typename T>
void append(T v) {append(&v, sizeof(v));} void append(T v) {append(&v, sizeof(v));}
uchar takeByte() {uchar r = 0; take(&r, sizeof(r)); return r;} uchar takeByte() {uchar r = 0; take(&r, sizeof(r)); return r;}
@@ -173,7 +185,10 @@ inline PIBinaryStream<P> & operator <<(PIBinaryStream<P> & s, const PIPair<Type0
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 PIBinaryStreamRef<P> operator >>(PIBinaryStream<P> & s, T & v) { inline PIBinaryStreamRef<P> operator >>(PIBinaryStream<P> & 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; return s;
} }
@@ -187,7 +202,10 @@ inline PIBinaryStream<P> & operator >>(PIBinaryStream<P> & s, PIVector<T> & v) {
piCout << ">> vector trivial default"; piCout << ">> vector trivial default";
int sz = s.takeInt(); int sz = s.takeInt();
v._resizeRaw(sz); 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; return s;
} }
template<typename P, typename T, template<typename P, typename T,
@@ -211,7 +229,10 @@ inline PIBinaryStream<P> & operator >>(PIBinaryStream<P> & s, PIDeque<T> & v) {
piCout << ">> deque trivial default"; piCout << ">> deque trivial default";
int sz = s.takeInt(); int sz = s.takeInt();
v._resizeRaw(sz); 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; return s;
} }
template<typename P, typename T, template<typename P, typename T,
@@ -237,7 +258,10 @@ inline PIBinaryStream<P> & operator >>(PIBinaryStream<P> & s, PIVector2D<T> & v)
r = s.takeInt(); r = s.takeInt();
c = s.takeInt(); c = s.takeInt();
v._resizeRaw(r, c); 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; return s;
} }
template<typename P, typename T, template<typename P, typename T,

View File

@@ -9,32 +9,40 @@ using namespace PICoutManipulators;
class ByteArray: public PIBinaryStream<ByteArray> { class ByteArray: public PIBinaryStream<ByteArray> {
public: public:
PIByteArray data; PIByteArray data;
void appendImp(const void * d, size_t s) { bool binaryStreamAppend(const void * d, size_t s) {
data.append(d, 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); memcpy(d, data.data(), s);
data.remove(0, s); data.remove(0, s);
return true;
} }
}; };
class File: public PIBinaryStream<File> { class File: public PIBinaryStream<File> {
public: public:
PIFile file; PIFile file;
void appendImp(const void * d, size_t s) { bool binaryStreamAppend(const void * d, size_t s) {
file.write(d, 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); file.read(d, s);
return true;
} }
}; };
struct TS { 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; int i;
float f; float f;
PIString s; //PIString s;
}; };
PICout operator << (PICout c, const TS & v) {c << '{' << v.i << ", " << v.f << '}'; return c;} 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.open("_", PIIODevice::ReadWrite);
//f.file.clear(); //f.file.clear();
//PIVector<TS> vi({TS(1,20), TS(3,40)}); //PIVector<TS> vi({TS(1,20), TS(3,40)});
PIVector<PIChar> vi({'a', 'b', 'c'}); PIVector<TS> vi({{'a', 10}, {'b', 20}, {'c', 30}});
ba << vi; ba << vi;
piCout << "src" << vi; piCout << "src" << vi;
piCout << "s" << ba.data; piCout << "s" << ba.data;
vi.fill(' '); vi.fill(TS());
vi.clear(); vi.clear();
//f.file.seekToBegin(); //f.file.seekToBegin();
ba >> vi; ba >> vi;