fork download
  1. #include <iostream>
  2. #include <utility>
  3. #include <vector>
  4.  
  5. template<class E, E...es>
  6. struct elements:std::integral_constant<unsigned, sizeof...(es)> { using type=E; };
  7.  
  8. template<class E, E e0, E e1, E... es>
  9. constexpr E next_helper( elements<E, e0, e1, es...>, E e, E first ) {
  10. return (e0 == e)?e1:next_helper( elements<E, e1, es...>{}, e, first );
  11. }
  12. template<class E, E e0>
  13. constexpr E next_helper( elements<E, e0>, E e, E first ) {
  14. return first;
  15. }
  16. template<class E, E e0, E... es>
  17. constexpr E next_helper( elements<E, e0, es...>, E e ) {
  18. return next_helper( elements<E, e0, es...>{}, e, e0 );
  19. }
  20. template<class elements, class E>
  21. constexpr E next( E e ) {
  22. return next_helper( elements{}, e );
  23. }
  24. template<class elements, class E>
  25. constexpr E next( E e, unsigned N );
  26. template<class E, E...es>
  27. constexpr E next_helper( elements<E,es...>, E e, unsigned N ) {
  28. return (N>=sizeof...(es))?next<elements>( e, (N%sizeof...(es)) ):next<elements>( next<elements>( e, (N)/2 ), (N+1)/2 );
  29. }
  30. template<class elements, class E>
  31. constexpr E next( E e, unsigned N ) {
  32. return (N==0)?e:(N==1)?next<elements>(e):next_helper<elements>( next_helper<elements>( N/2, e ), (N+1)/2 );
  33. }
  34. template<class E, E e0, E e1, E... es>
  35. constexpr unsigned index_helper( elements<E, e0, e1, es...>, E e ) {
  36. return (e0==e)?0:(index_helper( elements<E, e1, es...>{}, e )+1);
  37. }
  38. template<class E, E e0>
  39. constexpr unsigned index_helper( elements<E, e0>, E e ) {
  40. return 0;
  41. }
  42. template<class elements, class E>
  43. constexpr unsigned index( E e ) {
  44. return index_helper( elements{}, e );
  45. }
  46. template<class E, E e0, E... es>
  47. constexpr unsigned first_helper(elements<E, e0, es...>) {
  48. return e0;
  49. }
  50. template<class elements>
  51. constexpr auto first() -> typename elements::type {
  52. return first_helper(elements{});
  53. }
  54. template<class elements>
  55. constexpr auto nth(unsigned n) -> typename elements::type {
  56. return next<elements>( first<elements>(), n );
  57. }
  58.  
  59. template<typename elements>
  60. struct iteration_tuple {
  61. using value_type = typename elements::type;
  62. std::vector<value_type> data;
  63. bool advance() {
  64. bool finished = true;
  65. for( value_type& e : data ) {
  66. if ( first<elements>() != ( e = next<elements>(e) ) )
  67. finished = false;
  68. if (!finished)
  69. break;
  70. }
  71. return finished;
  72. }
  73. iteration_tuple( unsigned size ) {
  74. data.resize( size, first<elements>() );
  75. }
  76. };
  77.  
  78. int main() {
  79. typedef elements<int, -1, 0, 1> sequence;
  80. iteration_tuple<sequence> sample(3);
  81. do {
  82. for (int x:sample.data)
  83. std::cout << x << ",";
  84. std::cout << "\n";
  85. } while(!sample.advance());
  86. }
  87.  
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
-1,-1,-1,
0,-1,-1,
1,-1,-1,
-1,0,-1,
0,0,-1,
1,0,-1,
-1,1,-1,
0,1,-1,
1,1,-1,
-1,-1,0,
0,-1,0,
1,-1,0,
-1,0,0,
0,0,0,
1,0,0,
-1,1,0,
0,1,0,
1,1,0,
-1,-1,1,
0,-1,1,
1,-1,1,
-1,0,1,
0,0,1,
1,0,1,
-1,1,1,
0,1,1,
1,1,1,