#include <initializer_list>
#include <iostream>
#include <cstdint>
#if 1 // index_sequence and make_index_sequence
// in C++14, but not in C++11
template <std::size_t...> struct index_sequence {};
namespace detail
{
template <typename, typename> struct concat;
template <std::size_t... Is1, std::size_t... Is2>
struct concat<index_sequence<Is1...>, index_sequence<Is2...>> :
index_sequence<Is1..., (sizeof...(Is1) + Is2)...>
{
using type = index_sequence<Is1..., (sizeof...(Is1) + Is2)...>;
};
}
template <std::size_t N>
struct make_index_sequence :
detail::concat<typename make_index_sequence<N / 2>::type,
typename make_index_sequence<N - N / 2>::type>::type
{
using type = typename
detail::concat<typename make_index_sequence<N / 2>::type,
typename make_index_sequence<N - N / 2>::type>::type;
};
template <>
struct make_index_sequence<1u> : index_sequence<0u> {
using type = index_sequence<0u>;
};
template <>
struct make_index_sequence<0u> : index_sequence<> {
using type = index_sequence<0u>;
};
#endif
template<int N>
struct NumberGeneration{
static void out(std::ostream& os)
{
out(make_index_sequence<N>(), os);
}
private:
template<std::size_t ...Is>
static void out(index_sequence<Is...>, std::ostream& os)
{
std::initializer_list<int>{ ((os << (1 + Is) << std::endl), void(), 0)...};
}
};
int main(int argc, char**argv)
{
NumberGeneration<1000>::out(std::cout);
return 0;
}
I2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNzdGRpbnQ+CgojaWYgMSAvLyBpbmRleF9zZXF1ZW5jZSBhbmQgbWFrZV9pbmRleF9zZXF1ZW5jZQovLyBpbiBDKysxNCwgYnV0IG5vdCBpbiBDKysxMQp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QuLi4+IHN0cnVjdCBpbmRleF9zZXF1ZW5jZSB7fTsKCm5hbWVzcGFjZSBkZXRhaWwKewp0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lPiBzdHJ1Y3QgY29uY2F0OwoKdGVtcGxhdGUgPHN0ZDo6c2l6ZV90Li4uIElzMSwgc3RkOjpzaXplX3QuLi4gSXMyPgpzdHJ1Y3QgY29uY2F0PGluZGV4X3NlcXVlbmNlPElzMS4uLj4sIGluZGV4X3NlcXVlbmNlPElzMi4uLj4+IDoKICAgIGluZGV4X3NlcXVlbmNlPElzMS4uLiwgKHNpemVvZi4uLihJczEpICsgSXMyKS4uLj4KewogICAgdXNpbmcgdHlwZSA9IGluZGV4X3NlcXVlbmNlPElzMS4uLiwgKHNpemVvZi4uLihJczEpICsgSXMyKS4uLj47Cn07Cgp9Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTj4Kc3RydWN0IG1ha2VfaW5kZXhfc2VxdWVuY2UgOgogICAgZGV0YWlsOjpjb25jYXQ8dHlwZW5hbWUgbWFrZV9pbmRleF9zZXF1ZW5jZTxOIC8gMj46OnR5cGUsCiAgICB0eXBlbmFtZSBtYWtlX2luZGV4X3NlcXVlbmNlPE4gLSBOIC8gMj46OnR5cGU+Ojp0eXBlCnsKICAgIHVzaW5nIHR5cGUgPSB0eXBlbmFtZQogICAgICAgIGRldGFpbDo6Y29uY2F0PHR5cGVuYW1lIG1ha2VfaW5kZXhfc2VxdWVuY2U8TiAvIDI+Ojp0eXBlLAogICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIG1ha2VfaW5kZXhfc2VxdWVuY2U8TiAtIE4gLyAyPjo6dHlwZT46OnR5cGU7Cn07Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgbWFrZV9pbmRleF9zZXF1ZW5jZTwxdT4gOiBpbmRleF9zZXF1ZW5jZTwwdT4gewogICAgdXNpbmcgdHlwZSA9IGluZGV4X3NlcXVlbmNlPDB1PjsKfTsKCnRlbXBsYXRlIDw+CnN0cnVjdCBtYWtlX2luZGV4X3NlcXVlbmNlPDB1PiA6IGluZGV4X3NlcXVlbmNlPD4gewogICAgdXNpbmcgdHlwZSA9IGluZGV4X3NlcXVlbmNlPDB1PjsKfTsKCiNlbmRpZgoKdGVtcGxhdGU8aW50IE4+CnN0cnVjdCBOdW1iZXJHZW5lcmF0aW9uewogIHN0YXRpYyB2b2lkIG91dChzdGQ6Om9zdHJlYW0mIG9zKQogIHsKICAgIG91dChtYWtlX2luZGV4X3NlcXVlbmNlPE4+KCksIG9zKTsKICB9CnByaXZhdGU6CiAgICB0ZW1wbGF0ZTxzdGQ6OnNpemVfdCAuLi5Jcz4KICAgIHN0YXRpYyB2b2lkIG91dChpbmRleF9zZXF1ZW5jZTxJcy4uLj4sIHN0ZDo6b3N0cmVhbSYgb3MpCiAgICB7CiAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PGludD57ICgob3MgPDwgKDEgKyBJcykgPDwgc3RkOjplbmRsKSwgdm9pZCgpLCAwKS4uLn07CiAgICB9Cgp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKmFyZ3YpCnsKICAgTnVtYmVyR2VuZXJhdGlvbjwxMDAwPjo6b3V0KHN0ZDo6Y291dCk7CglyZXR1cm4gMDsKfQo=