@@ -25,6 +25,17 @@ public class OperableObject
2525 {
2626 public int Num { get ; set ; }
2727
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+
2839 public OperableObject ( int num )
2940 {
3041 Num = num ;
@@ -149,6 +160,103 @@ public OperableObject(int num)
149160 return new OperableObject ( a . Num ^ b ) ;
150161 }
151162
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+
152260 public static OperableObject operator << ( OperableObject a , int offset )
153261 {
154262 return new OperableObject ( a . Num << offset ) ;
@@ -161,7 +269,7 @@ public OperableObject(int num)
161269 }
162270
163271 [ Test ]
164- public void OperatorOverloads ( )
272+ public void SymmetricalOperatorOverloads ( )
165273 {
166274 string name = string . Format ( "{0}.{1}" ,
167275 typeof ( OperableObject ) . DeclaringType . Name ,
@@ -206,6 +314,24 @@ public void OperatorOverloads()
206314
207315c = a ^ b
208316assert 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)
209335" ) ;
210336 }
211337
@@ -263,6 +389,51 @@ public void ForwardOperatorOverloads()
263389
264390c = a ^ b
265391assert 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)
266437" ) ;
267438 }
268439
@@ -304,6 +475,24 @@ public void ReverseOperatorOverloads()
304475
305476c = a ^ b
306477assert 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)
307496" ) ;
308497
309498 }
0 commit comments