1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| template <class ListA, class ListB, class... Tail> struct ConcatT {};
template <class T, T... ValuesA, T... ValuesB, class... Tail> struct ConcatT<ValueList<T, ValuesA...>, ValueList<T, ValuesB...>, Tail...> : ConcatT<ValueList<T, ValuesA..., ValuesB...>, Tail...> {};
template <class T, T... ValuesA, T... ValuesB> struct ConcatT<ValueList<T, ValuesA...>, ValueList<T, ValuesB...>> { using Type = ValueList<T, ValuesA..., ValuesB...>; };
template <class ListA, class ListB, class... Tail> using Concat = typename ConcatT<ListA, ListB, Tail...>::Type;
template <class List, template <class T> class PredicateT, bool = IsEmpty<List>::value> struct FilterT {};
template <class List, template <class T> class PredicateT, bool = IsEmpty<List>::value> using Filter = typename FilterT<List, PredicateT>::Type;
template <class List, template <class T> class PredicateT> struct FilterT<List, PredicateT, false> { using NewTail = Filter<PopFront<List>, PredicateT>; using NewHead = Front<List>; using Type = IfThenElse<PredicateT<NewHead>::value, PushFront<NewTail, NewHead>, NewTail>; };
template <class List, template <class T> class PredicateT> struct FilterT<List, PredicateT, true> { using Type = List; };
|