#include <iostream>
#include <string>
#include <list>
using namespace std;
namespace szn
{
// istream/ostream is a substiture for actual streaming media
template<class C>
class able_base
{
public:
virtual void marshall ( ostream&, const C& ) const = 0;
virtual void unmarshall ( C&, istream& ) const = 0;
};
template<class T,class C> class generic_member_wrapper : public able_base<C>
{
T C::*_m;
public:
generic_member_wrapper ( T C::*member_ptr ) : _m(member_ptr) {}
void marshall ( ostream& s, const C& c ) const override { s << c.*_m << ';'; }
void unmarshall ( C& c, istream& s ) const override { s >> c.*_m; }
};
template<class T,class C>
able_base<C>* able_member ( T C::*member_ptr )
{
return new generic_member_wrapper<T,C> ( member_ptr );
}
template<class C>
class marshaller
{
list<szn::able_base<C>*> _smembers;
public:
marshaller ( initializer_list<able_base<C>*> il ) : _smembers(il) {}
void marshall ( ostream& s, const C& c ) const
{
for ( auto smember: _smembers )
smember->marshall ( s, c );
}
void unmarshall ( C& c, istream& s ) const
{
for ( auto smember: _smembers )
smember->unmarshall ( c, s );
}
};
}
// USE
struct Data1
{
int _m1;
bool _m2;
string _m3;
static szn::marshaller<Data1> s_mr;
};
szn::marshaller<Data1> Data1::s_mr ( {
szn::able_member(&Data1::_m1),
szn::able_member(&Data1::_m2),
szn::able_member(&Data1::_m3)
} );
//Data1::s_serializer = Serializer ( {Data1::_m1, Data1::_m2, Data1::_m3} );
int main()
{
Data1 d1 = { 31415, true, "the big red fox" };
Data1::s_mr.marshall ( cout, d1 );
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bGlzdD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCm5hbWVzcGFjZSBzem4KewoKLy8gaXN0cmVhbS9vc3RyZWFtIGlzIGEgc3Vic3RpdHVyZSBmb3IgYWN0dWFsIHN0cmVhbWluZyBtZWRpYQoKdGVtcGxhdGU8Y2xhc3MgQz4KY2xhc3MgYWJsZV9iYXNlCnsKcHVibGljOgoJdmlydHVhbCB2b2lkIG1hcnNoYWxsICggb3N0cmVhbSYsIGNvbnN0IEMmICkgY29uc3QgPSAwOwoJdmlydHVhbCB2b2lkIHVubWFyc2hhbGwgKCBDJiwgaXN0cmVhbSYgKSBjb25zdCA9IDA7Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBULGNsYXNzIEM+IGNsYXNzIGdlbmVyaWNfbWVtYmVyX3dyYXBwZXIgOiBwdWJsaWMgYWJsZV9iYXNlPEM+CnsKCVQgQzo6Kl9tOwpwdWJsaWM6CglnZW5lcmljX21lbWJlcl93cmFwcGVyICggVCBDOjoqbWVtYmVyX3B0ciApIDogX20obWVtYmVyX3B0cikge30KCXZvaWQgbWFyc2hhbGwgKCBvc3RyZWFtJiBzLCBjb25zdCBDJiBjICkgY29uc3Qgb3ZlcnJpZGUgeyBzIDw8IGMuKl9tIDw8ICc7JzsgfQoJdm9pZCB1bm1hcnNoYWxsICggQyYgYywgaXN0cmVhbSYgcyApIGNvbnN0IG92ZXJyaWRlIHsgcyA+PiBjLipfbTsgfSAgICAKfTsKCnRlbXBsYXRlPGNsYXNzIFQsY2xhc3MgQz4gCmFibGVfYmFzZTxDPiogYWJsZV9tZW1iZXIgKCBUIEM6OiptZW1iZXJfcHRyICkKewoJcmV0dXJuIG5ldyBnZW5lcmljX21lbWJlcl93cmFwcGVyPFQsQz4gKCBtZW1iZXJfcHRyICk7Cn0KCgp0ZW1wbGF0ZTxjbGFzcyBDPgpjbGFzcyBtYXJzaGFsbGVyIAp7CglsaXN0PHN6bjo6YWJsZV9iYXNlPEM+Kj4gX3NtZW1iZXJzOwpwdWJsaWM6CgltYXJzaGFsbGVyICggaW5pdGlhbGl6ZXJfbGlzdDxhYmxlX2Jhc2U8Qz4qPiBpbCApIDogX3NtZW1iZXJzKGlsKSB7fQoKCXZvaWQgbWFyc2hhbGwgKCBvc3RyZWFtJiBzLCBjb25zdCBDJiBjICkgY29uc3QKCXsKCQlmb3IgKCBhdXRvIHNtZW1iZXI6IF9zbWVtYmVycyApCgkJCXNtZW1iZXItPm1hcnNoYWxsICggcywgYyApOwoJfQoJdm9pZCB1bm1hcnNoYWxsICggQyYgYywgaXN0cmVhbSYgcyApIGNvbnN0IAoJewoJCWZvciAoIGF1dG8gc21lbWJlcjogX3NtZW1iZXJzICkKCQkJc21lbWJlci0+dW5tYXJzaGFsbCAoIGMsIHMgKTsKCX0KfTsKCn0KCi8vIFVTRQoKc3RydWN0IERhdGExCnsKCWludCBfbTE7Cglib29sIF9tMjsKCXN0cmluZyBfbTM7CgkKCXN0YXRpYyBzem46Om1hcnNoYWxsZXI8RGF0YTE+IHNfbXI7Cn07Cgpzem46Om1hcnNoYWxsZXI8RGF0YTE+IERhdGExOjpzX21yICggewoJc3puOjphYmxlX21lbWJlcigmRGF0YTE6Ol9tMSksCglzem46OmFibGVfbWVtYmVyKCZEYXRhMTo6X20yKSwKCXN6bjo6YWJsZV9tZW1iZXIoJkRhdGExOjpfbTMpCn0gKTsKCi8vRGF0YTE6OnNfc2VyaWFsaXplciA9IFNlcmlhbGl6ZXIgKCB7RGF0YTE6Ol9tMSwgRGF0YTE6Ol9tMiwgRGF0YTE6Ol9tM30gKTsKCgppbnQgbWFpbigpIAp7CglEYXRhMSBkMSA9IHsgMzE0MTUsIHRydWUsICJ0aGUgYmlnIHJlZCBmb3giIH07CglEYXRhMTo6c19tci5tYXJzaGFsbCAoIGNvdXQsIGQxICk7CglyZXR1cm4gMDsKfQ==