Chris@16
|
1 // Copyright (C) 2012-2013 Vicente J. Botet Escriba
|
Chris@16
|
2 //
|
Chris@16
|
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5
|
Chris@16
|
6 // 2013/04 Vicente J. Botet Escriba
|
Chris@16
|
7 // Provide implementation up to 10 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined.
|
Chris@16
|
8 // 2012/11 Vicente J. Botet Escriba
|
Chris@16
|
9 // Adapt to boost libc++ implementation
|
Chris@16
|
10
|
Chris@16
|
11 //===----------------------------------------------------------------------===//
|
Chris@16
|
12 //
|
Chris@16
|
13 // The LLVM Compiler Infrastructure
|
Chris@16
|
14 //
|
Chris@16
|
15 // This file is dual licensed under the MIT and the University of Illinois Open
|
Chris@16
|
16 // Source Licenses. See LICENSE.TXT for details.
|
Chris@16
|
17 //
|
Chris@16
|
18 // The make_tuple_indices C++11 code is based on the one from libcxx.
|
Chris@16
|
19 //===----------------------------------------------------------------------===//
|
Chris@16
|
20
|
Chris@16
|
21 #ifndef BOOST_THREAD_DETAIL_MAKE_TUPLE_INDICES_HPP
|
Chris@16
|
22 #define BOOST_THREAD_DETAIL_MAKE_TUPLE_INDICES_HPP
|
Chris@16
|
23
|
Chris@16
|
24 #include <boost/config.hpp>
|
Chris@16
|
25 #include <boost/static_assert.hpp>
|
Chris@16
|
26
|
Chris@16
|
27 namespace boost
|
Chris@16
|
28 {
|
Chris@16
|
29 namespace detail
|
Chris@16
|
30 {
|
Chris@16
|
31
|
Chris@16
|
32 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
Chris@16
|
33 // make_tuple_indices
|
Chris@16
|
34
|
Chris@16
|
35 template <std::size_t...> struct tuple_indices
|
Chris@16
|
36 {};
|
Chris@16
|
37
|
Chris@16
|
38 template <std::size_t Sp, class IntTuple, std::size_t Ep>
|
Chris@16
|
39 struct make_indices_imp;
|
Chris@16
|
40
|
Chris@16
|
41 template <std::size_t Sp, std::size_t ...Indices, std::size_t Ep>
|
Chris@16
|
42 struct make_indices_imp<Sp, tuple_indices<Indices...>, Ep>
|
Chris@16
|
43 {
|
Chris@16
|
44 typedef typename make_indices_imp<Sp+1, tuple_indices<Indices..., Sp>, Ep>::type type;
|
Chris@16
|
45 };
|
Chris@16
|
46
|
Chris@16
|
47 template <std::size_t Ep, std::size_t ...Indices>
|
Chris@16
|
48 struct make_indices_imp<Ep, tuple_indices<Indices...>, Ep>
|
Chris@16
|
49 {
|
Chris@16
|
50 typedef tuple_indices<Indices...> type;
|
Chris@16
|
51 };
|
Chris@16
|
52
|
Chris@16
|
53 template <std::size_t Ep, std::size_t Sp = 0>
|
Chris@16
|
54 struct make_tuple_indices
|
Chris@16
|
55 {
|
Chris@16
|
56 BOOST_STATIC_ASSERT_MSG(Sp <= Ep, "make_tuple_indices input error");
|
Chris@16
|
57 typedef typename make_indices_imp<Sp, tuple_indices<>, Ep>::type type;
|
Chris@16
|
58 };
|
Chris@16
|
59 #else
|
Chris@16
|
60
|
Chris@16
|
61 // - tuple forward declaration -----------------------------------------------
|
Chris@16
|
62 template <
|
Chris@16
|
63 std::size_t T0 = 0, std::size_t T1 = 0, std::size_t T2 = 0,
|
Chris@16
|
64 std::size_t T3 = 0, std::size_t T4 = 0, std::size_t T5 = 0,
|
Chris@16
|
65 std::size_t T6 = 0, std::size_t T7 = 0, std::size_t T8 = 0,
|
Chris@16
|
66 std::size_t T9 = 0>
|
Chris@16
|
67 class tuple_indices {};
|
Chris@16
|
68
|
Chris@16
|
69 template <std::size_t Sp, class IntTuple, std::size_t Ep>
|
Chris@16
|
70 struct make_indices_imp;
|
Chris@16
|
71
|
Chris@16
|
72 template <std::size_t Sp, std::size_t Ep>
|
Chris@16
|
73 struct make_indices_imp<Sp, tuple_indices<>, Ep>
|
Chris@16
|
74 {
|
Chris@16
|
75 typedef typename make_indices_imp<Sp+1, tuple_indices<Sp>, Ep>::type type;
|
Chris@16
|
76 };
|
Chris@16
|
77 template <std::size_t Sp, std::size_t I0, std::size_t Ep>
|
Chris@16
|
78 struct make_indices_imp<Sp, tuple_indices<I0>, Ep>
|
Chris@16
|
79 {
|
Chris@16
|
80 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, Sp>, Ep>::type type;
|
Chris@16
|
81 };
|
Chris@16
|
82 template <std::size_t Sp, std::size_t I0, std::size_t I1, std::size_t Ep>
|
Chris@16
|
83 struct make_indices_imp<Sp, tuple_indices<I0, I1>, Ep>
|
Chris@16
|
84 {
|
Chris@16
|
85 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, Sp>, Ep>::type type;
|
Chris@16
|
86 };
|
Chris@16
|
87 template <std::size_t Sp, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t Ep>
|
Chris@16
|
88 struct make_indices_imp<Sp, tuple_indices<I0, I1 , I2>, Ep>
|
Chris@16
|
89 {
|
Chris@16
|
90 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, Sp>, Ep>::type type;
|
Chris@16
|
91 };
|
Chris@16
|
92 template <std::size_t Sp, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3, std::size_t Ep>
|
Chris@16
|
93 struct make_indices_imp<Sp, tuple_indices<I0, I1 , I2, I3>, Ep>
|
Chris@16
|
94 {
|
Chris@16
|
95 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, Sp>, Ep>::type type;
|
Chris@16
|
96 };
|
Chris@16
|
97 template <std::size_t Sp, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3, std::size_t I4, std::size_t Ep>
|
Chris@16
|
98 struct make_indices_imp<Sp, tuple_indices<I0, I1 , I2, I3, I4>, Ep>
|
Chris@16
|
99 {
|
Chris@16
|
100 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, I4, Sp>, Ep>::type type;
|
Chris@16
|
101 };
|
Chris@16
|
102 template <std::size_t Sp, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3, std::size_t I4, std::size_t I5, std::size_t Ep>
|
Chris@16
|
103 struct make_indices_imp<Sp, tuple_indices<I0, I1 , I2, I3, I4, I5>, Ep>
|
Chris@16
|
104 {
|
Chris@16
|
105 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, I4, I5, Sp>, Ep>::type type;
|
Chris@16
|
106 };
|
Chris@16
|
107 template <std::size_t Sp, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3, std::size_t I4, std::size_t I5
|
Chris@16
|
108 , std::size_t I6
|
Chris@16
|
109 , std::size_t Ep>
|
Chris@16
|
110 struct make_indices_imp<Sp, tuple_indices<I0, I1 , I2, I3, I4, I5, I6>, Ep>
|
Chris@16
|
111 {
|
Chris@16
|
112 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, I4, I5, I6, Sp>, Ep>::type type;
|
Chris@16
|
113 };
|
Chris@16
|
114 template <std::size_t Sp, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3, std::size_t I4, std::size_t I5
|
Chris@16
|
115 , std::size_t I6
|
Chris@16
|
116 , std::size_t I7
|
Chris@16
|
117 , std::size_t Ep>
|
Chris@16
|
118 struct make_indices_imp<Sp, tuple_indices<I0, I1 , I2, I3, I4, I5, I6, I7>, Ep>
|
Chris@16
|
119 {
|
Chris@16
|
120 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, Sp>, Ep>::type type;
|
Chris@16
|
121 };
|
Chris@16
|
122 template <std::size_t Sp, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3, std::size_t I4, std::size_t I5
|
Chris@16
|
123 , std::size_t I6
|
Chris@16
|
124 , std::size_t I7
|
Chris@16
|
125 , std::size_t I8
|
Chris@16
|
126 , std::size_t Ep>
|
Chris@16
|
127 struct make_indices_imp<Sp, tuple_indices<I0, I1 , I2, I3, I4, I5, I6, I7, I8>, Ep>
|
Chris@16
|
128 {
|
Chris@16
|
129 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, I8, Sp>, Ep>::type type;
|
Chris@16
|
130 };
|
Chris@16
|
131 // template <std::size_t Sp, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3, std::size_t I4, std::size_t I5
|
Chris@16
|
132 // , std::size_t I6
|
Chris@16
|
133 // , std::size_t I7
|
Chris@16
|
134 // , std::size_t I8
|
Chris@16
|
135 // , std::size_t I9
|
Chris@16
|
136 // , std::size_t Ep>
|
Chris@16
|
137 // struct make_indices_imp<Sp, tuple_indices<I0, I1 , I2, I3, I4, I5, I6, I7, I8, I9>, Ep>
|
Chris@16
|
138 // {
|
Chris@16
|
139 // typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, I8, I9, Sp>, Ep>::type type;
|
Chris@16
|
140 // };
|
Chris@16
|
141
|
Chris@16
|
142 template <std::size_t Ep>
|
Chris@16
|
143 struct make_indices_imp<Ep, tuple_indices<>, Ep>
|
Chris@16
|
144 {
|
Chris@16
|
145 typedef tuple_indices<> type;
|
Chris@16
|
146 };
|
Chris@16
|
147 template <std::size_t Ep, std::size_t I0>
|
Chris@16
|
148 struct make_indices_imp<Ep, tuple_indices<I0>, Ep>
|
Chris@16
|
149 {
|
Chris@16
|
150 typedef tuple_indices<I0> type;
|
Chris@16
|
151 };
|
Chris@16
|
152 template <std::size_t Ep, std::size_t I0, std::size_t I1>
|
Chris@16
|
153 struct make_indices_imp<Ep, tuple_indices<I0, I1>, Ep>
|
Chris@16
|
154 {
|
Chris@16
|
155 typedef tuple_indices<I0, I1> type;
|
Chris@16
|
156 };
|
Chris@16
|
157 template <std::size_t Ep, std::size_t I0, std::size_t I1, std::size_t I2>
|
Chris@16
|
158 struct make_indices_imp<Ep, tuple_indices<I0, I1, I2>, Ep>
|
Chris@16
|
159 {
|
Chris@16
|
160 typedef tuple_indices<I0, I1, I2> type;
|
Chris@16
|
161 };
|
Chris@16
|
162 template <std::size_t Ep, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3>
|
Chris@16
|
163 struct make_indices_imp<Ep, tuple_indices<I0, I1, I2, I3>, Ep>
|
Chris@16
|
164 {
|
Chris@16
|
165 typedef tuple_indices<I0, I1, I2, I3> type;
|
Chris@16
|
166 };
|
Chris@16
|
167 template <std::size_t Ep, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3, std::size_t I4>
|
Chris@16
|
168 struct make_indices_imp<Ep, tuple_indices<I0, I1, I2, I3, I4>, Ep>
|
Chris@16
|
169 {
|
Chris@16
|
170 typedef tuple_indices<I0, I1, I2, I3, I4> type;
|
Chris@16
|
171 };
|
Chris@16
|
172 template <std::size_t Ep, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3, std::size_t I4, std::size_t I5>
|
Chris@16
|
173 struct make_indices_imp<Ep, tuple_indices<I0, I1, I2, I3, I4, I5>, Ep>
|
Chris@16
|
174 {
|
Chris@16
|
175 typedef tuple_indices<I0, I1, I2, I3, I4, I5> type;
|
Chris@16
|
176 };
|
Chris@16
|
177 template <std::size_t Ep, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3, std::size_t I4, std::size_t I5
|
Chris@16
|
178 , std::size_t I6
|
Chris@16
|
179 >
|
Chris@16
|
180 struct make_indices_imp<Ep, tuple_indices<I0, I1, I2, I3, I4, I5, I6>, Ep>
|
Chris@16
|
181 {
|
Chris@16
|
182 typedef tuple_indices<I0, I1, I2, I3, I4, I5, I6> type;
|
Chris@16
|
183 };
|
Chris@16
|
184 template <std::size_t Ep, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3, std::size_t I4, std::size_t I5
|
Chris@16
|
185 , std::size_t I6
|
Chris@16
|
186 , std::size_t I7
|
Chris@16
|
187 >
|
Chris@16
|
188 struct make_indices_imp<Ep, tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7>, Ep>
|
Chris@16
|
189 {
|
Chris@16
|
190 typedef tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7> type;
|
Chris@16
|
191 };
|
Chris@16
|
192 template <std::size_t Ep, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3, std::size_t I4, std::size_t I5
|
Chris@16
|
193 , std::size_t I6
|
Chris@16
|
194 , std::size_t I7
|
Chris@16
|
195 , std::size_t I8
|
Chris@16
|
196 >
|
Chris@16
|
197 struct make_indices_imp<Ep, tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, I8>, Ep>
|
Chris@16
|
198 {
|
Chris@16
|
199 typedef tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, I8> type;
|
Chris@16
|
200 };
|
Chris@16
|
201
|
Chris@16
|
202 template <std::size_t Ep, std::size_t I0, std::size_t I1, std::size_t I2, std::size_t I3, std::size_t I4, std::size_t I5
|
Chris@16
|
203 , std::size_t I6
|
Chris@16
|
204 , std::size_t I7
|
Chris@16
|
205 , std::size_t I8
|
Chris@16
|
206 , std::size_t I9
|
Chris@16
|
207 >
|
Chris@16
|
208 struct make_indices_imp<Ep, tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, I8, I9>, Ep>
|
Chris@16
|
209 {
|
Chris@16
|
210 typedef tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, I8, I9> type;
|
Chris@16
|
211 };
|
Chris@16
|
212
|
Chris@16
|
213 template <std::size_t Ep, std::size_t Sp = 0>
|
Chris@16
|
214 struct make_tuple_indices
|
Chris@16
|
215 {
|
Chris@16
|
216 BOOST_STATIC_ASSERT_MSG(Sp <= Ep, "make_tuple_indices input error");
|
Chris@16
|
217 typedef typename make_indices_imp<Sp, tuple_indices<>, Ep>::type type;
|
Chris@16
|
218 };
|
Chris@16
|
219
|
Chris@16
|
220 #endif
|
Chris@16
|
221 }
|
Chris@16
|
222 }
|
Chris@16
|
223
|
Chris@16
|
224 #endif // header
|