cs440-final/track.cpp

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;
}