1 //
2 // MessagePack for C++ static resolution routine
3 //
4 // Copyright (C) 2008-2015 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_DECL_HPP
11 #define MSGPACK_V1_CPP11_MSGPACK_TUPLE_DECL_HPP
12 
13 #include "msgpack/versioning.hpp"
14 #include "msgpack/object_fwd.hpp"
15 #include "msgpack/meta.hpp"
16 
17 #include <tuple>
18 
19 namespace msgpack {
20 
21 /// @cond
MSGPACK_API_VERSION_NAMESPACE(v1)22 MSGPACK_API_VERSION_NAMESPACE(v1) {
23 /// @endcond
24 
25 namespace type {
26     // tuple
27     using std::get;
28     using std::tuple_size;
29     using std::tuple_element;
30     using std::uses_allocator;
31     using std::ignore;
32     using std::swap;
33 
34     template< class... Types >
35     class tuple : public std::tuple<Types...> {
36     public:
37         using base = std::tuple<Types...>;
38 
39         tuple(tuple const&) = default;
40         tuple(tuple&&) = default;
41 
42         template<typename... OtherTypes>
43         tuple(OtherTypes&&... other):base(std::forward<OtherTypes>(other)...) {}
44 
45         template<typename... OtherTypes>
46         tuple(tuple<OtherTypes...> const& other):base(static_cast<std::tuple<OtherTypes...> const&>(other)) {}
47         template<typename... OtherTypes>
48         tuple(tuple<OtherTypes...> && other):base(static_cast<std::tuple<OtherTypes...> &&>(other)) {}
49 
50         tuple& operator=(tuple const&) = default;
51         tuple& operator=(tuple&&) = default;
52 
53         template<typename... OtherTypes>
54         tuple& operator=(tuple<OtherTypes...> const& other) {
55             *static_cast<base*>(this) = static_cast<std::tuple<OtherTypes...> const&>(other);
56             return *this;
57         }
58         template<typename... OtherTypes>
59         tuple& operator=(tuple<OtherTypes...> && other) {
60             *static_cast<base*>(this) = static_cast<std::tuple<OtherTypes...> &&>(other);
61             return *this;
62         }
63 
64         template< std::size_t I>
65         typename tuple_element<I, base >::type&
66         get() & { return std::get<I>(*this); }
67 
68         template< std::size_t I>
69         typename tuple_element<I, base >::type const&
70         get() const& { return std::get<I>(*this); }
71 
72         template< std::size_t I>
73         typename tuple_element<I, base >::type&&
74         get() && { return std::get<I>(*this); }
75 
76         std::size_t size() const { return sizeof...(Types); }
77     };
78 
79     template <class... Args>
80     tuple<Args...> make_tuple(Args&&... args);
81 
82     template<class... Args>
83     tuple<Args&&...> forward_as_tuple (Args&&... args) noexcept;
84 
85     template <class... Tuples>
86     auto tuple_cat(Tuples&&... args) ->
87         decltype(
88             std::tuple_cat(std::forward<typename std::remove_reference<Tuples>::type::base>(args)...)
89         );
90 
91     template <class... Args>
92     tuple<Args&...> tie(Args&... args);
93 
94 } // namespace type
95 
96 // --- Pack from tuple to packer stream ---
97 template <typename Stream, typename Tuple, std::size_t N>
98 struct MsgpackTuplePacker;
99 
100 // --- Convert from tuple to object ---
101 template <typename... Args>
102 struct MsgpackTupleAs;
103 
104 template <typename T, typename... Args>
105 struct MsgpackTupleAsImpl;
106 
107 template <typename Tuple, std::size_t N>
108 struct MsgpackTupleConverter;
109 
110 // --- Convert from tuple to object with zone ---
111 template <typename Tuple, std::size_t N>
112 struct MsgpackTupleToObjectWithZone;
113 
114 /// @cond
115 }  // MSGPACK_API_VERSION_NAMESPACE(v1)
116 ///@endcond
117 
118 }  // namespace msgpack
119 
120 #endif // MSGPACK_V1_CPP11_MSGPACK_TUPLE_DECL_HPP
121