MessagePack for C++
cpp11_define_map.hpp
Go to the documentation of this file.
1 //
2 // MessagePack for C++ static resolution routine
3 //
4 // Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi
5 //
6 // Distributed under the Boost Software License, Version 1.0.
7 // (See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 //
10 #ifndef MSGPACK_V1_CPP11_DEFINE_MAP_HPP
11 #define MSGPACK_V1_CPP11_DEFINE_MAP_HPP
12 
14 
15 #include <tuple>
16 #include <map>
17 
18 namespace msgpack {
22 namespace type {
23 
24 template <typename Tuple, std::size_t N>
26  template <typename Packer>
27  static void pack(Packer& pk, Tuple const& t) {
29  pk.pack(std::get<N-1>(t));
30  }
31  static void unpack(
32  msgpack::object const& o, Tuple const& t,
33  std::map<std::string, msgpack::object const*> const& kvmap) {
35  auto it = kvmap.find(std::get<N-2>(t));
36  if (it != kvmap.end()) {
37  it->second->convert(std::get<N-1>(t));
38  }
39  }
40  static void object(msgpack::object* o, msgpack::zone& z, Tuple const& t) {
42  o->via.map.ptr[(N-1)/2].key = msgpack::object(std::get<N-2>(t), z);
43  o->via.map.ptr[(N-1)/2].val = msgpack::object(std::get<N-1>(t), z);
44  }
45 };
46 
47 template <typename Tuple>
48 struct define_map_imp<Tuple, 0> {
49  template <typename Packer>
50  static void pack(Packer&, Tuple const&) {}
51  static void unpack(
52  msgpack::object const&, Tuple const&,
53  std::map<std::string, msgpack::object const*> const&) {}
54  static void object(msgpack::object*, msgpack::zone&, Tuple const&) {}
55 };
56 
57 template <typename... Args>
58 struct define_map {
59  define_map(Args&... args) :
60  a(args...) {}
61  template <typename Packer>
62  void msgpack_pack(Packer& pk) const
63  {
64  static_assert(sizeof...(Args) % 2 == 0, "");
65  pk.pack_map(sizeof...(Args) / 2);
66 
67  define_map_imp<std::tuple<Args&...>, sizeof...(Args)>::pack(pk, a);
68  }
69  void msgpack_unpack(msgpack::object const& o) const
70  {
71  if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
72  std::map<std::string, msgpack::object const*> kvmap;
73  for (uint32_t i = 0; i < o.via.map.size; ++i) {
74  kvmap.emplace(
75  std::string(
76  o.via.map.ptr[i].key.via.str.ptr,
77  o.via.map.ptr[i].key.via.str.size),
78  &o.via.map.ptr[i].val);
79  }
80  define_map_imp<std::tuple<Args&...>, sizeof...(Args)>::unpack(o, a, kvmap);
81  }
83  {
84  static_assert(sizeof...(Args) % 2 == 0, "");
86  o->via.map.ptr = static_cast<msgpack::object_kv*>(z.allocate_align(sizeof(msgpack::object_kv)*sizeof...(Args)/2));
87  o->via.map.size = sizeof...(Args) / 2;
88 
89  define_map_imp<std::tuple<Args&...>, sizeof...(Args)>::object(o, z, a);
90  }
91 
92  std::tuple<Args&...> a;
93 };
94 
95 
96 template <typename... Args>
97 inline define_map<Args...> make_define_map(Args&... args)
98 {
99  return define_map<Args...>(args...);
100 }
101 
102 } // namespace type
104 } // MSGPACK_API_VERSION_NAMESPACE(v1)
106 } // namespace msgpack
107 
108 #endif // MSGPACK_V1_CPP11_DEFINE_MAP_HPP
static void unpack(msgpack::object const &o, Tuple const &t, std::map< std::string, msgpack::object const * > const &kvmap)
Definition: cpp11_define_map.hpp:31
Definition: cpp11_define_map.hpp:25
msgpack::object_kv * ptr
Definition: object_fwd.hpp:29
std::tuple< Args &... > a
Definition: cpp11_define_map.hpp:92
void * allocate_align(size_t size, size_t align=MSGPACK_ZONE_ALIGN)
Definition: cpp03_zone.hpp:236
static void object(msgpack::object *o, msgpack::zone &z, Tuple const &t)
Definition: cpp11_define_map.hpp:40
union_type via
Definition: object_fwd.hpp:92
Definition: cpp11_define_map.hpp:58
msgpack::object val
Definition: object.hpp:31
void msgpack_unpack(msgpack::object const &o) const
Definition: cpp11_define_map.hpp:69
Definition: adaptor_base.hpp:15
const char * ptr
Definition: object_fwd.hpp:34
Definition: cpp03_zone.hpp:22
define_map(Args &...args)
Definition: cpp11_define_map.hpp:59
Definition: object.hpp:29
static void pack(Packer &, Tuple const &)
Definition: cpp11_define_map.hpp:50
Definition: object_fwd.hpp:233
static void unpack(msgpack::object const &, Tuple const &, std::map< std::string, msgpack::object const * > const &)
Definition: cpp11_define_map.hpp:51
msgpack::object_map map
Definition: object_fwd.hpp:85
define_map make_define_map()
Definition: cpp03_define_map.hpp:2530
msgpack::object_str str
Definition: object_fwd.hpp:86
Object class that corresponding to MessagePack format object.
Definition: object_fwd.hpp:75
static void object(msgpack::object *, msgpack::zone &, Tuple const &)
Definition: cpp11_define_map.hpp:54
void msgpack_object(msgpack::object *o, msgpack::zone &z) const
Definition: cpp11_define_map.hpp:82
msgpack::type::object_type type
Definition: object_fwd.hpp:91
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition: versioning.hpp:58
msgpack::object key
Definition: object.hpp:30
uint32_t size
Definition: object_fwd.hpp:28
Definition: object_fwd_decl.hpp:40
static void pack(Packer &pk, Tuple const &t)
Definition: cpp11_define_map.hpp:27
uint32_t size
Definition: object_fwd.hpp:33
void msgpack_pack(Packer &pk) const
Definition: cpp11_define_map.hpp:62