#include <iostream>
#include <vector>
#include <cstdint>
template<class It>
struct range_t {
It b, e;
It begin() const { return b; }
It end() const { return e; }
std::size_t size() const { return end()-begin(); }
};
template<class It>
range_t<It> range(It s, It f) { return {s,f}; }
template<class T>
range_t< unsigned char* > as_bytes( T* t ) {
static_assert( std::is_trivially_copyable<T>::value, "bad idea if not trivilaly copyable" );
auto* ptr = reinterpret_cast<unsigned char*>(t);
return range(ptr, ptr+sizeof(T));
}
template<class T>
range_t< unsigned char const* > as_bytes( T const* t ) {
static_assert( std::is_trivially_copyable<T>::value, "bad idea if not trivilaly copyable" );
auto* ptr = reinterpret_cast<unsigned char const*>(t);
return range(ptr, ptr+sizeof(T));
}
template<class T>
void push_bytes_in( std::vector<std::uint8_t>& target, T const* data ) {
auto bytes = as_bytes(data);
target.insert( target.end(), bytes.begin(), bytes.end() );
}
template<class T>
bool pop_bytes_out( std::vector<std::uint8_t>& src, T* data ) {
auto bytes = as_bytes(data);
if (bytes.size() > src.size()) return false;
std::copy( src.end()-bytes.size(), src.end(), bytes.begin() );
src.resize( src.size()-bytes.size() );
return true;
}
struct some_data {
int x, y;
char buff[1024];
};
int main() {
std::vector<std::uint8_t> bytes;
some_data data{1,2, "hello"};
push_bytes_in( bytes, &data );
some_data d2;
if (!pop_bytes_out( bytes, &d2)) {
std::cout << "failed\n";
return -1;
}
std::cout << d2.buff << "\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGludD4KCiAgICB0ZW1wbGF0ZTxjbGFzcyBJdD4KICAgIHN0cnVjdCByYW5nZV90IHsKICAgICAgSXQgYiwgZTsKICAgICAgSXQgYmVnaW4oKSBjb25zdCB7IHJldHVybiBiOyB9CiAgICAgIEl0IGVuZCgpIGNvbnN0IHsgcmV0dXJuIGU7IH0KICAgICAgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGVuZCgpLWJlZ2luKCk7IH0KICAgIH07CgogICAgdGVtcGxhdGU8Y2xhc3MgSXQ+CiAgICByYW5nZV90PEl0PiByYW5nZShJdCBzLCBJdCBmKSB7IHJldHVybiB7cyxmfTsgfQoKICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICByYW5nZV90PCB1bnNpZ25lZCBjaGFyKiA+IGFzX2J5dGVzKCBUKiB0ICkgewogICAgICBzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZTxUPjo6dmFsdWUsICJiYWQgaWRlYSBpZiBub3QgdHJpdmlsYWx5IGNvcHlhYmxlIiApOwogICAgICBhdXRvKiBwdHIgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPih0KTsKICAgICAgcmV0dXJuIHJhbmdlKHB0ciwgcHRyK3NpemVvZihUKSk7CiAgICB9CiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgcmFuZ2VfdDwgdW5zaWduZWQgY2hhciBjb25zdCogPiBhc19ieXRlcyggVCBjb25zdCogdCApIHsKICAgICAgc3RhdGljX2Fzc2VydCggc3RkOjppc190cml2aWFsbHlfY29weWFibGU8VD46OnZhbHVlLCAiYmFkIGlkZWEgaWYgbm90IHRyaXZpbGFseSBjb3B5YWJsZSIgKTsKICAgICAgYXV0byogcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyIGNvbnN0Kj4odCk7CiAgICAgIHJldHVybiByYW5nZShwdHIsIHB0citzaXplb2YoVCkpOwogICAgfQoKICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICB2b2lkIHB1c2hfYnl0ZXNfaW4oIHN0ZDo6dmVjdG9yPHN0ZDo6dWludDhfdD4mIHRhcmdldCwgVCBjb25zdCogZGF0YSApIHsKICAgICAgYXV0byBieXRlcyA9IGFzX2J5dGVzKGRhdGEpOwogICAgICB0YXJnZXQuaW5zZXJ0KCB0YXJnZXQuZW5kKCksIGJ5dGVzLmJlZ2luKCksIGJ5dGVzLmVuZCgpICk7CiAgICB9CiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgYm9vbCBwb3BfYnl0ZXNfb3V0KCBzdGQ6OnZlY3RvcjxzdGQ6OnVpbnQ4X3Q+JiBzcmMsIFQqIGRhdGEgKSB7CiAgICAgIGF1dG8gYnl0ZXMgPSBhc19ieXRlcyhkYXRhKTsKICAgICAgaWYgKGJ5dGVzLnNpemUoKSA+IHNyYy5zaXplKCkpIHJldHVybiBmYWxzZTsKICAgICAgc3RkOjpjb3B5KCBzcmMuZW5kKCktYnl0ZXMuc2l6ZSgpLCBzcmMuZW5kKCksIGJ5dGVzLmJlZ2luKCkgKTsKICAgICAgc3JjLnJlc2l6ZSggc3JjLnNpemUoKS1ieXRlcy5zaXplKCkgKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAKICAgIHN0cnVjdCBzb21lX2RhdGEgewogICAgICBpbnQgeCwgeTsKICAgICAgY2hhciBidWZmWzEwMjRdOwogICAgfTsKCiAgIAoKaW50IG1haW4oKSB7CglzdGQ6OnZlY3RvcjxzdGQ6OnVpbnQ4X3Q+IGJ5dGVzOwoJCglzb21lX2RhdGEgZGF0YXsxLDIsICJoZWxsbyJ9OwoJcHVzaF9ieXRlc19pbiggYnl0ZXMsICZkYXRhICk7Cglzb21lX2RhdGEgZDI7CglpZiAoIXBvcF9ieXRlc19vdXQoIGJ5dGVzLCAmZDIpKSB7CgkJc3RkOjpjb3V0IDw8ICJmYWlsZWRcbiI7CgkJcmV0dXJuIC0xOwoJfQoJc3RkOjpjb3V0IDw8IGQyLmJ1ZmYgPDwgIlxuIjsKfQ==