#!/usr/bin/env python3 class Serial: _modulus = 2 ** 32 _bitmask = _modulus - 1 _signbit = _modulus >> 1 def __init__(self, val): self._val = int(val) & self._bitmask def __add__(self, val): return self.__class__(self._val + int(val)) def __le__(self, other): return (self._modulus - int(self) + int(other)) & self._signbit == 0 def __ge__(self, other): return (self._modulus + int(self) - int(other)) & self._signbit == 0 def __eq__(self, other): return int(self) == int(other) def __ne__(self, other): return int(self) != int(other) def __lt__(self, other): return self != other and self <= other def __gt__(self, other): return self != other and self >= other def __int__(self): return self._val def __str__(self): return str(int(self)) if __name__ == "__main__": from random import randint for test in range(100): i1 = Serial(randint(0, 2**32-1)) i2 = Serial(randint(0, 2**32-1)) assert i1 == i2 or \ (i1 < i2 and not (i1 > i2)) or \ (i1 > i2 and not (i1 < i2)) or \ int(i1) & int(i2) == 0x80000000 if i1 == i2: print(f"{int(i1):10d} == {int(i2):10d}, how did that happen?") elif i1 < i2: print(f"{int(i1):10d} => {int(i2):10d}, can do it in one jump") else: i3 = i1 + (2**31 - 2) print(f"{int(i1):10d} => {int(i2):10d}, need to wrap, i3 value {i3}") assert i1 < i3 and i3 < i2