#include <iostream>
using namespace std;
#define DEF_BASE(name) namespace { constexpr int name##localbase = __COUNTER__; }
#define GET_BASE(name) (name##localbase)
#define GET_OFFSET(name) GET_OFFSET_C(name,__COUNTER__)
#define GET_OFFSET_C(name,C) ((C)-GET_BASE(name))
#define BODY(V) { static constexpr int value = (V); }
#define START(name) \
DEF_BASE(name) \
template<int offset> struct name BODY(name<offset-1>::value); \
template<> struct name<0> BODY(0);
#define GET(name) (name<GET_OFFSET(name)>::value)
#define NEXT(name) NEXT_C(name, __COUNTER__) // нам понадобится одно значение дважды, поэтому опосредуем
#define NEXT_C(name, C) \
template<> struct name<GET_OFFSET_C(name,C)> BODY(name<GET_OFFSET_C(name,C)-1>::value + 1);
const int c0 = (__COUNTER__, __COUNTER__);
START(foo)
const int x = GET(foo);
const int c1 = (__COUNTER__, __COUNTER__);
const int y = GET(foo);
const int c2 = (__COUNTER__, __COUNTER__);
NEXT(foo)
const int z = GET(foo);
const int c3 = (__COUNTER__, __COUNTER__);
const int t = GET(foo);
int main() {
cout << c0 << endl;
cout << x << endl;
cout << c1 << endl;
cout << y << endl;
cout << c2 << endl;
cout << z << endl;
cout << c3 << endl;
cout << t << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIERFRl9CQVNFKG5hbWUpICAgICAgIG5hbWVzcGFjZSB7IGNvbnN0ZXhwciBpbnQgbmFtZSMjbG9jYWxiYXNlID0gX19DT1VOVEVSX187IH0KI2RlZmluZSBHRVRfQkFTRShuYW1lKSAgICAgICAobmFtZSMjbG9jYWxiYXNlKQojZGVmaW5lIEdFVF9PRkZTRVQobmFtZSkgICAgIEdFVF9PRkZTRVRfQyhuYW1lLF9fQ09VTlRFUl9fKQojZGVmaW5lIEdFVF9PRkZTRVRfQyhuYW1lLEMpICgoQyktR0VUX0JBU0UobmFtZSkpCgoKI2RlZmluZSBCT0RZKFYpIHsgc3RhdGljIGNvbnN0ZXhwciBpbnQgdmFsdWUgPSAoVik7IH0KCiNkZWZpbmUgU1RBUlQobmFtZSkgXAogIERFRl9CQVNFKG5hbWUpIFwKICB0ZW1wbGF0ZTxpbnQgb2Zmc2V0PiBzdHJ1Y3QgbmFtZSAgICAgICAgICAgICAgICAgICAgICBCT0RZKG5hbWU8b2Zmc2V0LTE+Ojp2YWx1ZSk7IFwKICB0ZW1wbGF0ZTw+ICAgICAgICAgICBzdHJ1Y3QgbmFtZTwwPiAgICAgICAgICAgICAgICAgICBCT0RZKDApOwoKI2RlZmluZSBHRVQobmFtZSkgKG5hbWU8R0VUX09GRlNFVChuYW1lKT46OnZhbHVlKQoKI2RlZmluZSBORVhUKG5hbWUpIE5FWFRfQyhuYW1lLCBfX0NPVU5URVJfXykgIC8vINC90LDQvCDQv9C+0L3QsNC00L7QsdC40YLRgdGPINC+0LTQvdC+INC30L3QsNGH0LXQvdC40LUg0LTQstCw0LbQtNGLLCDQv9C+0Y3RgtC+0LzRgyDQvtC/0L7RgdGA0LXQtNGD0LXQvAojZGVmaW5lIE5FWFRfQyhuYW1lLCBDKSBcCiAgdGVtcGxhdGU8PiAgICAgICAgICAgc3RydWN0IG5hbWU8R0VUX09GRlNFVF9DKG5hbWUsQyk+ICBCT0RZKG5hbWU8R0VUX09GRlNFVF9DKG5hbWUsQyktMT46OnZhbHVlICsgMSk7Cgpjb25zdCBpbnQgYzAgPSAoX19DT1VOVEVSX18sIF9fQ09VTlRFUl9fKTsKU1RBUlQoZm9vKQpjb25zdCBpbnQgeCA9IEdFVChmb28pOwpjb25zdCBpbnQgYzEgPSAoX19DT1VOVEVSX18sIF9fQ09VTlRFUl9fKTsKY29uc3QgaW50IHkgPSBHRVQoZm9vKTsKY29uc3QgaW50IGMyID0gKF9fQ09VTlRFUl9fLCBfX0NPVU5URVJfXyk7Ck5FWFQoZm9vKQpjb25zdCBpbnQgeiA9IEdFVChmb28pOwpjb25zdCBpbnQgYzMgPSAoX19DT1VOVEVSX18sIF9fQ09VTlRFUl9fKTsKY29uc3QgaW50IHQgPSBHRVQoZm9vKTsKCmludCBtYWluKCkgewoJY291dCA8PCBjMCA8PCBlbmRsOwoJY291dCA8PCB4IDw8IGVuZGw7Cgljb3V0IDw8IGMxIDw8IGVuZGw7Cgljb3V0IDw8IHkgPDwgZW5kbDsKCWNvdXQgPDwgYzIgPDwgZW5kbDsKCWNvdXQgPDwgeiA8PCBlbmRsOwoJY291dCA8PCBjMyA8PCBlbmRsOwoJY291dCA8PCB0IDw8IGVuZGw7Cn0=