fork(1) download
  1. #include <iostream>
  2. #include <utility>
  3. #include <array>
  4. #include <cstddef>
  5.  
  6. template <std::size_t... I>
  7. struct index_sequence {};
  8.  
  9. template<class S1, class S2> struct concat;
  10.  
  11. template<std::size_t... I1, std::size_t... I2>
  12. struct concat<index_sequence<I1...>, index_sequence<I2...>> {
  13. using Type = index_sequence<I1..., (sizeof...(I1)+I2)...>;
  14. };
  15.  
  16. template<std::size_t N>
  17. struct gen_seq {
  18. using Type = typename concat<typename gen_seq<N/2>::Type, typename gen_seq<N - N/2>::Type>::Type;
  19. };
  20.  
  21. template<> struct gen_seq<0> { using Type = index_sequence<>; };
  22. template<> struct gen_seq<1> { using Type = index_sequence<0>; };
  23.  
  24. template <std::size_t N>
  25. using make_index_sequence = typename gen_seq<N>::Type;
  26.  
  27. template <typename F, std::size_t... I>
  28. constexpr auto generate (F&& f, index_sequence<I...>) -> std::array<decltype(std::forward<F> (f) (0)), sizeof...(I)> {
  29. return {{ std::forward<F> (f) (I) ... }};
  30. }
  31.  
  32. template <std::size_t S, typename F>
  33. constexpr auto generate (F&& f) -> std::array<decltype(std::forward<F> (f) (0)), S> {
  34. return generate (std::forward<F> (f), make_index_sequence<S> {});
  35. }
  36.  
  37. constexpr int myLutCalc (std::size_t index) {
  38. return index * 2;
  39. }
  40.  
  41. constexpr auto myLUT = generate<10> (myLutCalc);
  42.  
  43. int main() {
  44. for (auto& x : myLUT) {
  45. std::cout << x << ", ";
  46. }
  47. std::cout << std::endl;
  48. return 0;
  49. }
Success #stdin #stdout 0s 15232KB
stdin
Standard input is empty
stdout
0, 2, 4, 6, 8, 10, 12, 14, 16, 18,