1 #define UN_OP(op) const char* operator op () { return "unary "#op; }
2 #define POST_UN_OP(op) const char* operator op (int x) { x++; return "post "#op; }
3 #define BIN_OP(op) const char* operator op (int x) { x++; return "binary "#op; }
4 #define NONMEMBER_BIN_OP(op) const char* operator op (int x, const TestOps&) { x++; return "nonmember binary "#op; }
5 #define NONMEMBER_BIN_OP2(op) const char* operator op (double x, const TestOps&) { x++; return "nonmember binary2 "#op; }
6 
7 #define COMMA ,
8 
9 class TestOps {
10 
11 public:
12 
13     UN_OP(-);
14     UN_OP(+);
15     UN_OP(*);
16     UN_OP(~);
17     UN_OP(!);
18     UN_OP(&);
19 
20     UN_OP(++);
21     UN_OP(--);
22     POST_UN_OP(++);
23     POST_UN_OP(--);
24 
25     BIN_OP(+);
26     BIN_OP(-);
27     BIN_OP(*);
28     BIN_OP(/);
29     BIN_OP(%);
30 
31     BIN_OP(<<);
32     BIN_OP(>>);
33 
34     BIN_OP(|);
35     BIN_OP(&);
36     BIN_OP(^);
37     BIN_OP(COMMA);
38 
39     BIN_OP(==);
40     BIN_OP(!=);
41     BIN_OP(<=);
42     BIN_OP(<);
43     BIN_OP(>=);
44     BIN_OP(>);
45 
46     BIN_OP([]);
47     BIN_OP(());
48 
49 };
50 
51 NONMEMBER_BIN_OP(+)
52 NONMEMBER_BIN_OP(-)
53 NONMEMBER_BIN_OP(*)
54 NONMEMBER_BIN_OP(/)
55 NONMEMBER_BIN_OP(%)
56 
57 NONMEMBER_BIN_OP(<<)
58 NONMEMBER_BIN_OP(>>)
59 
60 NONMEMBER_BIN_OP(|)
61 NONMEMBER_BIN_OP(&)
62 NONMEMBER_BIN_OP(^)
NONMEMBER_BIN_OP(COMMA)63 NONMEMBER_BIN_OP(COMMA)
64 
65 NONMEMBER_BIN_OP2(+)
66 NONMEMBER_BIN_OP2(-)
67 NONMEMBER_BIN_OP2(*)
68 NONMEMBER_BIN_OP2(/)
69 NONMEMBER_BIN_OP2(%)
70 
71 NONMEMBER_BIN_OP2(<<)
72 NONMEMBER_BIN_OP2(>>)
73 
74 NONMEMBER_BIN_OP2(|)
75 NONMEMBER_BIN_OP2(&)
76 NONMEMBER_BIN_OP2(^)
77 NONMEMBER_BIN_OP2(COMMA)
78 
79 
80 /* RefTestOps */
81 
82 #define REF_UN_OP(op) int& operator op () { return value; }
83 #define REF_POST_UN_OP(op) int& operator op (int x) { x++; return value; }
84 #define REF_BIN_OP(op) int& operator op (int x) { x++; return value; }
85 
86 class RefTestOps {
87     int value = 0;
88 
89 public:
90 
91     REF_UN_OP(-);
92     REF_UN_OP(+);
93     REF_UN_OP(*);
94     REF_UN_OP(~);
95     REF_UN_OP(!);
96     REF_UN_OP(&);
97 
98     REF_UN_OP(++);
99     REF_UN_OP(--);
100     REF_POST_UN_OP(++);
101     REF_POST_UN_OP(--);
102 
103     REF_BIN_OP(+);
104     REF_BIN_OP(-);
105     REF_BIN_OP(*);
106     REF_BIN_OP(/);
107     REF_BIN_OP(%);
108 
109     REF_BIN_OP(<<);
110     REF_BIN_OP(>>);
111 
112     REF_BIN_OP(|);
113     REF_BIN_OP(&);
114     REF_BIN_OP(^);
115     REF_BIN_OP(COMMA);
116 
117     REF_BIN_OP(==);
118     REF_BIN_OP(!=);
119     REF_BIN_OP(<=);
120     REF_BIN_OP(<);
121     REF_BIN_OP(>=);
122     REF_BIN_OP(>);
123 
124     REF_BIN_OP([]);
125     REF_BIN_OP(());
126 };
127 
128 
129 /* TruthClass */
130 
131 class TruthClass {
132 public:
TruthClass()133   TruthClass() : value(false) {}
TruthClass(bool value)134   TruthClass(bool value) : value(value) {}
~TruthClass()135   virtual ~TruthClass() {};
136   operator bool() { return value; }
137   bool value;
138 };
139