@@ -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