serial.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. # Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
  2. """Serial Number Arthimetic from RFC 1982"""
  3. class Serial:
  4. def __init__(self, value, bits=32):
  5. self.value = value % 2 ** bits
  6. self.bits = bits
  7. def __repr__(self):
  8. return f'dns.serial.Serial({self.value}, {self.bits})'
  9. def __eq__(self, other):
  10. if isinstance(other, int):
  11. other = Serial(other, self.bits)
  12. elif not isinstance(other, Serial) or other.bits != self.bits:
  13. return NotImplemented
  14. return self.value == other.value
  15. def __ne__(self, other):
  16. if isinstance(other, int):
  17. other = Serial(other, self.bits)
  18. elif not isinstance(other, Serial) or other.bits != self.bits:
  19. return NotImplemented
  20. return self.value != other.value
  21. def __lt__(self, other):
  22. if isinstance(other, int):
  23. other = Serial(other, self.bits)
  24. elif not isinstance(other, Serial) or other.bits != self.bits:
  25. return NotImplemented
  26. if self.value < other.value and \
  27. other.value - self.value < 2 ** (self.bits - 1):
  28. return True
  29. elif self.value > other.value and \
  30. self.value - other.value > 2 ** (self.bits - 1):
  31. return True
  32. else:
  33. return False
  34. def __le__(self, other):
  35. return self == other or self < other
  36. def __gt__(self, other):
  37. if isinstance(other, int):
  38. other = Serial(other, self.bits)
  39. elif not isinstance(other, Serial) or other.bits != self.bits:
  40. return NotImplemented
  41. if self.value < other.value and \
  42. other.value - self.value > 2 ** (self.bits - 1):
  43. return True
  44. elif self.value > other.value and \
  45. self.value - other.value < 2 ** (self.bits - 1):
  46. return True
  47. else:
  48. return False
  49. def __ge__(self, other):
  50. return self == other or self > other
  51. def __add__(self, other):
  52. v = self.value
  53. if isinstance(other, Serial):
  54. delta = other.value
  55. elif isinstance(other, int):
  56. delta = other
  57. else:
  58. raise ValueError
  59. if abs(delta) > (2 ** (self.bits - 1) - 1):
  60. raise ValueError
  61. v += delta
  62. v = v % 2 ** self.bits
  63. return Serial(v, self.bits)
  64. def __iadd__(self, other):
  65. v = self.value
  66. if isinstance(other, Serial):
  67. delta = other.value
  68. elif isinstance(other, int):
  69. delta = other
  70. else:
  71. raise ValueError
  72. if abs(delta) > (2 ** (self.bits - 1) - 1):
  73. raise ValueError
  74. v += delta
  75. v = v % 2 ** self.bits
  76. self.value = v
  77. return self
  78. def __sub__(self, other):
  79. v = self.value
  80. if isinstance(other, Serial):
  81. delta = other.value
  82. elif isinstance(other, int):
  83. delta = other
  84. else:
  85. raise ValueError
  86. if abs(delta) > (2 ** (self.bits - 1) - 1):
  87. raise ValueError
  88. v -= delta
  89. v = v % 2 ** self.bits
  90. return Serial(v, self.bits)
  91. def __isub__(self, other):
  92. v = self.value
  93. if isinstance(other, Serial):
  94. delta = other.value
  95. elif isinstance(other, int):
  96. delta = other
  97. else:
  98. raise ValueError
  99. if abs(delta) > (2 ** (self.bits - 1) - 1):
  100. raise ValueError
  101. v -= delta
  102. v = v % 2 ** self.bits
  103. self.value = v
  104. return self