231 lines
4.8 KiB
C++
231 lines
4.8 KiB
C++
#include <cassert>
|
|
#include <iostream>
|
|
#include <ostream>
|
|
// 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;
|
|
}
|