forked from boostorg/mp11
Reformulate mp_sliding_fold to pass msvc-14.0
This commit is contained in:
@@ -1265,21 +1265,30 @@ template<class L, template<class...> class F> using mp_pairwise_fold = mp_pairwi
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class L, std::size_t I, std::size_t J> using mp_slice_c = mp_drop_c< mp_take_c<L, J>, I >;
|
||||
template<class L, class I, class J> using mp_slice = mp_drop< mp_take<L, J>, I >;
|
||||
|
||||
template<class C, class L, class Q, class S> struct mp_sliding_fold_impl;
|
||||
|
||||
template<class L, class Q, std::size_t... Ints> struct mp_sliding_fold_impl<mp_true, L, Q, index_sequence<Ints...>>
|
||||
template<class L, class N, class Q> struct mp_sliding_fold_impl<mp_true, L, N, Q>
|
||||
{
|
||||
using type = mp_transform_q<Q, mp_drop_c<mp_take_c<L, mp_size<L>::value - (sizeof...(Ints) - Ints - 1)>, Ints>...>;
|
||||
static const std::size_t M = mp_size<L>::value - N::value + 1;
|
||||
|
||||
template<class I> using F = mp_slice_c<L, I::value, I::value + M>;
|
||||
|
||||
using J = mp_transform<F, mp_iota<N>>;
|
||||
|
||||
using type = mp_apply<mp_transform_q, mp_push_front<J, Q>>;
|
||||
};
|
||||
|
||||
template<class L, class Q, class S> struct mp_sliding_fold_impl<mp_false, L, Q, S>
|
||||
template<class L, class N, class Q> struct mp_sliding_fold_impl<mp_false, L, N, Q>
|
||||
{
|
||||
using type = mp_clear<L>;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template<class L, class N, class Q> using mp_sliding_fold_q = typename detail::mp_sliding_fold_impl<mp_bool<mp_size<L>::value >= N::value>, L, Q, make_index_sequence<size_t{ N::value }>>::type;
|
||||
template<class L, class N, class Q> using mp_sliding_fold_q = typename detail::mp_sliding_fold_impl<mp_bool<(mp_size<L>::value >= N::value)>, L, N, Q>::type;
|
||||
template<class L, class N, template<class...> class F> using mp_sliding_fold = mp_sliding_fold_q<L, N, mp_quote<F>>;
|
||||
|
||||
// mp_intersperse<L, S>
|
||||
|
Reference in New Issue
Block a user