#ifndef BOOST_MP11_LIST_HPP_INCLUDED #define BOOST_MP11_LIST_HPP_INCLUDED // Copyright 2015-2017 Peter Dimov. // // Distributed under the Boost Software License, Version 1.0. // // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt #include #include #include #include namespace boost { namespace mp11 { // mp_size namespace detail { template struct mp_size_impl; template class L, class... T> struct mp_size_impl> { using type = mp_size_t; }; } // namespace detail template using mp_size = typename detail::mp_size_impl::type; // mp_empty template using mp_empty = mp_bool< mp_size::value == 0 >; // mp_front namespace detail { template struct mp_front_impl; template class L, class T1, class... T> struct mp_front_impl> { using type = T1; }; } // namespace detail template using mp_front = typename detail::mp_front_impl::type; // mp_pop_front namespace detail { template struct mp_pop_front_impl; template class L, class T1, class... T> struct mp_pop_front_impl> { using type = L; }; } // namespace detail template using mp_pop_front = typename detail::mp_pop_front_impl::type; // mp_first template using mp_first = mp_front; // mp_rest template using mp_rest = mp_pop_front; // mp_second namespace detail { template struct mp_second_impl; template class L, class T1, class T2, class... T> struct mp_second_impl> { using type = T2; }; } // namespace detail template using mp_second = typename detail::mp_second_impl::type; // mp_third namespace detail { template struct mp_third_impl; template class L, class T1, class T2, class T3, class... T> struct mp_third_impl> { using type = T3; }; } // namespace detail template using mp_third = typename detail::mp_third_impl::type; // mp_push_front namespace detail { template struct mp_push_front_impl; template class L, class... U, class... T> struct mp_push_front_impl, T...> { using type = L; }; } // namespace detail template using mp_push_front = typename detail::mp_push_front_impl::type; // mp_push_back namespace detail { template struct mp_push_back_impl; template class L, class... U, class... T> struct mp_push_back_impl, T...> { using type = L; }; } // namespace detail template using mp_push_back = typename detail::mp_push_back_impl::type; // mp_rename namespace detail { template class B> struct mp_rename_impl; template class A, class... T, template class B> struct mp_rename_impl, B> { using type = B; }; } // namespace detail template class B> using mp_rename = typename detail::mp_rename_impl::type; template class F, class L> using mp_apply = typename detail::mp_rename_impl::type; // mp_append namespace detail { template struct mp_append_impl; template<> struct mp_append_impl<> { using type = mp_list<>; }; template class L, class... T> struct mp_append_impl> { using type = L; }; template class L1, class... T1, template class L2, class... T2, class... Lr> struct mp_append_impl, L2, Lr...> { using type = typename mp_append_impl, Lr...>::type; }; #if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) #else template< template class L1, class... T1, template class L2, class... T2, template class L3, class... T3, template class L4, class... T4, template class L5, class... T5, template class L6, class... T6, template class L7, class... T7, template class L8, class... T8, template class L9, class... T9, template class L10, class... T10, class... Lr> struct mp_append_impl, L2, L3, L4, L5, L6, L7, L8, L9, L10, Lr...> { using type = typename mp_append_impl, Lr...>::type; }; #endif } // namespace detail template using mp_append = typename detail::mp_append_impl::type; // mp_replace_front namespace detail { template struct mp_replace_front_impl; template class L, class U1, class... U, class T> struct mp_replace_front_impl, T> { using type = L; }; } // namespace detail template using mp_replace_front = typename detail::mp_replace_front_impl::type; // mp_replace_first template using mp_replace_first = typename detail::mp_replace_front_impl::type; // mp_replace_second namespace detail { template struct mp_replace_second_impl; template class L, class U1, class U2, class... U, class T> struct mp_replace_second_impl, T> { using type = L; }; } // namespace detail template using mp_replace_second = typename detail::mp_replace_second_impl::type; // mp_replace_third namespace detail { template struct mp_replace_third_impl; template class L, class U1, class U2, class U3, class... U, class T> struct mp_replace_third_impl, T> { using type = L; }; } // namespace detail template using mp_replace_third = typename detail::mp_replace_third_impl::type; } // namespace mp11 } // namespace boost #endif // #ifndef BOOST_MP11_LIST_HPP_INCLUDED