OGLplus  (0.59.0) a C++ wrapper for rendering APIs

eagine/serialize/003_packed.cpp

Copyright Matus Chochlik. Distributed under the Boost Software License, Version 1.0. See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt

#include <iostream>
#include <sstream>
namespace eagine {
//------------------------------------------------------------------------------
struct my_struct {
bool b{false};
char c{'\0'};
double d{0.0};
long l{};
std::string s{};
unsigned u{0U};
std::string z{};
};
//------------------------------------------------------------------------------
template <identifier_t Id>
constexpr auto
data_member_mapping(type_identity<my_struct>, selector<Id>) noexcept {
using S = my_struct;
return make_data_member_mapping<
S,
bool,
char,
double,
long,
std::string,
unsigned,
std::string>(
{"b", &S::b},
{"c", &S::c},
{"d", &S::d},
{"i", &S::i},
{"l", &S::l},
{"s", &S::s},
{"u", &S::u},
{"z", &S::z});
}
//------------------------------------------------------------------------------
void baz(const my_struct& instance) {
std::cout << instance.b;
std::cout << instance.c;
std::cout << instance.d;
std::cout << instance.i.name();
std::cout << instance.l;
std::cout << instance.s;
std::cout << instance.u;
std::cout << instance.z;
std::cout << std::endl;
}
//------------------------------------------------------------------------------
void bar(memory::const_block data) {
packed_block_data_source source(data);
std::cout << hexdump(source.remaining());
string_deserializer_backend backend(source);
my_struct instance;
auto member_map = map_data_members(instance);
deserialize(member_map, backend);
baz(instance);
}
//------------------------------------------------------------------------------
void foo(const my_struct& instance) {
std::array<byte, 1024> data{};
packed_block_data_sink sink(cover(data));
string_serializer_backend backend(sink);
auto member_map = map_data_members(instance);
serialize(member_map, backend);
std::cout << hexdump(sink.done());
bar(sink.done());
}
//------------------------------------------------------------------------------
} // namespace eagine
auto main() -> int {
using namespace eagine;
my_struct x;
x.b = true;
x.c = '2';
x.d = 3.4;
x.i = identifier("FiveSix");
x.l = 7777777L;
x.s = "eight times eight is sixty-four";
x.u = 90U;
x.z =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim "
"veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
"commodo consequat. Duis aute irure dolor in reprehenderit in voluptate "
"velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint "
"occaecat cupidatat non proident, sunt in culpa qui officia deserunt "
"mollit anim id est laborum.";
foo(x);
return 0;
}
Common code is placed in this namespace.
Definition: eagine.hpp:21
static constexpr auto cover(T *addr, S size) noexcept -> span_if_mutable< T >
Creates a span starting at the specified pointer and specified length.
Definition: span.hpp:465
basic_block< true > const_block
Alias for const byte memory span.
Definition: block.hpp:32
auto deserialize(T &value, Backend &backend) -> std::enable_if_t< std::is_base_of_v< deserializer_backend, Backend >, deserialization_errors >
Deserializes a value with the specified serialization backend.
Definition: read.hpp:475
auto serialize(T &value, Backend &backend) -> std::enable_if_t< std::is_base_of_v< serializer_backend, Backend >, serialization_errors >
Serializes a value with the specified serialization backend.
Definition: write.hpp:480
basic_identifier< 10, 6, default_identifier_char_set, identifier_t > identifier
Default identifier type used throughout the project.
Definition: identifier.hpp:346

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).