fork download
  1. #include <iostream>
  2. #include <type_traits>
  3.  
  4. template <int I> using int_ = std::integral_constant<int, I>;
  5.  
  6. template<typename T> using eval = typename T::type;
  7.  
  8. template<typename... List>
  9. struct seq
  10. {
  11. using type = seq;
  12. };
  13.  
  14. template<typename> struct car;
  15. template<typename Car, typename... Cdr>
  16. struct car< seq<Car, Cdr...>>
  17. {
  18. typedef Car type;
  19. };
  20.  
  21. template<typename> struct cdr;
  22. template<typename Car, typename... Cdr>
  23. struct cdr< seq<Car, Cdr...>>
  24. {
  25. typedef seq<Cdr...> type;
  26. };
  27.  
  28.  
  29. template <typename, typename> struct cons;
  30. template <typename T, typename... L>
  31. struct cons<T, seq<L...>>
  32. {
  33. typedef seq<T, L...> type;
  34. };
  35.  
  36. //template <typename T>
  37. //struct cons<T, seq<>>
  38. //{
  39. // typedef seq<T> type;
  40. //};
  41.  
  42. template<typename, typename> struct concat;
  43. template <typename... As, typename... Bs>
  44. struct concat<seq<As...>, seq<Bs...>>
  45. {
  46. typedef seq<As..., Bs...> type;
  47. };
  48.  
  49. template<typename> struct length;
  50. template<typename... As>
  51. struct length<seq<As...>>
  52. {
  53. typedef std::integral_constant<unsigned, sizeof...(As)> type;
  54. };
  55.  
  56. template<typename>
  57. struct is_empty
  58. {
  59. typedef std::integral_constant<bool, false> type;
  60. };
  61.  
  62. template<>
  63. struct is_empty<seq<>>
  64. {
  65. typedef std::integral_constant<bool, true> type;
  66. };
  67.  
  68. template<template<typename... Args> class Fun, typename... Args>
  69. struct apply
  70. {
  71. typedef eval<Fun<Args...>> type;
  72. };
  73.  
  74.  
  75. template<typename B, typename C, typename A> struct cond;
  76. template<typename C, typename A>
  77. struct cond<std::true_type, C, A>
  78. {
  79. typedef C type;
  80. };
  81.  
  82. template<typename C, typename A>
  83. struct cond<std::false_type, C, A>
  84. {
  85. typedef A type;
  86. };
  87.  
  88.  
  89. //template<typename, typename> struct map;
  90.  
  91. //template<typename A, typename... As, template<typename A> class F>
  92. //struct map<seq<A, As...>, F>
  93. //{
  94. // //typedef seq<eval<F<A>>...> type;
  95. // typedef cons < eval < F < A > >
  96. // , map < seq < As... > , F >
  97. // > type;
  98. //};
  99.  
  100. template <typename S, template<typename B> class F> struct map_t;
  101.  
  102. //template <template <typename B> class F, typename... Es>
  103. template <typename... Es, template <typename B> class F>
  104. struct map_t <seq<Es...>, F >
  105. {
  106. typedef typename car<seq<Es...>>::type Car;
  107. typedef typename cdr<seq<Es...>>::type Cdr;
  108. typedef eval< cons < eval < F < Car > >
  109. , eval< map_t < Cdr, F > >
  110. > > type;
  111. };
  112.  
  113. template <template <typename B> class F>
  114. struct map_t <seq<>, F >
  115. {
  116. typedef seq<> type;
  117. };
  118.  
  119. template <typename S, template<typename B> class F> struct filter_t;
  120.  
  121. //template <template <typename B> class F, typename... Es>
  122. template <typename... Es, template <typename B> class F>
  123. struct filter_t <seq<Es...>, F >
  124. {
  125. typedef typename car<seq<Es...>>::type Car;
  126. typedef typename cdr<seq<Es...>>::type Cdr;
  127. typedef eval< cond < eval < F < Car > >
  128. , eval < cons < Car, eval< filter_t < Cdr, F > > > >
  129. , eval < filter_t < Cdr, F > >
  130. > > type;
  131. };
  132.  
  133. template <template <typename B> class F>
  134. struct filter_t <seq<>, F >
  135. {
  136. typedef seq<> type;
  137. };
  138.  
  139. template<typename A> struct even;
  140.  
  141. template<int I>
  142. struct even<std::integral_constant<int, I> >
  143. {
  144. typedef std::integral_constant<bool, I % 2 == 0> type;
  145. };
  146.  
  147.  
  148. //template<typename> struct constant;
  149. //template<typename T>
  150. //struct constant<T>
  151. //{
  152. // typedef std::integral_constant<bool, false> type;
  153. //};
  154.  
  155.  
  156. typedef seq<int_<1>, int_<2>, int_<3> > s1;
  157. typedef seq<int_<7>, int_<5>, int_<9> > s2;
  158. typedef seq<int_<1>, s2, int_<17>, s1 > s3;
  159. typedef seq<> empty;
  160. typedef seq<int_<1>> s0;
  161.  
  162. template<typename Seq> using concat_fix = apply<concat, s2, Seq>;
  163.  
  164.  
  165. int main()
  166. {
  167.  
  168. std::cerr << eval < length < eval < apply < concat, s1, s3 >> >> ::value << '\n';
  169. std::cerr << eval < length < eval < concat_fix < s3 >> >> ::value << '\n';
  170. std::cerr << eval < apply < length, empty> >::value << '\n';
  171. std::cerr << eval < length < eval < concat < s1, s3 >> >> ::value << '\n';
  172. std::cerr << "even(2): " << eval < even < int_<2>> >::value << '\n';
  173. std::cerr << "even(3): " << eval < even < int_<3>> >::value << '\n';
  174.  
  175. std::cerr << "is_same: " << std::is_same < eval < int_ < 2 >> , int_ < 2 >> ::value << '\n';
  176.  
  177. typedef seq<int_<1>, int_<2>, int_<3>, int_<4>, int_<5>, int_<6>, int_<7>, int_<8>, int_<9>, int_<10>, int_<11>> sint;
  178. std::cerr << eval < length < eval < map_t < sint, even > > > >::value << '\n';
  179. std::cerr << eval < length < eval < filter_t < sint, even > > > >::value << '\n';
  180. typedef eval<filter_t<sint, even>> test;
  181.  
  182. std::cerr << "first in even list: " << eval<car<test>>::value << '\n';
  183. std::cerr << "second in even list: " << eval<car<eval<cdr<test>>>>::value << '\n';
  184. std::cerr << "third in even list: " << eval<car<eval<cdr<eval<cdr<test>>>>>>::value << '\n';
  185. return 0;
  186. }
Success #stdin #stdout #stderr 0s 3336KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
7
7
0
7
even(2): 1
even(3): 0
is_same: 1
11
5
first in even list: 2
second in even list: 4
third in even list: 6