iterator: @value type = { public x: T = 0; operator++: (inout this) -> forward iterator requires true = { x++; return this; } } iterator2: @value type = { public x: T = 0; } operator++: (inout it: iterator2) -> forward iterator2 requires true = { it.x++; return it; } int main() { { iterator i; std::cout << (++i).x; std::cout << (++i).x; std::cout << i++.x; std::cout << i++.x; std::cout << i.x << "\n"; } { iterator2 i; std::cout << (++i).x; std::cout << (++i).x; std::cout << i++.x; std::cout << i++.x; std::cout << i.x << "\n"; } } number: @struct type = { operator<=>: (this, that) -> _; operator-: (this, _) -> int = 0; } number_line: @struct type = { this: number; } number_line_pre_increment: type == number_line<0b1110, Id>; number_line_pre_decrement: type == number_line<0b1101, Id>; number_line_post_increment: type == number_line<0b1011, Id>; number_line_post_decrement: type == number_line<0b0111, Id>; operator++: (inout x: number_line) -> forward number_line requires bool(Op & 1) = x; operator--: (inout x: number_line) -> forward number_line requires bool(Op & 2) = x; operator++: (inout x: number_line_pre_increment<0>) -> forward number_line_pre_increment<0> = x; operator--: (inout x: number_line_pre_decrement<0>) -> forward number_line_pre_decrement<0> = x; operator++: (inout x: number_line_pre_increment<1>) -> forward const number_line_pre_increment<1> = x; operator--: (inout x: number_line_pre_decrement<1>) -> forward const number_line_pre_decrement<1> = x;