diff --git a/include/boost/mp11/detail/mp_append.hpp b/include/boost/mp11/detail/mp_append.hpp index 840a524..61eaa05 100644 --- a/include/boost/mp11/detail/mp_append.hpp +++ b/include/boost/mp11/detail/mp_append.hpp @@ -24,6 +24,8 @@ namespace mp11 namespace detail { +// append_type_lists + template struct mp_append_impl; #if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) @@ -155,6 +157,40 @@ template< using type = typename mp_append_impl::type; }; +#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 ) + +template +struct mp_append_impl_cuda_workaround +{ + using type = mp_if_c<(sizeof...(L) > 111), mp_quote, mp_if_c<(sizeof...(L) > 11), mp_quote, mp_quote > >; +}; + +template struct mp_append_impl: mp_append_impl_cuda_workaround::type::template fn +{ +}; + +#else + +template struct mp_append_impl: + mp_cond< + mp_bool<(sizeof...(L) > 111)>, mp_quote, + mp_bool<(sizeof...(L) > 11)>, mp_quote, + mp_true, mp_quote + >::template fn +{ +}; + +#endif // #if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 ) + +#endif // #if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + +struct append_type_lists +{ + template using fn = typename mp_append_impl::type; +}; + +// append_value_lists + #if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) template struct append_value_impl @@ -191,41 +227,24 @@ struct append_value_impl, L2, L3, L4, L5, using type = typename append_value_impl, Lr...>::type; }; -#endif - -#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 ) - -template -struct mp_append_impl_cuda_workaround +struct append_value_lists { - using type = mp_if_c<(sizeof...(L) > 111), mp_quote, mp_if_c<(sizeof...(L) > 11), mp_quote, mp_quote > >; + template using fn = typename append_value_impl::type; }; -template struct mp_append_impl: mp_append_impl_cuda_workaround::type::template fn -{ -}; - -#else - -template struct mp_append_impl: - mp_cond< -#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) - mp_bool<(sizeof...(L) > 0 && sizeof...(L) == mp_count_if, mp_is_value_list>::value)>, mp_quote, -#endif - mp_bool<(sizeof...(L) > 111)>, mp_quote, - mp_bool<(sizeof...(L) > 11)>, mp_quote, - mp_true, mp_quote - >::template fn -{ -}; - -#endif - -#endif +#endif // #if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) } // namespace detail -template using mp_append = typename detail::mp_append_impl::type; +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template using mp_append = typename mp_if_c<(sizeof...(L) > 0 && sizeof...(L) == mp_count_if, mp_is_value_list>::value), detail::append_value_lists, detail::append_type_lists>::template fn; + +#else + +template using mp_append = detail::append_type_lists::fn; + +#endif } // namespace mp11 } // namespace boost