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