Advertisement
Dukales

enumerate multidimensional grid points at compile time

Jun 20th, 2015
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include <type_traits>
  2. #include <utility>
  3.  
  4. template< typename validator, std::size_t ...indices >
  5. struct enumerator;
  6.  
  7. template< typename validator >
  8. struct enumerator< validator >
  9. {
  10.    
  11.     constexpr
  12.     enumerator(validator && _validator)
  13.         : validator_(std::forward< validator >(_validator))
  14.     { ; }
  15.  
  16.     template< std::size_t ...I >
  17.     constexpr
  18.     bool
  19.     operator () () const
  20.     {
  21.         return validator_(std::index_sequence< I... >{});
  22.     }
  23.    
  24. private :
  25.  
  26.     validator validator_;
  27.    
  28. };
  29.  
  30. template< typename validator, std::size_t first, std::size_t ...rest >
  31. struct enumerator< validator, first, rest... >
  32.     : enumerator< validator, rest... >
  33. {
  34.    
  35.     constexpr
  36.     enumerator(validator && _validator)
  37.         : enumerator< validator, rest... >(std::forward< validator >(_validator))
  38.     { ; }
  39.    
  40.     template< std::size_t ...I >
  41.     constexpr
  42.     bool
  43.     operator () () const
  44.     {
  45.         return enumerator::template operator () < I... >(std::make_index_sequence< first >{}); // ltr
  46.     }
  47.    
  48.     template< std::size_t ...I, std::size_t ...J >
  49.     constexpr
  50.     bool
  51.     operator () (std::index_sequence< J... >) const
  52.     {
  53.         return (enumerator< validator, rest... >::template operator () < I..., J >() && ...); // rtl, `< J, I... >` - ltr
  54.     }
  55.    
  56. };
  57.  
  58. template< std::size_t ...I, typename validator >
  59. constexpr
  60. enumerator< validator, I... >
  61. make_enumerator(validator && _validator)
  62. {
  63.     static_assert(0 < sizeof...(I));
  64.     static_assert(((0 < I) && ...));
  65.     return std::forward< validator >(_validator);
  66. }
  67.  
  68. // main.cpp
  69.  
  70. #include <iostream>
  71.  
  72. #include <cstdlib>
  73. #include <cassert>
  74.  
  75. struct truth
  76. {
  77.    
  78.     template< std::size_t ...I >
  79.     constexpr
  80.     bool
  81.     operator () (std::index_sequence< I... >) const
  82.     {
  83.         return true;
  84.     }
  85.    
  86. };
  87.  
  88. struct printer
  89. {
  90.    
  91.     template< std::size_t ...I >
  92.     bool
  93.     operator () (std::index_sequence< I... >) const
  94.     {
  95.         for (std::size_t const & i : {I...}) {
  96.             std::cout << i << ' ';
  97.         }
  98.         std::cout << std::endl;
  99.         return true;
  100.     }
  101.    
  102. };
  103.  
  104. int
  105. main()
  106. {  
  107.     static_assert(make_enumerator< 10, 10, 10, 10, 2 >(truth{})());
  108.     assert((make_enumerator< 10, 10 >(printer{})()));
  109.     return EXIT_SUCCESS;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement