Вижда се, Git има няколко функции, които обикновените клавиатури не предлагат, но има и някои особености при натискане на Return key-a. Пръстите на Линус изглежда са тънки.
July 2012
Compile Sort
Не че ме бива във функционалното или С++ мета програмиране много, ама спретнах най-накрая и аз един compile time sort. Не претендирам, че е оптимален (нито generic), но май е лесен за четене и разбиране.
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
#include <iostream> //all results are saved in ::Value (for type) and ::value (for value) //gives the smallest in ts... template<int n, int... ts> struct Min { static const int value = n < Min<ts...>::value ? n : Min<ts...>::value; }; template <int n> struct Min<n> { static const int value = n; }; //holder structure template<int... vs> struct StaticArray {}; //concatenates v... and u... into an StaticArray template<typename T1, typename T2> struct Concat{}; template<int...v, int...u> struct Concat<StaticArray<v...>, StaticArray<u...>> { typedef StaticArray<v..., u...> Value; }; //gives the index of "v" in args... template<int v, int a, int... args> struct IndexOf { static const int value = v == a ? 0 : 1 + IndexOf<v, args...>::value; }; template <int v, int a> struct IndexOf<v, a> { static const int value = v == a ? 0 : -1; }; //remove element with index "n" from args... template<int n, int a, int... args> struct RemoveNth { typedef StaticArray<a> headValue; typedef typename RemoveNth< (n - 1), args...>::Value Tail; typedef typename Concat<headValue, Tail>::Value Value; }; template<int a> struct RemoveNth<0, a> { typedef StaticArray<> headValue; typedef StaticArray<> Value; }; template<int a, int... args> struct RemoveNth<0, a, args...> { typedef StaticArray<args...> headValue; typedef StaticArray<args...> Value; }; //sorts args... template<typename T1> struct Sort{}; template<int... args> struct Sort <StaticArray<args...>> { //get he min value typedef Min<args...> min; //and its index typedef IndexOf<min::value, args...> index; //remove the min from the list typedef typename RemoveNth<index::value, args...>::Value Filtered; //call recursively for the others typedef typename Sort<Filtered>::Value TailSorted; //concat min with the others typedef typename Concat<StaticArray<min::value>, TailSorted>::Value Value; }; template<int n> struct Sort<StaticArray<n>> { typedef Min<n> min; typedef StaticArray<n> Value; }; template<> struct Sort<StaticArray<>> { typedef StaticArray<> Value; }; void printStaticArray(StaticArray<>){ } template<int v1, int...vs> void printStaticArray(StaticArray<v1, vs...> m) { std::cout << v1<< " "; printStaticArray(StaticArray<vs...>()); } int main (int argc, const char * argv[]) { printStaticArray(Sort<StaticArray<196, -1, 0, 309, -42, 411>>::Value()); return 0; } |
Беше по-трудно, от колкото изглежда 😀
Предстоят тестове, колко време отнема и кога започва да се чупи.