MessagePack for C++
cpp11_msgpack_tuple.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_MSGPACK_TUPLE_HPP
11 #define MSGPACK_V1_CPP11_MSGPACK_TUPLE_HPP
12 
15 #include "msgpack/pack.hpp"
16 
17 namespace msgpack {
18 
22 
23 namespace type {
24 
25 template <class... Args>
26 inline tuple<Args...> make_tuple(Args&&... args) {
27  return tuple<Args...>(std::forward<Args>(args)...);
28 }
29 
30 template<class... Args>
31 inline tuple<Args&&...> forward_as_tuple (Args&&... args) noexcept {
32  return tuple<Args&&...>(std::forward<Args>(args)...);
33 }
34 
35 template <class... Tuples>
36 inline auto tuple_cat(Tuples&&... args) ->
37  decltype(
38  std::tuple_cat(std::forward<typename std::remove_reference<Tuples>::type::base>(args)...)
39  ) {
40  return std::tuple_cat(std::forward<typename std::remove_reference<Tuples>::type::base>(args)...);
41 }
42 
43 template <class... Args>
44 inline tuple<Args&...> tie(Args&... args) {
45  return tuple<Args&...>(args...);
46 }
47 } // namespace type
48 
49 // --- Pack from tuple to packer stream ---
50 template <typename Stream, typename Tuple, std::size_t N>
52  static void pack(
54  const Tuple& v) {
56  o.pack(type::get<N-1>(v));
57  }
58 };
59 
60 template <typename Stream, typename Tuple>
61 struct MsgpackTuplePacker<Stream, Tuple, 1> {
62  static void pack (
64  const Tuple& v) {
65  o.pack(type::get<0>(v));
66  }
67 };
68 
69 template <typename Stream, typename Tuple>
70 struct MsgpackTuplePacker<Stream, Tuple, 0> {
71  static void pack (
73  const Tuple&) {
74  }
75 };
76 
77 namespace adaptor {
78 
79 template <typename... Args>
80 struct pack<msgpack::type::tuple<Args...>> {
81  template <typename Stream>
84  const msgpack::type::tuple<Args...>& v) const {
85  o.pack_array(sizeof...(Args));
86  MsgpackTuplePacker<Stream, decltype(v), sizeof...(Args)>::pack(o, v);
87  return o;
88  }
89 };
90 
91 } // namespace adaptor
92 
93 // --- Convert from tuple to object ---
94 
95 template <typename T, typename... Args>
97  static msgpack::type::tuple<T, Args...> as(msgpack::object const& o) {
99  msgpack::type::make_tuple(o.via.array.ptr[o.via.array.size - sizeof...(Args) - 1].as<T>()),
101  }
102 };
103 
104 template <typename... Args>
106  static msgpack::type::tuple<Args...> as(msgpack::object const& o) {
108  }
109 };
110 
111 template <>
112 struct MsgpackTupleAs<> {
114  return msgpack::type::tuple<>();
115  }
116 };
117 
118 template <typename Tuple, std::size_t N>
120  static void convert(
121  msgpack::object const& o,
122  Tuple& v) {
124  o.via.array.ptr[N-1].convert<typename std::remove_reference<decltype(type::get<N-1>(v))>::type>(type::get<N-1>(v));
125  }
126 };
127 
128 template <typename Tuple>
129 struct MsgpackTupleConverter<Tuple, 1> {
130  static void convert (
131  msgpack::object const& o,
132  Tuple& v) {
133  o.via.array.ptr[0].convert<typename std::remove_reference<decltype(type::get<0>(v))>::type>(type::get<0>(v));
134  }
135 };
136 
137 template <typename Tuple>
138 struct MsgpackTupleConverter<Tuple, 0> {
139  static void convert (
140  msgpack::object const&,
141  Tuple&) {
142  }
143 };
144 
145 namespace adaptor {
146 
147 template <typename... Args>
148 struct as<msgpack::type::tuple<Args...>, typename std::enable_if<msgpack::all_of<msgpack::has_as, Args...>::value>::type> {
150  msgpack::object const& o) const {
151  if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
152  if (o.via.array.size < sizeof...(Args)) { throw msgpack::type_error(); }
153  return MsgpackTupleAs<Args...>::as(o);
154  }
155 };
156 
157 template <typename... Args>
158 struct convert<msgpack::type::tuple<Args...>> {
160  msgpack::object const& o,
162  if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
163  if(o.via.array.size < sizeof...(Args)) { throw msgpack::type_error(); }
164  MsgpackTupleConverter<decltype(v), sizeof...(Args)>::convert(o, v);
165  return o;
166  }
167 };
168 
169 } // namespace adaptor
170 
171 // --- Convert from tuple to object with zone ---
172 template <typename Tuple, std::size_t N>
174  static void convert(
176  const Tuple& v) {
178  o.via.array.ptr[N-1] = msgpack::object(type::get<N-1>(v), o.zone);
179  }
180 };
181 
182 template <typename Tuple>
184  static void convert (
186  const Tuple& v) {
187  o.via.array.ptr[0] = msgpack::object(type::get<0>(v), o.zone);
188  }
189 };
190 
191 template <typename Tuple>
193  static void convert (
195  const Tuple&) {
196  }
197 };
198 
199 namespace adaptor {
200 
201 template <typename... Args>
205  msgpack::type::tuple<Args...> const& v) const {
207  o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*sizeof...(Args)));
208  o.via.array.size = sizeof...(Args);
209  MsgpackTupleToObjectWithZone<decltype(v), sizeof...(Args)>::convert(o, v);
210  }
211 };
212 
213 } // namespace adaptor
214 
216 } // MSGPACK_API_VERSION_NAMESPACE(v1)
218 
219 } // namespace msgpack
220 
221 #endif // MSGPACK_CPP11_MSGPACK_TUPLE_HPP
tuple< Args &... > tie(Args &...args)
Definition: cpp11_msgpack_tuple.hpp:44
msgpack::object const & operator()(msgpack::object const &o, msgpack::type::tuple< Args... > &v) const
Definition: cpp11_msgpack_tuple.hpp:159
uint32_t size
Definition: object_fwd.hpp:23
void * allocate_align(size_t size, size_t align=MSGPACK_ZONE_ALIGN)
Definition: cpp03_zone.hpp:236
static msgpack::type::tuple< Args... > as(msgpack::object const &o)
Definition: cpp11_msgpack_tuple.hpp:106
static void convert(msgpack::object::with_zone &, const Tuple &)
Definition: cpp11_msgpack_tuple.hpp:193
Definition: object_fwd_decl.hpp:60
union_type via
Definition: object_fwd.hpp:92
static void convert(msgpack::object::with_zone &o, const Tuple &v)
Definition: cpp11_msgpack_tuple.hpp:174
msgpack::zone & zone
Definition: object.hpp:36
msgpack::type::tuple< Args... > operator()(msgpack::object const &o) const
Definition: cpp11_msgpack_tuple.hpp:149
msgpack::object * ptr
Definition: object_fwd.hpp:24
static void convert(msgpack::object const &o, Tuple &v)
Definition: cpp11_msgpack_tuple.hpp:130
packer< Stream > & pack_array(uint32_t n)
Packing array header and size.
Definition: pack.hpp:1160
Definition: adaptor_base.hpp:15
static void pack(msgpack::packer< Stream > &o, const Tuple &v)
Definition: cpp11_msgpack_tuple.hpp:52
static void convert(msgpack::object::with_zone &o, const Tuple &v)
Definition: cpp11_msgpack_tuple.hpp:184
Definition: cpp11_msgpack_tuple.hpp:173
void convert(T &v, msgpack::object const &o)
Definition: object.hpp:640
Definition: object.hpp:34
packer< Stream > & pack(const T &v)
Packing function template.
Definition: cpp11_msgpack_tuple.hpp:51
Definition: cpp03_msgpack_tuple.hpp:9165
std::enable_if< msgpack::has_as< T >::value, T >::type as() const
Get value as T.
Definition: object.hpp:567
Definition: adaptor_base.hpp:43
tuple make_tuple()
Definition: cpp03_msgpack_tuple.hpp:10375
Definition: object_fwd.hpp:222
static void pack(msgpack::packer< Stream > &, const Tuple &)
Definition: cpp11_msgpack_tuple.hpp:71
Definition: adaptor_base.hpp:32
msgpack::object_array array
Definition: object_fwd.hpp:84
void pack(msgpack::packer< Stream > &o, const T &v)
Definition: object.hpp:647
static msgpack::type::tuple as(msgpack::object const &)
Definition: cpp11_msgpack_tuple.hpp:113
static void pack(msgpack::packer< Stream > &o, const Tuple &v)
Definition: cpp11_msgpack_tuple.hpp:62
T & convert(T &v) const
Convert the object.
Definition: object.hpp:529
Object class that corresponding to MessagePack format object.
Definition: object_fwd.hpp:75
static void convert(msgpack::object const &o, Tuple &v)
Definition: cpp11_msgpack_tuple.hpp:120
Definition: cpp11_msgpack_tuple.hpp:105
msgpack::type::object_type type
Definition: object_fwd.hpp:91
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition: versioning.hpp:58
Definition: object_fwd_decl.hpp:39
static void convert(msgpack::object const &, Tuple &)
Definition: cpp11_msgpack_tuple.hpp:139
tuple< Args &&... > forward_as_tuple(Args &&...args) noexcept
Definition: cpp11_msgpack_tuple.hpp:31
void operator()(msgpack::object::with_zone &o, msgpack::type::tuple< Args... > const &v) const
Definition: cpp11_msgpack_tuple.hpp:203
Definition: cpp11_msgpack_tuple_decl.hpp:35
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, const msgpack::type::tuple< Args... > &v) const
Definition: cpp11_msgpack_tuple.hpp:82
auto tuple_cat(Tuples &&...args) -> decltype(std::tuple_cat(std::forward< typename std::remove_reference< Tuples >::type::base >(args)...))
Definition: cpp11_msgpack_tuple.hpp:36
The class template that supports continuous packing.
Definition: adaptor_base_decl.hpp:23
static msgpack::type::tuple< T, Args... > as(msgpack::object const &o)
Definition: cpp11_msgpack_tuple.hpp:97
Definition: cpp11_msgpack_tuple.hpp:119
Definition: cpp11_msgpack_tuple.hpp:96
Definition: adaptor_base.hpp:27