fork download
  1. #if __cplusplus < 201103L
  2. # error "C++ version too old"
  3. #endif
  4.  
  5. #ifdef __AVR
  6. namespace std {
  7. using size_t = unsigned int;
  8. template <typename T, size_t N>
  9. class array {
  10. public:
  11. T data [N];
  12. static constexpr size_t size () { return N; }
  13. constexpr const T& operator [] (size_t I) const { return data [I]; }
  14. T& operator [] (size_t I) { return data [I]; }
  15. };
  16. }
  17. #else
  18. #include <utility>
  19. #include <array>
  20. #include <cstddef>
  21. #endif
  22.  
  23. #if (__cplusplus < 201402L) || defined(__AVR)
  24. template <std::size_t... I>
  25. struct index_sequence {};
  26.  
  27. template<class S1, class S2> struct concat;
  28.  
  29. template<std::size_t... I1, std::size_t... I2>
  30. struct concat<index_sequence<I1...>, index_sequence<I2...>> {
  31. using Type = index_sequence<I1..., (sizeof...(I1)+I2)...>;
  32. };
  33.  
  34. template<std::size_t N>
  35. struct gen_seq {
  36. using Type = typename concat<typename gen_seq<N/2>::Type, typename gen_seq<N - N/2>::Type>::Type;
  37. };
  38.  
  39. template<> struct gen_seq<0> { using Type = index_sequence<>; };
  40. template<> struct gen_seq<1> { using Type = index_sequence<0>; };
  41.  
  42. template <std::size_t N>
  43. using make_index_sequence = typename gen_seq<N>::Type;
  44. #else
  45. using std::make_index_sequence;
  46. using std::index_sequence;
  47. #endif
  48.  
  49.  
  50. template <typename F, std::size_t... I>
  51. constexpr auto generate (F&& f, index_sequence<I...>) -> std::array<decltype(static_cast<F&&> (f) (0)), sizeof...(I)> {
  52. return {{ static_cast<F&&> (f) (I) ... }};
  53. }
  54.  
  55. template <std::size_t S, typename F>
  56. constexpr auto generate (F&& f) -> std::array<decltype(static_cast<F&&> (f) (0)), S> {
  57. return generate (static_cast<F&&> (f), make_index_sequence<S> {});
  58. }
  59.  
  60. constexpr int myLutCalc (std::size_t index) {
  61. return index * 2;
  62. }
  63.  
  64. constexpr auto myLUT = generate<10> (myLutCalc);
  65.  
  66. int main() {
  67. for (std::size_t i = 0; i < myLUT.size (); ++i) {
  68. volatile int x = myLUT [i];
  69. }
  70. return 0;
  71. }
Success #stdin #stdout 0s 15232KB
stdin
Standard input is empty
stdout
Standard output is empty