]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/context/include/boost/context/detail/tuple.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / context / include / boost / context / detail / tuple.hpp
CommitLineData
7c673cae
FG
1
2// Copyright Oliver Kowalke 2014.
3// Distributed under the Boost Software License, Version 1.0.
4// (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt)
6
7#ifndef BOOST_CONTEXT_DETAIL_TUPLE_H
8#define BOOST_CONTEXT_DETAIL_TUPLE_H
9
10#include <tuple>
11#include <utility>
12
13#include <boost/config.hpp>
14
15#include <boost/context/detail/config.hpp>
16#include <boost/context/detail/index_sequence.hpp>
17
18#ifdef BOOST_HAS_ABI_HEADERS
19# include BOOST_ABI_PREFIX
20#endif
21
22namespace boost {
23namespace context {
24namespace detail {
25
26template< typename ... S, typename ... T, std::size_t ... I >
27void
28head_impl( std::tuple< S ... > & s,
29 std::tuple< T ... > & t, index_sequence< I ... >) {
30 t = std::tuple< T ... >{ std::get< I >( s) ... };
31}
32
33template< typename ... S, typename ... T, std::size_t ... I >
34void
35head_impl( std::tuple< S ... > && s,
36 std::tuple< T ... > & t, index_sequence< I ... >) {
37 t = std::tuple< T ... >{ std::get< I >( std::move( s) ) ... };
38}
39
40template< typename ... S, std::size_t ... I1, typename ... T, std::size_t ... I2 >
41void
42tail_impl( std::tuple< S ... > & s, index_sequence< I1 ... >,
43 std::tuple< T ... > & t, index_sequence< I2 ... >) {
44 constexpr std::size_t Idx = (sizeof...(I1)) - (sizeof...(I2));
45 t = std::tuple< T ... >{ std::get< (Idx + I2) >( s) ... };
46}
47
48template< typename ... S, std::size_t ... I1, typename ... T, std::size_t ... I2 >
49void
50tail_impl( std::tuple< S ... > && s, index_sequence< I1 ... >,
51 std::tuple< T ... > & t, index_sequence< I2 ... >) {
52 constexpr std::size_t Idx = (sizeof...(I1)) - (sizeof...(I2));
53 t = std::tuple< T ... >{ std::get< (Idx + I2) >( std::move( s) ) ... };
54}
55
56template< typename ... T >
57class tuple_head;
58
59template< typename ... T >
60class tuple_head< std::tuple< T ... > > {
61private:
62 std::tuple< T ... > & t_;
63
64public:
65 tuple_head( std::tuple< T ... > & t) noexcept :
66 t_( t) {
67 }
68
69 template< typename ... S >
70 void operator=( std::tuple< S ... > & s) {
71 static_assert((sizeof...(T)) <= (sizeof...(S)), "invalid tuple size");
72 head_impl( s,
73 t_, index_sequence_for< T ... >{} );
74 }
75 template< typename ... S >
76 void operator=( std::tuple< S ... > && s) {
77 static_assert((sizeof...(T)) <= (sizeof...(S)), "invalid tuple size");
78 head_impl( std::move( s),
79 t_, index_sequence_for< T ... >{} );
80 }
81};
82
83template< typename ... T >
84class tuple_tail;
85
86template< typename ... T >
87class tuple_tail< std::tuple< T ... > > {
88private:
89 std::tuple< T ... > & t_;
90
91public:
92 tuple_tail( std::tuple< T ... > & t) noexcept :
93 t_( t) {
94 }
95
96 template< typename ... S >
97 void operator=( std::tuple< S ... > & s) {
98 static_assert((sizeof...(T)) <= (sizeof...(S)), "invalid tuple size");
99 tail_impl( s, index_sequence_for< S ... >{},
100 t_, index_sequence_for< T ... >{} );
101 }
102
103 template< typename ... S >
104 void operator=( std::tuple< S ... > && s) {
105 static_assert((sizeof...(T)) <= (sizeof...(S)), "invalid tuple size");
106 tail_impl( std::move( s), index_sequence_for< S ... >{},
107 t_, index_sequence_for< T ... >{} );
108 }
109};
110
111template< typename ... T >
112detail::tuple_head< std::tuple< T ... > >
113head( std::tuple< T ... > & tpl) {
114 return tuple_head< std::tuple< T ... > >{ tpl };
115}
116
117template< typename ... T >
118detail::tuple_tail< std::tuple< T ... > >
119tail( std::tuple< T ... > & tpl) {
120 return tuple_tail< std::tuple< T ... > >{ tpl };
121}
122
123}}}
124
125#ifdef BOOST_HAS_ABI_HEADERS
126#include BOOST_ABI_SUFFIX
127#endif
128
129#endif // BOOST_CONTEXT_DETAIL_TUPLE_H