diff options
Diffstat (limited to 'libcxx/include/__utility/integer_sequence.h')
-rw-r--r-- | libcxx/include/__utility/integer_sequence.h | 87 |
1 files changed, 12 insertions, 75 deletions
diff --git a/libcxx/include/__utility/integer_sequence.h b/libcxx/include/__utility/integer_sequence.h index e63f3f2..ccce943 100644 --- a/libcxx/include/__utility/integer_sequence.h +++ b/libcxx/include/__utility/integer_sequence.h @@ -31,65 +31,16 @@ struct __integer_sequence { using __to_tuple_indices = __tuple_indices<(_Values + _Sp)...>; }; -#if !__has_builtin(__make_integer_seq) || defined(_LIBCPP_TESTING_FALLBACK_MAKE_INTEGER_SEQUENCE) - -namespace __detail { - -template <typename _Tp, size_t... _Extra> -struct __repeat; -template <typename _Tp, _Tp... _Np, size_t... _Extra> -struct __repeat<__integer_sequence<_Tp, _Np...>, _Extra...> { - typedef _LIBCPP_NODEBUG __integer_sequence< - _Tp, - _Np..., - sizeof...(_Np) + _Np..., - 2 * sizeof...(_Np) + _Np..., - 3 * sizeof...(_Np) + _Np..., - 4 * sizeof...(_Np) + _Np..., - 5 * sizeof...(_Np) + _Np..., - 6 * sizeof...(_Np) + _Np..., - 7 * sizeof...(_Np) + _Np..., - _Extra...> - type; -}; - -template <size_t _Np> -struct __parity; -template <size_t _Np> -struct __make : __parity<_Np % 8>::template __pmake<_Np> {}; - -// clang-format off -template<> struct __make<0> { typedef __integer_sequence<size_t> type; }; -template<> struct __make<1> { typedef __integer_sequence<size_t, 0> type; }; -template<> struct __make<2> { typedef __integer_sequence<size_t, 0, 1> type; }; -template<> struct __make<3> { typedef __integer_sequence<size_t, 0, 1, 2> type; }; -template<> struct __make<4> { typedef __integer_sequence<size_t, 0, 1, 2, 3> type; }; -template<> struct __make<5> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4> type; }; -template<> struct __make<6> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4, 5> type; }; -template<> struct __make<7> { typedef __integer_sequence<size_t, 0, 1, 2, 3, 4, 5, 6> type; }; - -template<> struct __parity<0> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type> {}; }; -template<> struct __parity<1> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 1> {}; }; -template<> struct __parity<2> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 2, _Np - 1> {}; }; -template<> struct __parity<3> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 3, _Np - 2, _Np - 1> {}; }; -template<> struct __parity<4> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; -template<> struct __parity<5> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; -template<> struct __parity<6> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; -template<> struct __parity<7> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 7, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; }; -// clang-format on - -} // namespace __detail - -#endif - #if __has_builtin(__make_integer_seq) template <size_t _Ep, size_t _Sp> using __make_indices_imp = typename __make_integer_seq<__integer_sequence, size_t, _Ep - _Sp>::template __to_tuple_indices<_Sp>; -#else +#elif __has_builtin(__integer_pack) template <size_t _Ep, size_t _Sp> -using __make_indices_imp = typename __detail::__make<_Ep - _Sp>::type::template __to_tuple_indices<_Sp>; - +using __make_indices_imp = + typename __integer_sequence<size_t, __integer_pack(_Ep - _Sp)...>::template __to_tuple_indices<_Sp>; +#else +# error "No known way to get an integer pack from the compiler" #endif #if _LIBCPP_STD_VER >= 14 @@ -104,34 +55,20 @@ struct _LIBCPP_TEMPLATE_VIS integer_sequence { template <size_t... _Ip> using index_sequence = integer_sequence<size_t, _Ip...>; -# if __has_builtin(__make_integer_seq) && !defined(_LIBCPP_TESTING_FALLBACK_MAKE_INTEGER_SEQUENCE) +# if __has_builtin(__make_integer_seq) template <class _Tp, _Tp _Ep> -using __make_integer_sequence _LIBCPP_NODEBUG = __make_integer_seq<integer_sequence, _Tp, _Ep>; - -# else +using make_integer_sequence _LIBCPP_NODEBUG = __make_integer_seq<integer_sequence, _Tp, _Ep>; -template <typename _Tp, _Tp _Np> -using __make_integer_sequence_unchecked _LIBCPP_NODEBUG = - typename __detail::__make<_Np>::type::template __convert<integer_sequence, _Tp>; +# elif __has_builtin(__integer_pack) -template <class _Tp, _Tp _Ep> -struct __make_integer_sequence_checked { - static_assert(is_integral<_Tp>::value, "std::make_integer_sequence can only be instantiated with an integral type"); - static_assert(0 <= _Ep, "std::make_integer_sequence must have a non-negative sequence length"); - // Workaround GCC bug by preventing bad installations when 0 <= _Ep - // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68929 - typedef _LIBCPP_NODEBUG __make_integer_sequence_unchecked<_Tp, 0 <= _Ep ? _Ep : 0> type; -}; - -template <class _Tp, _Tp _Ep> -using __make_integer_sequence _LIBCPP_NODEBUG = typename __make_integer_sequence_checked<_Tp, _Ep>::type; +template <class _Tp, _Tp _SequenceSize> +using make_integer_sequence _LIBCPP_NODEBUG = integer_sequence<_Tp, __integer_pack(_SequenceSize)...>; +# else +# error "No known way to get an integer pack from the compiler" # endif -template <class _Tp, _Tp _Np> -using make_integer_sequence = __make_integer_sequence<_Tp, _Np>; - template <size_t _Np> using make_index_sequence = make_integer_sequence<size_t, _Np>; |