#include <iostream>
#include <utility>
#include <array>
#include <cstddef>
template <std::size_t... I>
struct index_sequence {};
template<class S1, class S2> struct concat;
template<std::size_t... I1, std::size_t... I2>
struct concat<index_sequence<I1...>, index_sequence<I2...>> {
using Type = index_sequence<I1..., (sizeof...(I1)+I2)...>;
};
template<std::size_t N>
struct gen_seq {
using Type = typename concat<typename gen_seq<N/2>::Type, typename gen_seq<N - N/2>::Type>::Type;
};
template<> struct gen_seq<0> { using Type = index_sequence<>; };
template<> struct gen_seq<1> { using Type = index_sequence<0>; };
template <std::size_t N>
using make_index_sequence = typename gen_seq<N>::Type;
template <typename F, std::size_t... I>
constexpr auto generate (F&& f, index_sequence<I...>) -> std::array<decltype(std::forward<F> (f) (0)), sizeof...(I)> {
return {{ std::forward<F> (f) (I) ... }};
}
template <std::size_t S, typename F>
constexpr auto generate (F&& f) -> std::array<decltype(std::forward<F> (f) (0)), S> {
return generate (std::forward<F> (f), make_index_sequence<S> {});
}
constexpr int myLutCalc (std::size_t index) {
return index * 2;
}
constexpr auto myLUT = generate<10> (myLutCalc);
int main() {
for (auto& x : myLUT) {
std::cout << x << ", ";
}
std::cout << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8Y3N0ZGRlZj4KCnRlbXBsYXRlIDxzdGQ6OnNpemVfdC4uLiBJPgpzdHJ1Y3QgaW5kZXhfc2VxdWVuY2Uge307Cgp0ZW1wbGF0ZTxjbGFzcyBTMSwgY2xhc3MgUzI+IHN0cnVjdCBjb25jYXQ7Cgp0ZW1wbGF0ZTxzdGQ6OnNpemVfdC4uLiBJMSwgc3RkOjpzaXplX3QuLi4gSTI+CnN0cnVjdCBjb25jYXQ8aW5kZXhfc2VxdWVuY2U8STEuLi4+LCBpbmRleF9zZXF1ZW5jZTxJMi4uLj4+IHsKCXVzaW5nIFR5cGUgPSBpbmRleF9zZXF1ZW5jZTxJMS4uLiwgKHNpemVvZi4uLihJMSkrSTIpLi4uPjsKfTsKCnRlbXBsYXRlPHN0ZDo6c2l6ZV90IE4+CnN0cnVjdCBnZW5fc2VxIHsKCXVzaW5nIFR5cGUgPSB0eXBlbmFtZSBjb25jYXQ8dHlwZW5hbWUgZ2VuX3NlcTxOLzI+OjpUeXBlLCB0eXBlbmFtZSBnZW5fc2VxPE4gLSBOLzI+OjpUeXBlPjo6VHlwZTsKfTsKCnRlbXBsYXRlPD4gc3RydWN0IGdlbl9zZXE8MD4geyB1c2luZyBUeXBlID0gaW5kZXhfc2VxdWVuY2U8PjsgfTsKdGVtcGxhdGU8PiBzdHJ1Y3QgZ2VuX3NlcTwxPiB7IHVzaW5nIFR5cGUgPSBpbmRleF9zZXF1ZW5jZTwwPjsgfTsKCnRlbXBsYXRlIDxzdGQ6OnNpemVfdCBOPgp1c2luZyBtYWtlX2luZGV4X3NlcXVlbmNlID0gdHlwZW5hbWUgZ2VuX3NlcTxOPjo6VHlwZTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBGLCBzdGQ6OnNpemVfdC4uLiBJPgpjb25zdGV4cHIgYXV0byBnZW5lcmF0ZSAoRiYmIGYsIGluZGV4X3NlcXVlbmNlPEkuLi4+KSAtPiBzdGQ6OmFycmF5PGRlY2x0eXBlKHN0ZDo6Zm9yd2FyZDxGPiAoZikgKDApKSwgc2l6ZW9mLi4uKEkpPiB7CglyZXR1cm4ge3sgc3RkOjpmb3J3YXJkPEY+IChmKSAoSSkgLi4uIH19Owp9Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgUywgdHlwZW5hbWUgRj4KY29uc3RleHByIGF1dG8gZ2VuZXJhdGUgKEYmJiBmKSAtPiBzdGQ6OmFycmF5PGRlY2x0eXBlKHN0ZDo6Zm9yd2FyZDxGPiAoZikgKDApKSwgUz4gewoJcmV0dXJuIGdlbmVyYXRlIChzdGQ6OmZvcndhcmQ8Rj4gKGYpLCBtYWtlX2luZGV4X3NlcXVlbmNlPFM+IHt9KTsKfQoKY29uc3RleHByIGludCBteUx1dENhbGMgKHN0ZDo6c2l6ZV90IGluZGV4KSB7CglyZXR1cm4gaW5kZXggKiAyOwp9Cgpjb25zdGV4cHIgYXV0byBteUxVVCA9IGdlbmVyYXRlPDEwPiAobXlMdXRDYWxjKTsKCmludCBtYWluKCkgewoJZm9yIChhdXRvJiB4IDogbXlMVVQpIHsKCQlzdGQ6OmNvdXQgPDwgeCA8PCAiLCAiOwoJfQoJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCXJldHVybiAwOwp9
0, 2, 4, 6, 8, 10, 12, 14, 16, 18,