#ifndef TMP_PACKALGO_H #define TMP_PACKALGO_H #include "pack.h" #include "traits.h" namespace tmp { /** * Transform */ template class> struct TransformImpl; template class F> struct TransformImpl, F> { using type = PackPushFront, F>::type, F>; }; template class F> struct TransformImpl, F> { using type = Pack<>; }; template class F> using Transform = typename TransformImpl::type; /** * Accumulate */ template class, typename> struct AccumulateImpl; template class F, typename A> struct AccumulateImpl, F, A> { using type = typename AccumulateImpl, F, F>::type; }; template class F, typename A> struct AccumulateImpl, F, A> { using type = A; }; template class F, typename A> using Accumulate = typename AccumulateImpl::type; /** * Filter */ template class> struct FilterImpl; template class F> struct FilterImpl, F> { using next = typename FilterImpl, F>::type; using type = std::conditional_t::value, PackPushFront, next>; }; template class F> struct FilterImpl, F> { using type = Pack<>; }; template class F> using Filter = typename FilterImpl::type; /** * Cut */ template class> struct CutImpl; template class F> struct CutImpl, Pack, F> { using next = typename CutImpl, Pack, F>::type; using type = std::conditional_t::value, next, Pack, Pack>>; }; template class F> struct CutImpl, Pack<>, F> { using type = Pack, Pack<>>; }; template class F> struct CutImpl, Pack<>, F> { using type = Pack, Pack<>>; }; template class F> using Cut = typename CutImpl, P, F>::type; /** * Reverse */ template struct ReverseImpl; template struct ReverseImpl> { using type = PackPushBack>::type, T>; }; template<> struct ReverseImpl> { using type = Pack<>; }; template using Reverse = typename ReverseImpl::type; } #endif