#include <iostream>
template <int ORIGIN = 0, int INCREMENT = 1>
struct $CTCOrigin : std::integral_constant<int, ORIGIN>
{
static constexpr int increment = INCREMENT;
};
template <typename Tag, size_t LINE>
struct $CTC : $CTC<Tag, LINE - 1> { };
template <typename Tag>
struct $CTC<Tag, 0> : $CTCOrigin<0, 1> { };
#define RESET_CTC(Tag, ...) \
template <> struct $CTC<class Tag, __LINE__> : $CTCOrigin<__VA_ARGS__> { };
#define UPDATE_CTC(Tag) \
template <> struct $CTC<class Tag, __LINE__> : $CTC<class Tag, __LINE__ - 1> \
{ \
static constexpr int value = $CTC<class Tag, __LINE__ - 1>::value + increment; \
};
#define GET_CTC(Tag) \
$CTC<class Tag, __LINE__ - 1>::value
constexpr auto i11 = GET_CTC(ctc1);
constexpr auto i12 = GET_CTC(ctc2);
constexpr auto i13 = GET_CTC(ctc3);
UPDATE_CTC(ctc1);
UPDATE_CTC(ctc2);
UPDATE_CTC(ctc3);
constexpr auto i21 = GET_CTC(ctc1);
constexpr auto i22 = GET_CTC(ctc2);
constexpr auto i23 = GET_CTC(ctc3);
RESET_CTC(ctc1);
RESET_CTC(ctc2, 7);
RESET_CTC(ctc3, 10, -5);
constexpr auto i31 = GET_CTC(ctc1);
constexpr auto i32 = GET_CTC(ctc2);
constexpr auto i33 = GET_CTC(ctc3);
UPDATE_CTC(ctc1);
UPDATE_CTC(ctc2);
UPDATE_CTC(ctc3);
constexpr auto i41 = GET_CTC(ctc1);
constexpr auto i42 = GET_CTC(ctc2);
constexpr auto i43 = GET_CTC(ctc3);
int main()
{
std::cout << i11 << ", " << i12 << ", " << i13 << std::endl;
std::cout << i21 << ", " << i22 << ", " << i23 << std::endl;
std::cout << i31 << ", " << i32 << ", " << i33 << std::endl;
std::cout << i41 << ", " << i42 << ", " << i43 << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGludCBPUklHSU4gPSAwLCBpbnQgSU5DUkVNRU5UID0gMT4Kc3RydWN0ICRDVENPcmlnaW4gOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PGludCwgT1JJR0lOPgp7CiAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGluY3JlbWVudCA9IElOQ1JFTUVOVDsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUYWcsIHNpemVfdCBMSU5FPgpzdHJ1Y3QgJENUQyA6ICRDVEM8VGFnLCBMSU5FIC0gMT4geyB9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFRhZz4Kc3RydWN0ICRDVEM8VGFnLCAwPiA6ICRDVENPcmlnaW48MCwgMT4geyB9OwoKI2RlZmluZSBSRVNFVF9DVEMoVGFnLCAuLi4pIFwKICAgdGVtcGxhdGUgPD4gc3RydWN0ICRDVEM8Y2xhc3MgVGFnLCBfX0xJTkVfXz4gOiAkQ1RDT3JpZ2luPF9fVkFfQVJHU19fPiB7IH07CgojZGVmaW5lIFVQREFURV9DVEMoVGFnKSBcCiAgIHRlbXBsYXRlIDw+IHN0cnVjdCAkQ1RDPGNsYXNzIFRhZywgX19MSU5FX18+IDogJENUQzxjbGFzcyBUYWcsIF9fTElORV9fIC0gMT4gXAogICB7IFwKICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgdmFsdWUgPSAkQ1RDPGNsYXNzIFRhZywgX19MSU5FX18gLSAxPjo6dmFsdWUgKyBpbmNyZW1lbnQ7IFwKICAgfTsKCiNkZWZpbmUgR0VUX0NUQyhUYWcpIFwKICAgJENUQzxjbGFzcyBUYWcsIF9fTElORV9fIC0gMT46OnZhbHVlCgoKY29uc3RleHByIGF1dG8gaTExID0gR0VUX0NUQyhjdGMxKTsKY29uc3RleHByIGF1dG8gaTEyID0gR0VUX0NUQyhjdGMyKTsKY29uc3RleHByIGF1dG8gaTEzID0gR0VUX0NUQyhjdGMzKTsKClVQREFURV9DVEMoY3RjMSk7ClVQREFURV9DVEMoY3RjMik7ClVQREFURV9DVEMoY3RjMyk7CmNvbnN0ZXhwciBhdXRvIGkyMSA9IEdFVF9DVEMoY3RjMSk7CmNvbnN0ZXhwciBhdXRvIGkyMiA9IEdFVF9DVEMoY3RjMik7CmNvbnN0ZXhwciBhdXRvIGkyMyA9IEdFVF9DVEMoY3RjMyk7CgpSRVNFVF9DVEMoY3RjMSk7ClJFU0VUX0NUQyhjdGMyLCA3KTsKUkVTRVRfQ1RDKGN0YzMsIDEwLCAtNSk7CmNvbnN0ZXhwciBhdXRvIGkzMSA9IEdFVF9DVEMoY3RjMSk7CmNvbnN0ZXhwciBhdXRvIGkzMiA9IEdFVF9DVEMoY3RjMik7CmNvbnN0ZXhwciBhdXRvIGkzMyA9IEdFVF9DVEMoY3RjMyk7CgpVUERBVEVfQ1RDKGN0YzEpOwpVUERBVEVfQ1RDKGN0YzIpOwpVUERBVEVfQ1RDKGN0YzMpOwpjb25zdGV4cHIgYXV0byBpNDEgPSBHRVRfQ1RDKGN0YzEpOwpjb25zdGV4cHIgYXV0byBpNDIgPSBHRVRfQ1RDKGN0YzIpOwpjb25zdGV4cHIgYXV0byBpNDMgPSBHRVRfQ1RDKGN0YzMpOwoKaW50IG1haW4oKQp7CglzdGQ6OmNvdXQgPDwgaTExIDw8ICIsICIgPDwgaTEyIDw8ICIsICIgPDwgaTEzIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBpMjEgPDwgIiwgIiA8PCBpMjIgPDwgIiwgIiA8PCBpMjMgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8IGkzMSA8PCAiLCAiIDw8IGkzMiA8PCAiLCAiIDw8IGkzMyA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgaTQxIDw8ICIsICIgPDwgaTQyIDw8ICIsICIgPDwgaTQzIDw8IHN0ZDo6ZW5kbDsKfQ==