2121#include " msgpack/versioning.hpp"
2222#include " msgpack/adaptor/adaptor_base.hpp"
2323#include " msgpack/adaptor/check_container_size.hpp"
24+ #include " msgpack/meta.hpp"
2425
2526#include < tuple>
2627
@@ -41,15 +42,6 @@ struct StdTuplePacker {
4142 }
4243};
4344
44- template <typename Stream, typename Tuple>
45- struct StdTuplePacker <Stream, Tuple, 1 > {
46- static void pack (
47- msgpack::packer<Stream>& o,
48- const Tuple& v) {
49- o.pack (std::get<0 >(v));
50- }
51- };
52-
5345template <typename Stream, typename Tuple>
5446struct StdTuplePacker <Stream, Tuple, 0 > {
5547 static void pack (
@@ -77,6 +69,32 @@ struct pack<std::tuple<Args...>> {
7769
7870// --- Convert from tuple to object ---
7971
72+ template <typename ... Args>
73+ struct StdTupleAs ;
74+
75+ template <typename T, typename ... Args>
76+ struct StdTupleAsImpl {
77+ static std::tuple<T, Args...> as (msgpack::object const & o) {
78+ return std::tuple_cat (
79+ std::make_tuple (o.via .array .ptr [o.via .array .size - sizeof ...(Args) - 1 ].as <T>()),
80+ StdTupleAs<Args...>::as (o));
81+ }
82+ };
83+
84+ template <typename ... Args>
85+ struct StdTupleAs {
86+ static std::tuple<Args...> as (msgpack::object const & o) {
87+ return StdTupleAsImpl<Args...>::as (o);
88+ }
89+ };
90+
91+ template <>
92+ struct StdTupleAs <> {
93+ static std::tuple<> as (msgpack::object const &) {
94+ return std::tuple<>();
95+ }
96+ };
97+
8098template <typename Tuple, std::size_t N>
8199struct StdTupleConverter {
82100 static void convert (
@@ -87,15 +105,6 @@ struct StdTupleConverter {
87105 }
88106};
89107
90- template <typename Tuple>
91- struct StdTupleConverter <Tuple, 1 > {
92- static void convert (
93- msgpack::object const & o,
94- Tuple& v) {
95- o.via .array .ptr [0 ].convert <typename std::remove_reference<decltype (std::get<0 >(v))>::type>(std::get<0 >(v));
96- }
97- };
98-
99108template <typename Tuple>
100109struct StdTupleConverter <Tuple, 0 > {
101110 static void convert (
@@ -106,6 +115,16 @@ struct StdTupleConverter<Tuple, 0> {
106115
107116namespace adaptor {
108117
118+ template <typename ... Args>
119+ struct as <std::tuple<Args...>, typename std::enable_if<msgpack::all_of<msgpack::has_as, Args...>::value>::type> {
120+ std::tuple<Args...> operator ()(
121+ msgpack::object const & o) const {
122+ if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error (); }
123+ if (o.via .array .size < sizeof ...(Args)) { throw msgpack::type_error (); }
124+ return StdTupleAs<Args...>::as (o);
125+ }
126+ };
127+
109128template <typename ... Args>
110129struct convert <std::tuple<Args...>> {
111130 msgpack::object const & operator ()(
@@ -131,15 +150,6 @@ struct StdTupleToObjectWithZone {
131150 }
132151};
133152
134- template <typename Tuple>
135- struct StdTupleToObjectWithZone <Tuple, 1 > {
136- static void convert (
137- msgpack::object::with_zone& o,
138- const Tuple& v) {
139- o.via .array .ptr [0 ] = msgpack::object (std::get<0 >(v), o.zone );
140- }
141- };
142-
143153template <typename Tuple>
144154struct StdTupleToObjectWithZone <Tuple, 0 > {
145155 static void convert (
0 commit comments