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;