diff --git a/misc/serialize_experiment.cpp b/misc/serialize_experiment.cpp new file mode 100644 index 0000000..4b552e1 --- /dev/null +++ b/misc/serialize_experiment.cpp @@ -0,0 +1,76 @@ +#include + +#include + +using namespace std; + +union Foo { + enum class Type { + INT, + FLOAT + }type; + struct { + Type type; + int i; + }i; + struct { + Type type; + float f; + }f; +}; + +void serialize(Foo* f, void* buffer) { + int len = 0; + memcpy((void*)((int)buffer + len), &f->type, sizeof(Foo::Type)); + len += sizeof(Foo::Type); + switch(f->type) { + case Foo::Type::INT: + memcpy((void*)((int)buffer + len), &f->i.i, sizeof(int)); + len += sizeof(int); + break; + case Foo::Type::FLOAT: + memcpy((void*)((int)buffer + len), &f->f.f, sizeof(float)); + len += sizeof(float); + break; + } +} + +void deserialize(Foo* f, void* buffer) { + int len = 0; + memcpy(&f->type, (void*)((int)buffer + len), sizeof(Foo::Type)); + len += sizeof(Foo::Type); + switch(f->type) { + case Foo::Type::INT: + memcpy(&f->i.i, (void*)((int)buffer + len), sizeof(int)); + len += sizeof(int); + break; + case Foo::Type::FLOAT: + memcpy(&f->f.f, (void*)((int)buffer + len), sizeof(float)); + len += sizeof(float); + break; + } +} + +int main() { + Foo f; + f.type = Foo::Type::FLOAT; + f.f.f = 3.14; + Foo i; + i.type = Foo::Type::INT; + i.i.i = 42; + + char buffer[sizeof(Foo)]; + serialize(&f, buffer); + deserialize(&i, buffer); + + switch(i.type) { + case Foo::Type::INT: + cout << i.i.i << endl; + break; + case Foo::Type::FLOAT: + cout << i.f.f << endl; + break; + } + + return 0; +} \ No newline at end of file