Skip to content

Commit 6e1c486

Browse files
Make make_integer_sequence generic
So that it can be used for make_index_sequence and make_int_sequence.
1 parent dd9590e commit 6e1c486

File tree

1 file changed

+33
-48
lines changed

1 file changed

+33
-48
lines changed

include/xsimd/types/xsimd_utils.hpp

Lines changed: 33 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -200,80 +200,65 @@ namespace xsimd
200200

201201
#ifdef __cpp_lib_integer_sequence
202202
using std::integer_sequence;
203+
using std::make_integer_sequence;
203204
using std::index_sequence;
204205
using std::make_index_sequence;
206+
205207
using std::index_sequence_for;
206208
#else
207209
template <typename T, T... Is>
208210
struct integer_sequence {
209-
using value_type = T;
210-
static constexpr std::size_t size() noexcept { return sizeof...(Is); }
211+
using value_type = T;
212+
static constexpr std::size_t size() noexcept { return sizeof...(Is); }
211213
};
212214

213-
template <std::size_t... Is>
214-
using index_sequence = integer_sequence<std::size_t, Is...>;
215-
216215
template <typename Lhs, typename Rhs>
217-
struct make_index_sequence_concat;
216+
struct make_integer_sequence_concat;
218217

219-
template <std::size_t... Lhs, std::size_t... Rhs>
220-
struct make_index_sequence_concat<index_sequence<Lhs...>,
221-
index_sequence<Rhs...>>
222-
: identity<index_sequence<Lhs..., (sizeof...(Lhs) + Rhs)...>> {};
218+
template <typename T, T... Lhs, T... Rhs>
219+
struct make_integer_sequence_concat<integer_sequence<T, Lhs...>,
220+
integer_sequence<T, Rhs...>>
221+
: identity<integer_sequence<T, Lhs..., (sizeof...(Lhs) + Rhs)...>> {};
223222

224-
template <std::size_t N>
225-
struct make_index_sequence_impl;
223+
template <typename T>
224+
struct make_integer_sequence_impl;
226225

227-
template <std::size_t N>
228-
using make_index_sequence = typename make_index_sequence_impl<N>::type;
226+
template <typename T>
227+
struct make_integer_sequence_impl<std::integral_constant<T, (T)0>> : identity<integer_sequence<T>> {};
229228

230-
template <std::size_t N>
231-
struct make_index_sequence_impl
232-
: make_index_sequence_concat<make_index_sequence<N / 2>,
233-
make_index_sequence<N - (N / 2)>> {};
229+
template <typename T>
230+
struct make_integer_sequence_impl<std::integral_constant<T, (T)1>> : identity<integer_sequence<T, 0>> {};
234231

235-
template <>
236-
struct make_index_sequence_impl<0> : identity<index_sequence<>> {};
232+
template <typename T, T N>
233+
struct make_integer_sequence_impl<std::integral_constant<T, N>>
234+
: make_integer_sequence_concat<typename make_integer_sequence_impl<std::integral_constant<T, N / 2>>::type,
235+
typename make_integer_sequence_impl<std::integral_constant<T, N - (N / 2)>>::type> {};
237236

238-
template <>
239-
struct make_index_sequence_impl<1> : identity<index_sequence<0>> {};
240237

241-
template <typename... Ts>
242-
using index_sequence_for = make_index_sequence<sizeof...(Ts)>;
238+
template <typename T, T N>
239+
using make_integer_sequence = typename make_integer_sequence_impl<std::integral_constant<T, N>>::type;
243240

244241

245-
template <int... Is>
246-
using int_sequence = integer_sequence<int, Is...>;
247-
248-
template <typename Lhs, typename Rhs>
249-
struct make_int_sequence_concat;
250-
251-
template <int... Lhs, int... Rhs>
252-
struct make_int_sequence_concat<int_sequence<Lhs...>,
253-
int_sequence<Rhs...>>
254-
: identity<int_sequence<Lhs..., int(sizeof...(Lhs) + Rhs)...>> {};
242+
template <std::size_t... Is>
243+
using index_sequence = integer_sequence<std::size_t, Is...>;
255244

256245
template <std::size_t N>
257-
struct make_int_sequence_impl;
246+
using make_index_sequence = make_integer_sequence<std::size_t, N>;
258247

259-
template <std::size_t N>
260-
using make_int_sequence = typename make_int_sequence_impl<N>::type;
248+
template <typename... Ts>
249+
using index_sequence_for = make_index_sequence<sizeof...(Ts)>;
261250

262-
template <std::size_t N>
263-
struct make_int_sequence_impl
264-
: make_int_sequence_concat<make_int_sequence<N / 2>,
265-
make_int_sequence<N - (N / 2)>> {};
251+
#endif
266252

267-
template <>
268-
struct make_int_sequence_impl<0> : identity<int_sequence<>> {};
253+
template <int... Is>
254+
using int_sequence = integer_sequence<int, Is...>;
269255

270-
template <>
271-
struct make_int_sequence_impl<1> : identity<int_sequence<0>> {};
256+
template <int N>
257+
using make_int_sequence = make_integer_sequence<int, N>;
272258

273-
template <typename... Ts>
274-
using int_sequence_for = make_int_sequence<sizeof...(Ts)>;
259+
template <typename... Ts>
260+
using int_sequence_for = make_int_sequence<sizeof...(Ts)>;
275261

276-
#endif
277262
}
278263

279264
/***********************************

0 commit comments

Comments
 (0)