1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | #include <iostream> #include <tuple> typedef unsigned char uint8_t; typedef unsigned char byte_t; struct MsgData { uint8_t num; float x; uint8_t elevation; static const std::size_t buffer_size = sizeof(uint8_t) + sizeof(float) + sizeof(uint8_t); std::tuple<uint8_t&,float&,uint8_t&> get_tied_tuple() {return std::tie(num, x, elevation);} std::tuple<const uint8_t&,const float&,const uint8_t&> get_tied_tuple() const {return std::tie(num, x, elevation);} }; inline std::ostream& operator<<(std::ostream& os, const MsgData& msgData) { os << '[' << static_cast<int>(msgData.num) << ' ' << msgData.x << ' ' << static_cast<int>(msgData.elevation) << ']'; return os; } namespace detail { // overload this for types that need special treatment template<typename T> const byte_t* read_value(const byte_t* bin, T& val) { val = *reinterpret_cast<const T*>(bin); return bin + sizeof(T)/sizeof(byte_t); } // overload this for types that need special treatment template<typename T> byte_t* write_value(byte_t* bin, const T& val) { *reinterpret_cast<T*>(bin) = val; return bin + sizeof(T)/sizeof(byte_t); } template< typename MsgTuple, unsigned int Size = std::tuple_size<MsgTuple>::value > struct msg_serializer; template< typename MsgTuple > struct msg_serializer<MsgTuple,0> { static const byte_t* read(const byte_t* bin, MsgTuple&) {return bin;} static byte_t* write(byte_t* bin, const MsgTuple&) {return bin;} }; template< typename MsgTuple, unsigned int Size > struct msg_serializer { static const byte_t* read(const byte_t* bin, MsgTuple& msg) { return read_value( msg_serializer<MsgTuple,Size-1>::read(bin, msg) , std::get<Size-1>(msg) ); } static byte_t* write(byte_t* bin, const MsgTuple& msg) { return write_value( msg_serializer<MsgTuple,Size-1>::write(bin, msg) , std::get<Size-1>(msg) ); } }; template< class MsgTuple > inline const byte_t* do_read_msg(const byte_t* bin, MsgTuple msg) { return msg_serializer<MsgTuple>::read(bin, msg); } template< class MsgTuple > inline byte_t* do_write_msg(byte_t* bin, const MsgTuple& msg) { return msg_serializer<MsgTuple>::write(bin, msg); } } template< class Msg > inline const byte_t* read_msg(const byte_t* bin, Msg& msg) { return detail::do_read_msg(bin, msg.get_tied_tuple()); } template< class Msg > inline const byte_t* write_msg(byte_t* bin, const Msg& msg) { return detail::do_write_msg(bin, msg.get_tied_tuple()); } int main() { byte_t buffer[MsgData::buffer_size]; std::cout << "buffer size is " << MsgData::buffer_size << '\n'; MsgData msgData; std::cout << "initializing data..."; msgData.num = 42; msgData.x = 1.7f; msgData.elevation = 17; std::cout << "data is now " << msgData << '\n'; write_msg(buffer, msgData); std::cout << "clearing data..."; msgData = MsgData(); std::cout << "data is now " << msgData << '\n'; std::cout << "reading data..."; read_msg(buffer, msgData); std::cout << "data is now " << msgData << '\n'; return 0; } |
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDx0dXBsZT4KCiAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBieXRlX3Q7CgogICAgc3RydWN0IE1zZ0RhdGEgewogICAgICAgIHVpbnQ4X3QgbnVtOwogICAgICAgIGZsb2F0IHg7CiAgICAgICAgdWludDhfdCBlbGV2YXRpb247CgogICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNpemVfdCBidWZmZXJfc2l6ZSA9IHNpemVvZih1aW50OF90KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihmbG9hdCkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHVpbnQ4X3QpOwoKICAgICAgICBzdGQ6OnR1cGxlPHVpbnQ4X3QmLGZsb2F0Jix1aW50OF90Jj4gZ2V0X3RpZWRfdHVwbGUoKQogICAgICAgIHtyZXR1cm4gc3RkOjp0aWUobnVtLCB4LCBlbGV2YXRpb24pO30KICAgICAgICBzdGQ6OnR1cGxlPGNvbnN0IHVpbnQ4X3QmLGNvbnN0IGZsb2F0Jixjb25zdCB1aW50OF90Jj4gZ2V0X3RpZWRfdHVwbGUoKSBjb25zdAogICAgICAgIHtyZXR1cm4gc3RkOjp0aWUobnVtLCB4LCBlbGV2YXRpb24pO30KICAgIH07CgogICAgaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBNc2dEYXRhJiBtc2dEYXRhKQogICAgewogICAgICAgIG9zIDw8ICdbJyA8PCBzdGF0aWNfY2FzdDxpbnQ+KG1zZ0RhdGEubnVtKSA8PCAnICcgCiAgICAgICAgICAgPDwgbXNnRGF0YS54IDw8ICcgJyA8PCBzdGF0aWNfY2FzdDxpbnQ+KG1zZ0RhdGEuZWxldmF0aW9uKSA8PCAnXSc7CiAgICAgICAgcmV0dXJuIG9zOwogICAgfQoKICAgIG5hbWVzcGFjZSBkZXRhaWwgewoKICAgICAgICAvLyBvdmVybG9hZCB0aGlzIGZvciB0eXBlcyB0aGF0IG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQKICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgICAgIGNvbnN0IGJ5dGVfdCogcmVhZF92YWx1ZShjb25zdCBieXRlX3QqIGJpbiwgVCYgdmFsKQogICAgICAgIHsKICAgICAgICAgICAgdmFsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KGJpbik7CiAgICAgICAgICAgIHJldHVybiBiaW4gKyBzaXplb2YoVCkvc2l6ZW9mKGJ5dGVfdCk7CiAgICAgICAgfQoKICAgICAgICAvLyBvdmVybG9hZCB0aGlzIGZvciB0eXBlcyB0aGF0IG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQKICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgICAgIGJ5dGVfdCogd3JpdGVfdmFsdWUoYnl0ZV90KiBiaW4sIGNvbnN0IFQmIHZhbCkKICAgICAgICB7CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PFQqPihiaW4pID0gdmFsOwogICAgICAgICAgICByZXR1cm4gYmluICsgc2l6ZW9mKFQpL3NpemVvZihieXRlX3QpOwogICAgICAgIH0KCiAgICAgICAgdGVtcGxhdGU8IHR5cGVuYW1lIE1zZ1R1cGxlLCB1bnNpZ25lZCBpbnQgU2l6ZSA9IHN0ZDo6dHVwbGVfc2l6ZTxNc2dUdXBsZT46OnZhbHVlID4KICAgICAgICBzdHJ1Y3QgbXNnX3NlcmlhbGl6ZXI7CgogICAgICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBNc2dUdXBsZSA+CiAgICAgICAgc3RydWN0IG1zZ19zZXJpYWxpemVyPE1zZ1R1cGxlLDA+IHsKICAgICAgICAgICAgc3RhdGljIGNvbnN0IGJ5dGVfdCogcmVhZChjb25zdCBieXRlX3QqIGJpbiwgTXNnVHVwbGUmKSB7cmV0dXJuIGJpbjt9CiAgICAgICAgICAgIHN0YXRpYyBieXRlX3QqIHdyaXRlKGJ5dGVfdCogYmluLCBjb25zdCBNc2dUdXBsZSYpICAgICAge3JldHVybiBiaW47fQogICAgICAgIH07CgogICAgICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBNc2dUdXBsZSwgdW5zaWduZWQgaW50IFNpemUgPgogICAgICAgIHN0cnVjdCBtc2dfc2VyaWFsaXplciB7CiAgICAgICAgICAgIHN0YXRpYyBjb25zdCBieXRlX3QqIHJlYWQoY29uc3QgYnl0ZV90KiBiaW4sIE1zZ1R1cGxlJiBtc2cpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiByZWFkX3ZhbHVlKCBtc2dfc2VyaWFsaXplcjxNc2dUdXBsZSxTaXplLTE+OjpyZWFkKGJpbiwgbXNnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHN0ZDo6Z2V0PFNpemUtMT4obXNnKSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRpYyBieXRlX3QqIHdyaXRlKGJ5dGVfdCogYmluLCBjb25zdCBNc2dUdXBsZSYgbXNnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gd3JpdGVfdmFsdWUoIG1zZ19zZXJpYWxpemVyPE1zZ1R1cGxlLFNpemUtMT46OndyaXRlKGJpbiwgbXNnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBzdGQ6OmdldDxTaXplLTE+KG1zZykgKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHRlbXBsYXRlPCBjbGFzcyBNc2dUdXBsZSA+CiAgICAgICAgaW5saW5lIGNvbnN0IGJ5dGVfdCogZG9fcmVhZF9tc2coY29uc3QgYnl0ZV90KiBiaW4sIE1zZ1R1cGxlIG1zZykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBtc2dfc2VyaWFsaXplcjxNc2dUdXBsZT46OnJlYWQoYmluLCBtc2cpOwogICAgICAgIH0KCiAgICAgICAgdGVtcGxhdGU8IGNsYXNzIE1zZ1R1cGxlID4KICAgICAgICBpbmxpbmUgYnl0ZV90KiBkb193cml0ZV9tc2coYnl0ZV90KiBiaW4sIGNvbnN0IE1zZ1R1cGxlJiBtc2cpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbXNnX3NlcmlhbGl6ZXI8TXNnVHVwbGU+Ojp3cml0ZShiaW4sIG1zZyk7CiAgICAgICAgfQogICAgfQoKICAgIHRlbXBsYXRlPCBjbGFzcyBNc2cgPgogICAgaW5saW5lIGNvbnN0IGJ5dGVfdCogcmVhZF9tc2coY29uc3QgYnl0ZV90KiBiaW4sIE1zZyYgbXNnKQogICAgewogICAgICAgIHJldHVybiBkZXRhaWw6OmRvX3JlYWRfbXNnKGJpbiwgbXNnLmdldF90aWVkX3R1cGxlKCkpOwogICAgfQoKICAgIHRlbXBsYXRlPCBjbGFzcyBNc2cgPgogICAgaW5saW5lIGNvbnN0IGJ5dGVfdCogd3JpdGVfbXNnKGJ5dGVfdCogYmluLCBjb25zdCBNc2cmIG1zZykKICAgIHsKICAgICAgICByZXR1cm4gZGV0YWlsOjpkb193cml0ZV9tc2coYmluLCBtc2cuZ2V0X3RpZWRfdHVwbGUoKSk7CiAgICB9CgogICAgaW50IG1haW4oKQogICAgewogICAgICAgIGJ5dGVfdCBidWZmZXJbTXNnRGF0YTo6YnVmZmVyX3NpemVdOwoKICAgICAgICBzdGQ6OmNvdXQgPDwgImJ1ZmZlciBzaXplIGlzICIgPDwgTXNnRGF0YTo6YnVmZmVyX3NpemUgPDwgJ1xuJzsKCiAgICAgICAgTXNnRGF0YSBtc2dEYXRhOwogICAgICAgIHN0ZDo6Y291dCA8PCAiaW5pdGlhbGl6aW5nIGRhdGEuLi4iOwogICAgICAgIG1zZ0RhdGEubnVtID0gNDI7CiAgICAgICAgbXNnRGF0YS54ID0gMS43ZjsKICAgICAgICBtc2dEYXRhLmVsZXZhdGlvbiA9IDE3OwogICAgICAgIHN0ZDo6Y291dCA8PCAiZGF0YSBpcyBub3cgIiA8PCBtc2dEYXRhIDw8ICdcbic7CiAgICAgICAgd3JpdGVfbXNnKGJ1ZmZlciwgbXNnRGF0YSk7CgogICAgICAgIHN0ZDo6Y291dCA8PCAiY2xlYXJpbmcgZGF0YS4uLiI7CiAgICAgICAgbXNnRGF0YSA9IE1zZ0RhdGEoKTsKICAgICAgICBzdGQ6OmNvdXQgPDwgImRhdGEgaXMgbm93ICIgPDwgbXNnRGF0YSA8PCAnXG4nOwoKICAgICAgICBzdGQ6OmNvdXQgPDwgInJlYWRpbmcgZGF0YS4uLiI7CiAgICAgICAgcmVhZF9tc2coYnVmZmVyLCBtc2dEYXRhKTsKICAgICAgICBzdGQ6OmNvdXQgPDwgImRhdGEgaXMgbm93ICIgPDwgbXNnRGF0YSA8PCAnXG4nOwoKICAgICAgICByZXR1cm4gMDsKICAgIH0=
-
upload with new input
-
result: Success time: 0s memory: 2828 kB returned value: 0
buffer size is 6 initializing data...data is now [42 1.7 17] clearing data...data is now [0 0 0] reading data...data is now [42 1.7 17]


