1
0
forked from boostorg/mp11

Reformulate mp_sliding_fold to pass msvc-14.0

This commit is contained in:
Peter Dimov
2023-11-27 01:46:58 +02:00
parent 629cebd5f8
commit 0715df5ca8

View File

@@ -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>