1 // Copyright (C) 2012-2013 Vicente J. Botet Escriba
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)
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
11 //===----------------------------------------------------------------------===//
13 // The LLVM Compiler Infrastructure
15 // This file is dual licensed under the MIT and the University of Illinois Open
16 // Source Licenses. See LICENSE.TXT for details.
18 // The make_tuple_indices C++11 code is based on the one from libcxx.
19 //===----------------------------------------------------------------------===//
21 #ifndef BOOST_THREAD_DETAIL_MAKE_TUPLE_INDICES_HPP
22 #define BOOST_THREAD_DETAIL_MAKE_TUPLE_INDICES_HPP
24 #include <boost/config.hpp>
25 #include <boost/static_assert.hpp>
32 #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
35 template <std::size_t...> struct tuple_indices
38 template <std::size_t Sp, class IntTuple, std::size_t Ep>
39 struct make_indices_imp;
41 template <std::size_t Sp, std::size_t ...Indices, std::size_t Ep>
42 struct make_indices_imp<Sp, tuple_indices<Indices...>, Ep>
44 typedef typename make_indices_imp<Sp+1, tuple_indices<Indices..., Sp>, Ep>::type type;
47 template <std::size_t Ep, std::size_t ...Indices>
48 struct make_indices_imp<Ep, tuple_indices<Indices...>, Ep>
50 typedef tuple_indices<Indices...> type;
53 template <std::size_t Ep, std::size_t Sp = 0>
54 struct make_tuple_indices
56 BOOST_STATIC_ASSERT_MSG(Sp <= Ep, "make_tuple_indices input error");
57 typedef typename make_indices_imp<Sp, tuple_indices<>, Ep>::type type;
61 // - tuple forward declaration -----------------------------------------------
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,
67 class tuple_indices {};
69 template <std::size_t Sp, class IntTuple, std::size_t Ep>
70 struct make_indices_imp;
72 template <std::size_t Sp, std::size_t Ep>
73 struct make_indices_imp<Sp, tuple_indices<>, Ep>
75 typedef typename make_indices_imp<Sp+1, tuple_indices<Sp>, Ep>::type type;
77 template <std::size_t Sp, std::size_t I0, std::size_t Ep>
78 struct make_indices_imp<Sp, tuple_indices<I0>, Ep>
80 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, Sp>, Ep>::type type;
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>
85 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, Sp>, Ep>::type type;
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>
90 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, Sp>, Ep>::type type;
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>
95 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, Sp>, Ep>::type type;
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>
100 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, I4, Sp>, Ep>::type type;
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>
105 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, I4, I5, Sp>, Ep>::type type;
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
110 struct make_indices_imp<Sp, tuple_indices<I0, I1 , I2, I3, I4, I5, I6>, Ep>
112 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, I4, I5, I6, Sp>, Ep>::type type;
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
118 struct make_indices_imp<Sp, tuple_indices<I0, I1 , I2, I3, I4, I5, I6, I7>, Ep>
120 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, Sp>, Ep>::type type;
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
127 struct make_indices_imp<Sp, tuple_indices<I0, I1 , I2, I3, I4, I5, I6, I7, I8>, Ep>
129 typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, I8, Sp>, Ep>::type type;
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
137 // struct make_indices_imp<Sp, tuple_indices<I0, I1 , I2, I3, I4, I5, I6, I7, I8, I9>, Ep>
139 // typedef typename make_indices_imp<Sp+1, tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, I8, I9, Sp>, Ep>::type type;
142 template <std::size_t Ep>
143 struct make_indices_imp<Ep, tuple_indices<>, Ep>
145 typedef tuple_indices<> type;
147 template <std::size_t Ep, std::size_t I0>
148 struct make_indices_imp<Ep, tuple_indices<I0>, Ep>
150 typedef tuple_indices<I0> type;
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>
155 typedef tuple_indices<I0, I1> type;
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>
160 typedef tuple_indices<I0, I1, I2> type;
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>
165 typedef tuple_indices<I0, I1, I2, I3> type;
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>
170 typedef tuple_indices<I0, I1, I2, I3, I4> type;
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>
175 typedef tuple_indices<I0, I1, I2, I3, I4, I5> type;
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
180 struct make_indices_imp<Ep, tuple_indices<I0, I1, I2, I3, I4, I5, I6>, Ep>
182 typedef tuple_indices<I0, I1, I2, I3, I4, I5, I6> type;
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
188 struct make_indices_imp<Ep, tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7>, Ep>
190 typedef tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7> type;
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
197 struct make_indices_imp<Ep, tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, I8>, Ep>
199 typedef tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, I8> type;
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
208 struct make_indices_imp<Ep, tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, I8, I9>, Ep>
210 typedef tuple_indices<I0, I1, I2, I3, I4, I5, I6, I7, I8, I9> type;
213 template <std::size_t Ep, std::size_t Sp = 0>
214 struct make_tuple_indices
216 BOOST_STATIC_ASSERT_MSG(Sp <= Ep, "make_tuple_indices input error");
217 typedef typename make_indices_imp<Sp, tuple_indices<>, Ep>::type type;