13#ifndef IPC_CODEGEN_MSGPACK_STRUCT_MAP_ADAPTOR_DEFINED
14#define IPC_CODEGEN_MSGPACK_STRUCT_MAP_ADAPTOR_DEFINED
18template <msgpack_concepts::HasMsgPack T>
struct convert<T> {
19 msgpack::object
const&
operator()(msgpack::object
const& o, T& v)
const
22 "SERIALIZATION_FIELDS requires default-constructible types (used during unpacking)");
23 v.msgpack([&](
auto&... args) {
24 auto static_checker = [&](
auto&... value_args) {
26 "SERIALIZATION_FIELDS requires a constructor that can take the types listed in "
27 "SERIALIZATION_FIELDS. "
28 "Type or arg count mismatch, or member initializer constructor not available.");
31 if constexpr (!
requires {
typename T::MSGPACK_NO_STATIC_CHECK; }) {
32 std::apply(static_checker,
drop_keys(std::tie(args...)));
34 msgpack::type::define_map<
decltype(args)...>{ args... }.msgpack_unpack(o);
41template <msgpack_concepts::HasMsgPack T>
struct pack<T> {
42 template <
typename Stream> packer<Stream>&
operator()(msgpack::packer<Stream>& o, T
const& v)
const
45 "SERIALIZATION_FIELDS requires default-constructible types (used during unpacking)");
46 const_cast<T&
>(v).
msgpack([&](
auto&... args) {
47 auto static_checker = [&](
auto&... value_args) {
50 "T requires a constructor that can take the fields listed in SERIALIZATION_FIELDS (T will be "
51 "in template parameters in the compiler stack trace)"
52 "Check the SERIALIZATION_FIELDS macro usage in T for incompleteness or wrong order. "
53 "Alternatively, a matching member initializer constructor might not be available for T "
54 "and should be defined.");
57 if constexpr (!
requires {
typename T::MSGPACK_NO_STATIC_CHECK; }) {
58 std::apply(static_checker,
drop_keys(std::tie(args...)));
60 msgpack::type::define_map<
decltype(args)...>{ args... }.msgpack_pack(o);
constexpr std::array< uint8_t, S > convert(const std::string_view &in)
auto drop_keys(std::tuple< Args... > &&tuple)
Drops every first value pairwise of a flat argument tuple, assuming that they are keys.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
msgpack::object const & operator()(msgpack::object const &o, T &v) const
packer< Stream > & operator()(msgpack::packer< Stream > &o, T const &v) const