@@ -25,6 +25,17 @@ public class OperableObject
25
25
{
26
26
public int Num { get ; set ; }
27
27
28
+ public override int GetHashCode ( )
29
+ {
30
+ return unchecked ( 159832395 + Num . GetHashCode ( ) ) ;
31
+ }
32
+
33
+ public override bool Equals ( object obj )
34
+ {
35
+ return obj is OperableObject @object &&
36
+ Num == @object . Num ;
37
+ }
38
+
28
39
public OperableObject ( int num )
29
40
{
30
41
Num = num ;
@@ -149,6 +160,103 @@ public OperableObject(int num)
149
160
return new OperableObject ( a . Num ^ b ) ;
150
161
}
151
162
163
+ public static bool operator == ( int a , OperableObject b )
164
+ {
165
+ return ( a == b . Num ) ;
166
+ }
167
+ public static bool operator == ( OperableObject a , OperableObject b )
168
+ {
169
+ return ( a . Num == b . Num ) ;
170
+ }
171
+ public static bool operator == ( OperableObject a , int b )
172
+ {
173
+ return ( a . Num == b ) ;
174
+ }
175
+
176
+ public static bool operator != ( int a , OperableObject b )
177
+ {
178
+ return ( a != b . Num ) ;
179
+ }
180
+ public static bool operator != ( OperableObject a , OperableObject b )
181
+ {
182
+ return ( a . Num != b . Num ) ;
183
+ }
184
+ public static bool operator != ( OperableObject a , int b )
185
+ {
186
+ return ( a . Num != b ) ;
187
+ }
188
+
189
+ public static bool operator <= ( int a , OperableObject b )
190
+ {
191
+ return ( a <= b . Num ) ;
192
+ }
193
+ public static bool operator <= ( OperableObject a , OperableObject b )
194
+ {
195
+ return ( a . Num <= b . Num ) ;
196
+ }
197
+ public static bool operator <= ( OperableObject a , int b )
198
+ {
199
+ return ( a . Num <= b ) ;
200
+ }
201
+
202
+ public static bool operator >= ( int a , OperableObject b )
203
+ {
204
+ return ( a >= b . Num ) ;
205
+ }
206
+ public static bool operator >= ( OperableObject a , OperableObject b )
207
+ {
208
+ return ( a . Num >= b . Num ) ;
209
+ }
210
+ public static bool operator >= ( OperableObject a , int b )
211
+ {
212
+ return ( a . Num >= b ) ;
213
+ }
214
+
215
+ public static bool operator >= ( OperableObject a , PyObject b )
216
+ {
217
+ using ( Py . GIL ( ) )
218
+ {
219
+ // Assuming b is a tuple, take the first element.
220
+ int bNum = b [ 0 ] . As < int > ( ) ;
221
+ return a . Num >= bNum ;
222
+ }
223
+ }
224
+ public static bool operator <= ( OperableObject a , PyObject b )
225
+ {
226
+ using ( Py . GIL ( ) )
227
+ {
228
+ // Assuming b is a tuple, take the first element.
229
+ int bNum = b [ 0 ] . As < int > ( ) ;
230
+ return a . Num <= bNum ;
231
+ }
232
+ }
233
+
234
+ public static bool operator < ( int a , OperableObject b )
235
+ {
236
+ return ( a < b . Num ) ;
237
+ }
238
+ public static bool operator < ( OperableObject a , OperableObject b )
239
+ {
240
+ return ( a . Num < b . Num ) ;
241
+ }
242
+ public static bool operator < ( OperableObject a , int b )
243
+ {
244
+ return ( a . Num < b ) ;
245
+ }
246
+
247
+ public static bool operator > ( int a , OperableObject b )
248
+ {
249
+ return ( a > b . Num ) ;
250
+ }
251
+ public static bool operator > ( OperableObject a , OperableObject b )
252
+ {
253
+ return ( a . Num > b . Num ) ;
254
+ }
255
+ public static bool operator > ( OperableObject a , int b )
256
+ {
257
+ return ( a . Num > b ) ;
258
+ }
259
+
152
260
public static OperableObject operator << ( OperableObject a , int offset )
153
261
{
154
262
return new OperableObject ( a . Num << offset ) ;
@@ -161,7 +269,7 @@ public OperableObject(int num)
161
269
}
162
270
163
271
[ Test ]
164
- public void OperatorOverloads ( )
272
+ public void SymmetricalOperatorOverloads ( )
165
273
{
166
274
string name = string . Format ( "{0}.{1}" ,
167
275
typeof ( OperableObject ) . DeclaringType . Name ,
@@ -206,6 +314,24 @@ public void OperatorOverloads()
206
314
207
315
c = a ^ b
208
316
assert c.Num == a.Num ^ b.Num
317
+
318
+ c = a == b
319
+ assert c == (a.Num == b.Num)
320
+
321
+ c = a != b
322
+ assert c == (a.Num != b.Num)
323
+
324
+ c = a <= b
325
+ assert c == (a.Num <= b.Num)
326
+
327
+ c = a >= b
328
+ assert c == (a.Num >= b.Num)
329
+
330
+ c = a < b
331
+ assert c == (a.Num < b.Num)
332
+
333
+ c = a > b
334
+ assert c == (a.Num > b.Num)
209
335
" ) ;
210
336
}
211
337
@@ -263,6 +389,51 @@ public void ForwardOperatorOverloads()
263
389
264
390
c = a ^ b
265
391
assert c.Num == a.Num ^ b
392
+
393
+ c = a == b
394
+ assert c == (a.Num == b)
395
+
396
+ c = a != b
397
+ assert c == (a.Num != b)
398
+
399
+ c = a <= b
400
+ assert c == (a.Num <= b)
401
+
402
+ c = a >= b
403
+ assert c == (a.Num >= b)
404
+
405
+ c = a < b
406
+ assert c == (a.Num < b)
407
+
408
+ c = a > b
409
+ assert c == (a.Num > b)
410
+ " ) ;
411
+ }
412
+
413
+ [ Test ]
414
+ public void TupleComparisonOperatorOverloads ( )
415
+ {
416
+ string name = string . Format ( "{0}.{1}" ,
417
+ typeof ( OperableObject ) . DeclaringType . Name ,
418
+ typeof ( OperableObject ) . Name ) ;
419
+ string module = MethodBase . GetCurrentMethod ( ) . DeclaringType . Namespace ;
420
+ PythonEngine . Exec ( $@ "
421
+ from { module } import *
422
+ cls = { name }
423
+ a = cls(2)
424
+ b = (1, 2)
425
+
426
+ c = a >= b
427
+ assert c == (a.Num >= b[0])
428
+
429
+ c = a <= b
430
+ assert c == (a.Num <= b[0])
431
+
432
+ c = b >= a
433
+ assert c == (b[0] >= a.Num)
434
+
435
+ c = b <= a
436
+ assert c == (b[0] <= a.Num)
266
437
" ) ;
267
438
}
268
439
@@ -304,6 +475,24 @@ public void ReverseOperatorOverloads()
304
475
305
476
c = a ^ b
306
477
assert c.Num == a ^ b.Num
478
+
479
+ c = a == b
480
+ assert c == (a == b.Num)
481
+
482
+ c = a != b
483
+ assert c == (a != b.Num)
484
+
485
+ c = a <= b
486
+ assert c == (a <= b.Num)
487
+
488
+ c = a >= b
489
+ assert c == (a >= b.Num)
490
+
491
+ c = a < b
492
+ assert c == (a < b.Num)
493
+
494
+ c = a > b
495
+ assert c == (a > b.Num)
307
496
" ) ;
308
497
309
498
}
0 commit comments