#include <cstddef>
template<size_t n>
struct counterNumber {
char data[n+1];
};
template<size_t index, size_t val>
counterNumber<val> magic(counterNumber<index>, counterNumber<val>);
#define COUNTER_READ() \
(sizeof( \
magic(counterNumber<1>(), \
magic(counterNumber<2>(), \
magic(counterNumber<4>(), \
magic(counterNumber<8>(), \
magic(counterNumber<16>(), \
magic(counterNumber<32>(), \
magic(counterNumber<64>(), \
magic(counterNumber<128>(), counterNumber<0>())))))))))-1)
#define COUNTER_INC() \
counterNumber<COUNTER_READ()+1> magic( \
counterNumber<(COUNTER_READ()+1)&~COUNTER_READ()>, \
counterNumber<(COUNTER_READ()+1)&COUNTER_READ()>)
#include <iostream>
using namespace std;
#define TO_STRING(x) #x
#define REG_FUNCTIONAL(headFunction) \
template<> \
constexpr auto foo< COUNTER_READ() >() \
{ \
return TO_STRING(headFunction); \
} \
COUNTER_INC(); \
headFunction
template<size_t n>
constexpr auto foo(void){return "";}
REG_FUNCTIONAL(void function(int a)){(void)a;}
REG_FUNCTIONAL(void function1(int a)){(void)a;}
// your code goes here
template<size_t n>
std::string callFoo()
{
return std::string(foo<n>())+callFoo<n-1>();
}
template<>
std::string callFoo<0>()
{
return std::string(foo<0>());
}
int main() {
std::cout<<callFoo<COUNTER_READ()-1>();
return 0;
}
I2luY2x1ZGUgPGNzdGRkZWY+Cgp0ZW1wbGF0ZTxzaXplX3Qgbj4Kc3RydWN0IGNvdW50ZXJOdW1iZXIgewogICAgY2hhciBkYXRhW24rMV07Cn07Cgp0ZW1wbGF0ZTxzaXplX3QgaW5kZXgsIHNpemVfdCB2YWw+CmNvdW50ZXJOdW1iZXI8dmFsPiBtYWdpYyhjb3VudGVyTnVtYmVyPGluZGV4PiwgY291bnRlck51bWJlcjx2YWw+KTsKCiNkZWZpbmUgQ09VTlRFUl9SRUFEKCkgXAogICAgKHNpemVvZiggXAogICAgICAgIG1hZ2ljKGNvdW50ZXJOdW1iZXI8MT4oKSwgXAogICAgICAgIAltYWdpYyhjb3VudGVyTnVtYmVyPDI+KCksIFwKICAgICAgICAJCW1hZ2ljKGNvdW50ZXJOdW1iZXI8ND4oKSwgXAogICAgICAgIAkJCW1hZ2ljKGNvdW50ZXJOdW1iZXI8OD4oKSwgXAogICAgICAgIAkJCQltYWdpYyhjb3VudGVyTnVtYmVyPDE2PigpLCBcCiAgICAgICAgCQkJCQltYWdpYyhjb3VudGVyTnVtYmVyPDMyPigpLCBcCiAgICAgICAgCQkJCQkJbWFnaWMoY291bnRlck51bWJlcjw2ND4oKSwgXAogICAgICAgIAkJCQkJCQltYWdpYyhjb3VudGVyTnVtYmVyPDEyOD4oKSwgY291bnRlck51bWJlcjwwPigpKSkpKSkpKSkpLTEpCgojZGVmaW5lIENPVU5URVJfSU5DKCkgXAogICAgY291bnRlck51bWJlcjxDT1VOVEVSX1JFQUQoKSsxPiBtYWdpYyggXAogICAgICAgIGNvdW50ZXJOdW1iZXI8KENPVU5URVJfUkVBRCgpKzEpJn5DT1VOVEVSX1JFQUQoKT4sIFwKICAgICAgICBjb3VudGVyTnVtYmVyPChDT1VOVEVSX1JFQUQoKSsxKSZDT1VOVEVSX1JFQUQoKT4pCiAgICAgICAgCiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBUT19TVFJJTkcoeCkgI3gKCgojZGVmaW5lIFJFR19GVU5DVElPTkFMKGhlYWRGdW5jdGlvbikgXAogICAgdGVtcGxhdGU8PiBcCiAgICBjb25zdGV4cHIgYXV0byBmb288IENPVU5URVJfUkVBRCgpID4oKSBcCiAgICB7IFwKICAgICAgICByZXR1cm4gVE9fU1RSSU5HKGhlYWRGdW5jdGlvbik7IFwKICAgIH0gXAogICAgQ09VTlRFUl9JTkMoKTsgXAogICAgaGVhZEZ1bmN0aW9uCgp0ZW1wbGF0ZTxzaXplX3Qgbj4KY29uc3RleHByIGF1dG8gZm9vKHZvaWQpe3JldHVybiAiIjt9CgoKUkVHX0ZVTkNUSU9OQUwodm9pZCBmdW5jdGlvbihpbnQgYSkpeyh2b2lkKWE7fQpSRUdfRlVOQ1RJT05BTCh2b2lkIGZ1bmN0aW9uMShpbnQgYSkpeyh2b2lkKWE7fQoKCgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCnRlbXBsYXRlPHNpemVfdCBuPgpzdGQ6OnN0cmluZyBjYWxsRm9vKCkKewogICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGZvbzxuPigpKStjYWxsRm9vPG4tMT4oKTsKfQoKdGVtcGxhdGU8PgpzdGQ6OnN0cmluZyBjYWxsRm9vPDA+KCkKewogICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGZvbzwwPigpKTsKfQoKaW50IG1haW4oKSB7CglzdGQ6OmNvdXQ8PGNhbGxGb288Q09VTlRFUl9SRUFEKCktMT4oKTsKCXJldHVybiAwOwp9