#include #include #include // requires C++23 to compile class A { long long counter = 0; public: A() : counter{0} {} A operator()() { A ret = *this; ret.counter++; return ret; } // requires C++23 to compile A operator[](int _ = 0) { A ret = *this; ret.counter--; return ret; } // friend std::ostream &operator<<(std::ostream &lhs, A const &rhs) { // lhs << rhs.counter; // return lhs; // } operator long long() { return counter; } }; int main(void) { A a; assert(a == 0); assert(a[] == -1); assert(a[]() == 0); assert(a[]()() == 1); for (long long j = 1; j < 100; j++) { A a2; A a3; for (long long k = 0; k < j; k++) { assert(a2 == k); assert(a3 == -k); a2 = a2(); a3 = a3[]; } assert(a2 == j); assert(a3 == -j); } int i = a; assert(i == 0); i = a()()()()()()()()()()()(); assert(i == 12); i = a()()()()()()()()()()(); assert(i == 11); i = a()()()()()()()()()()()[]; assert(i == 10); i = a()()()()()()()()()(); assert(i == 10); i = a()()()()()()()()()()[]; assert(i == 9); i = a()()()()()()()()()()[][]; assert(i == 8); i = a()()()()()()()()(); assert(i == 9); i = a()()()()()()()()()[]; assert(i == 8); i = a()()()()()()()()()[][]; assert(i == 7); i = a()()()()()()()()()[][][]; assert(i == 6); i = a()()()()()()()(); assert(i == 8); i = a()()()()()()()()[]; assert(i == 7); i = a()()()()()()()()[][]; assert(i == 6); i = a()()()()()()()()[][][]; assert(i == 5); i = a()()()()()()()()[][][][]; assert(i == 4); i = a()()()()()()(); assert(i == 7); i = a()()()()()()()[]; assert(i == 6); i = a()()()()()()()[][]; assert(i == 5); i = a()()()()()()()[][][]; assert(i == 4); i = a()()()()()()()[][][][]; assert(i == 3); i = a()()()()()()()[][][][][]; assert(i == 2); i = a()()()()()(); assert(i == 6); i = a()()()()()()[]; assert(i == 5); i = a()()()()()()[][]; assert(i == 4); i = a()()()()()()[][][]; assert(i == 3); i = a()()()()()()[][][][]; assert(i == 2); i = a()()()()()()[][][][][]; assert(i == 1); i = a()()()()()()[][][][][][]; assert(i == 0); i = a()()()()(); assert(i == 5); i = a()()()()()[]; assert(i == 4); i = a()()()()()[][]; assert(i == 3); i = a()()()()()[][][]; assert(i == 2); i = a()()()()()[][][][]; assert(i == 1); i = a()()()()()[][][][][]; assert(i == 0); i = a()()()()()[][][][][][]; assert(i == -1); i = a()()()()()[][][][][][][]; assert(i == -2); i = a()()()(); assert(i == 4); i = a()()()()[]; assert(i == 3); i = a()()()()[][]; assert(i == 2); i = a()()()()[][][]; assert(i == 1); i = a()()()()[][][][]; assert(i == 0); i = a()()()()[][][][][]; assert(i == -1); i = a()()()()[][][][][][]; assert(i == -2); i = a()()()()[][][][][][][]; assert(i == -3); i = a()()()()[][][][][][][][]; assert(i == -4); i = a()()(); assert(i == 3); i = a()()()[]; assert(i == 2); i = a()()()[][]; assert(i == 1); i = a()()()[][][]; assert(i == 0); i = a()()()[][][][]; assert(i == -1); i = a()()()[][][][][]; assert(i == -2); i = a()()()[][][][][][]; assert(i == -3); i = a()()()[][][][][][][]; assert(i == -4); i = a()()()[][][][][][][][]; assert(i == -5); i = a()()()[][][][][][][][][]; assert(i == -6); i = a()(); assert(i == 2); i = a()()[]; assert(i == 1); i = a()()[][]; assert(i == 0); i = a()()[][][]; assert(i == -1); i = a()()[][][][]; assert(i == -2); i = a()()[][][][][]; assert(i == -3); i = a()()[][][][][][]; assert(i == -4); i = a()()[][][][][][][]; assert(i == -5); i = a()()[][][][][][][][]; assert(i == -6); i = a()()[][][][][][][][][]; assert(i == -7); i = a()()[][][][][][][][][][]; assert(i == -8); i = a(); assert(i == 1); i = a()[]; assert(i == 0); i = a()[][]; assert(i == -1); i = a()[][][]; assert(i == -2); i = a()[][][][]; assert(i == -3); i = a()[][][][][]; assert(i == -4); i = a()[][][][][][]; assert(i == -5); i = a()[][][][][][][]; assert(i == -6); i = a()[][][][][][][][]; assert(i == -7); i = a()[][][][][][][][][]; assert(i == -8); i = a()[][][][][][][][][][]; assert(i == -9); i = a()[][][][][][][][][][][]; assert(i == -10); i = a; assert(i == 0); i = a[]; assert(i == -1); i = a[][]; assert(i == -2); i = a[][][]; assert(i == -3); i = a[][][][]; assert(i == -4); i = a[][][][][]; assert(i == -5); i = a[][][][][][]; assert(i == -6); i = a[][][][][][][]; assert(i == -7); i = a[][][][][][][][]; assert(i == -8); i = a[][][][][][][][][]; assert(i == -9); i = a[][][][][][][][][][]; assert(i == -10); i = a[][][][][][][][][][][]; assert(i == -11); i = a[][][][][][][][][][][][]; assert(i == -12); return 0; }