#ifndef BOOST_MP11_LIST_HPP_INCLUDED #define BOOST_MP11_LIST_HPP_INCLUDED // Copyright 2015 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 namespace boost { // 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; // 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; }; } // namespace detail template using mp_append = typename detail::mp_append_impl::type; } // namespace boost #endif // #ifndef BOOST_MP11_LIST_HPP_INCLUDED