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 36 37 38 39 40 41 42 43 44 45 46
| template <class ValueList, class Element, template <class T, class U> class Compare, bool = IsEmpty<ValueList>::value> struct InsertSortedT;
template <class ValueList, class Element, template <class T, class U> class Compare> using InsertSorted = typename InsertSortedT<ValueList, Element, Compare>::Type;
template <class ValueList, class Element, template <class T, class U> class Compare> struct InsertSortedT<ValueList, Element, Compare, false> { using NewTail = IfThenElse< Compare<Element, Front<ValueList>>::value, Identity<ValueList>, InsertSorted<PopFront<ValueList>, Element, Compare>>; using NewHead = IfThenElse<Compare<Element, Front<ValueList>>::value, Element, Front<ValueList>>;
using Type = PushFront<NewTail, NewHead>; };
template <class ValueList, class Element, template <class T, class U> class Compare> struct InsertSortedT<ValueList, Element, Compare, true> : PushFrontT<ValueList, Element> { };
template <class ValueList, template <class T, class U> class Compare, bool = IsEmpty<ValueList>::value> struct InsertionSortT;
template <class ValueList, template <class T, class U> class Compare> struct InsertionSortT<ValueList, Compare, false> : InsertSortedT<InsertionSort<PopFront<ValueList>, Compare>, Front<ValueList>, Compare> {};
template <class ValueList, template <class T, class U> class Compare> struct InsertionSortT<ValueList, Compare, true> { using Type = ValueList; };
template <typename List, typename Element, template <typename T, typename U> class Compare> using InsertSorted = typename InsertSortedT<List, Element, Compare>::Type;
template <class ValueList, template <class T, class U> class Compare> using InsertionSort = typename InsertionSortT<ValueList, Compare>::Type;
|