9
9
#define PUSHKIN_VECTOR_DETAIL_HPP_
10
10
11
11
#include < type_traits>
12
+ #include < utility>
13
+
12
14
#include < pushkin/math/detail/axis_names.hpp>
13
15
#include < pushkin/math/detail/value_traits.hpp>
14
16
15
17
namespace psst {
16
18
namespace math {
17
19
18
20
namespace detail {
19
- /* * Variadic template arguments unwrapping */
20
21
22
+ /* * Variadic template arguments unwrapping */
21
23
template < ::std::size_t Index, typename T >
22
24
struct data_holder {
23
25
static constexpr ::std::size_t index = Index;
@@ -60,34 +62,15 @@ struct data_holder {
60
62
}
61
63
};
62
64
63
- template < ::std::size_t ... Indexes >
64
- struct indexes_tuple {
65
- static constexpr ::std::size_t size = sizeof ... (Indexes);
66
- };
67
-
68
- template < ::std::size_t num, typename tp = indexes_tuple< > >
69
- struct index_builder ;
70
-
71
- template < ::std::size_t num, size_t ... Indexes >
72
- struct index_builder < num, indexes_tuple< Indexes ... > > : index_builder<
73
- num - 1 , indexes_tuple< Indexes ..., sizeof ... (Indexes) > > {
74
- };
75
-
76
- template < ::std::size_t ... Indexes >
77
- struct index_builder < 0 , indexes_tuple< Indexes ... > > {
78
- using type = indexes_tuple< Indexes ... >;
79
- static constexpr ::std::size_t size = sizeof ... (Indexes);
80
- };
81
-
82
65
template < typename IndexTuple, typename T >
83
66
struct vector_builder ;
84
67
85
68
template < ::std::size_t ... Indexes, typename T >
86
- struct vector_builder < indexes_tuple < Indexes ... >, T > :
69
+ struct vector_builder < std::index_sequence < Indexes ... >, T > :
87
70
data_holder< Indexes, T > ... {
88
71
89
72
static constexpr ::std::size_t size = sizeof ... (Indexes);
90
- using indexes_tuple_type = indexes_tuple < Indexes ... >;
73
+ using indexes_tuple_type = std::index_sequence < Indexes ... >;
91
74
using this_type = vector_builder< indexes_tuple_type, T >;
92
75
93
76
using element_type = T;
@@ -120,7 +103,7 @@ struct vector_builder< indexes_tuple< Indexes ... >, T > :
120
103
*/
121
104
template < size_t ... IndexesR, typename U >
122
105
vector_builder (
123
- vector_builder< indexes_tuple < IndexesR ... >, U > const & rhs,
106
+ vector_builder< std::index_sequence < IndexesR ... >, U > const & rhs,
124
107
typename ::std::enable_if< size <= sizeof ... (IndexesR) >::type* = 0 )
125
108
: data_holder< Indexes, T >( rhs.template at< Indexes >() ) ... {}
126
109
@@ -187,7 +170,7 @@ struct vector_builder< indexes_tuple< Indexes ... >, T > :
187
170
iterator
188
171
end ()
189
172
{
190
- return begin () + indexes_tuple_type:: size;
173
+ return begin () + size;
191
174
}
192
175
193
176
const_iterator
@@ -198,13 +181,13 @@ struct vector_builder< indexes_tuple< Indexes ... >, T > :
198
181
const_iterator
199
182
cend () const
200
183
{
201
- return begin () + indexes_tuple_type:: size;
184
+ return begin () + size;
202
185
}
203
186
204
187
lvalue_reference
205
188
operator [](size_t idx)
206
189
{
207
- assert (idx < indexes_tuple_type:: size);
190
+ assert (idx < size);
208
191
return begin ()[idx];
209
192
}
210
193
0 commit comments