Edit: /usr/include/boost/mp11/algorithm.hpp (36683B)
#ifndef BOOST_MP11_ALGORITHM_HPP_INCLUDED
#define BOOST_MP11_ALGORITHM_HPP_INCLUDED
// Copyright 2015-2019 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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace boost
{
namespace mp11
{
// mp_transform
namespace detail
{
template class F, class... L> struct mp_transform_impl
{
};
template class F, template class L, class... T> struct mp_transform_impl>
{
#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 )
template struct f { using type = F; };
using type = L::type...>;
#else
using type = L...>;
#endif
};
template class F, template class L1, class... T1, template class L2, class... T2> struct mp_transform_impl, L2>
{
#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 )
template struct f { using type = F; };
using type = L1::type...>;
#else
using type = L1...>;
#endif
};
template class F, template class L1, class... T1, template class L2, class... T2, template class L3, class... T3> struct mp_transform_impl, L2, L3>
{
#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 )
template struct f { using type = F; };
using type = L1::type...>;
#else
using type = L1...>;
#endif
};
#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, == 1900 ) || BOOST_MP11_WORKAROUND( BOOST_MP11_GCC, < 40800 )
template using mp_same_size_1 = mp_same...>;
template struct mp_same_size_2: mp_defer {};
#endif
struct list_size_mismatch
{
};
#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 )
template class F, class... L> struct mp_transform_cuda_workaround
{
using type = mp_if...>, detail::mp_transform_impl, detail::list_size_mismatch>;
};
#endif
} // namespace detail
#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, == 1900 ) || BOOST_MP11_WORKAROUND( BOOST_MP11_GCC, < 40800 )
template class F, class... L> using mp_transform = typename mp_if::type, detail::mp_transform_impl, detail::list_size_mismatch>::type;
#else
#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 )
template class F, class... L> using mp_transform = typename detail::mp_transform_cuda_workaround< F, L...>::type::type;
#else
template class F, class... L> using mp_transform = typename mp_if...>, detail::mp_transform_impl, detail::list_size_mismatch>::type;
#endif
#endif
template using mp_transform_q = mp_transform;
namespace detail
{
template class F, template class L1, class... T1, template class L2, class... T2, template class L3, class... T3, template class L4, class... T4, class... L> struct mp_transform_impl, L2, L3, L4, L...>
{
using A1 = L1...>;
template using _f = mp_transform;
using A2 = mp_fold, A1, _f>;
template using _g = mp_apply;
using type = mp_transform<_g, A2>;
};
} // namespace detail
// mp_transform_if
namespace detail
{
template class P, template class F, class... L> struct mp_transform_if_impl
{
// the stupid quote-unquote dance avoids "pack expansion used as argument for non-pack parameter of alias template"
using Qp = mp_quote;
using Qf = mp_quote;
#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 )
template struct _f_ { using type = mp_eval_if_q>, mp_first>, Qf, U...>; };
template using _f = typename _f_::type;
#else
template using _f = mp_eval_if_q>, mp_first>, Qf, U...>;
#endif
using type = mp_transform<_f, L...>;
};
} // namespace detail
template class P, template class F, class... L> using mp_transform_if = typename detail::mp_transform_if_impl::type;
template using mp_transform_if_q = typename detail::mp_transform_if_impl::type;
// mp_filter
namespace detail
{
template class P, class L1, class... L> struct mp_filter_impl
{
using Qp = mp_quote;
template using _f = mp_if< mp_invoke_q, mp_list, mp_list<> >;
using _t1 = mp_transform<_f, L1, L...>;
using _t2 = mp_apply;
using type = mp_assign;
};
} // namespace detail
template class P, class... L> using mp_filter = typename detail::mp_filter_impl::type;
template using mp_filter_q = typename detail::mp_filter_impl::type;
// mp_fill
namespace detail
{
template struct mp_fill_impl;
template class L, class... T, class V> struct mp_fill_impl, V>
{
#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1900 )
template struct _f { using type = V; };
using type = L::type...>;
#else
template using _f = V;
using type = L<_f...>;
#endif
};
} // namespace detail
template using mp_fill = typename detail::mp_fill_impl::type;
// mp_contains
template using mp_contains = mp_to_bool>;
// mp_repeat(_c)
namespace detail
{
template struct mp_repeat_c_impl
{
using _l1 = typename mp_repeat_c_impl::type;
using _l2 = typename mp_repeat_c_impl::type;
using type = mp_append<_l1, _l1, _l2>;
};
template struct mp_repeat_c_impl
{
using type = mp_clear;
};
template struct mp_repeat_c_impl
{
using type = L;
};
} // namespace detail
template using mp_repeat_c = typename detail::mp_repeat_c_impl::type;
template using mp_repeat = typename detail::mp_repeat_c_impl::type;
// mp_product
namespace detail
{
template class F, class P, class... L> struct mp_product_impl_2
{
};
template class F, class P> struct mp_product_impl_2
{
using type = mp_list>;
};
template class F, class P, template class L1, class... T1, class... L> struct mp_product_impl_2, L...>
{
using type = mp_append, L...>::type...>;
};
template class F, class... L> struct mp_product_impl
{
};
template class F> struct mp_product_impl
{
using type = mp_list< F<> >;
};
template class F, class L1, class... L> struct mp_product_impl
{
using type = mp_assign, L1, L...>::type>;
};
} // namespace detail
template class F, class... L> using mp_product = typename detail::mp_product_impl::type;
template using mp_product_q = typename detail::mp_product_impl::type;
// mp_drop(_c)
namespace detail
{
template struct mp_drop_impl;
template class L, class... T, template class L2, class... U> struct mp_drop_impl, L2>
{
template static mp_identity> f( U*..., mp_identity*... );
using R = decltype( f( (mp_identity*)0 ... ) );
using type = typename R::type;
};
} // namespace detail
template using mp_drop_c = typename detail::mp_drop_impl, N>>::type;
template using mp_drop = typename detail::mp_drop_impl, N>>::type;
// mp_from_sequence
namespace detail
{
template struct mp_from_sequence_impl;
template class S, class U, U... J> struct mp_from_sequence_impl>
{
using type = mp_list...>;
};
} // namespace detail
template using mp_from_sequence = typename detail::mp_from_sequence_impl::type;
// mp_iota(_c)
template using mp_iota_c = mp_from_sequence>;
template using mp_iota = mp_from_sequence::type, N::value>>;
// mp_at(_c)
namespace detail
{
template struct mp_at_c_impl;
#if defined(BOOST_MP11_HAS_TYPE_PACK_ELEMENT)
template class L, class... T, std::size_t I> struct mp_at_c_impl, I>
{
using type = __type_pack_element;
};
#else
template struct mp_at_c_impl
{
using _map = mp_transform >, L>;
using type = mp_second > >;
};
#endif
#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 )
template struct mp_at_c_cuda_workaround
{
using type = mp_if_c<(I < mp_size::value), detail::mp_at_c_impl, void>;
};
#endif
} // namespace detail
#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 )
template using mp_at_c = typename detail::mp_at_c_cuda_workaround< L, I >::type::type;
#else
template using mp_at_c = typename mp_if_c<(I < mp_size::value), detail::mp_at_c_impl, void>::type;
#endif
template using mp_at = mp_at_c;
// mp_take(_c)
namespace detail
{
template struct mp_take_c_impl
{
};
template class L, class... T>
struct mp_take_c_impl<0, L>
{
using type = L<>;
};
template class L, class T1, class... T>
struct mp_take_c_impl<1, L>
{
using type = L;
};
template class L, class T1, class T2, class... T>
struct mp_take_c_impl<2, L>
{
using type = L;
};
template class L, class T1, class T2, class T3, class... T>
struct mp_take_c_impl<3, L>
{
using type = L;
};
template class L, class T1, class T2, class T3, class T4, class... T>
struct mp_take_c_impl<4, L>
{
using type = L;
};
template class L, class T1, class T2, class T3, class T4, class T5, class... T>
struct mp_take_c_impl<5, L>
{
using type = L;
};
template class L, class T1, class T2, class T3, class T4, class T5, class T6, class... T>
struct mp_take_c_impl<6, L>
{
using type = L;
};
template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class... T>
struct mp_take_c_impl<7, L>
{
using type = L;
};
template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class... T>
struct mp_take_c_impl<8, L>
{
using type = L;
};
template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class... T>
struct mp_take_c_impl<9, L>
{
using type = L;
};
template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class... T, std::size_t N>
struct mp_take_c_impl, typename std::enable_if= 10>::type>
{
using type = mp_append, typename mp_take_c_impl>::type>;
};
} // namespace detail
template using mp_take_c = typename detail::mp_take_c_impl::type;
template using mp_take = typename detail::mp_take_c_impl::type;
// mp_back
template using mp_back = mp_at_c::value - 1>;
// mp_pop_back
template using mp_pop_back = mp_take_c::value - 1>;
// mp_replace
namespace detail
{
template struct mp_replace_impl;
template class L, class... T, class V, class W> struct mp_replace_impl, V, W>
{
#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 )
template struct _f { using type = mp_if, W, A>; };
using type = L::type...>;
#else
template using _f = mp_if, W, A>;
using type = L<_f...>;
#endif
};
} // namespace detail
template using mp_replace = typename detail::mp_replace_impl::type;
// mp_replace_if