Spaces:
Paused
Paused
| # Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license | |
| """Serial Number Arthimetic from RFC 1982""" | |
| class Serial: | |
| def __init__(self, value: int, bits: int = 32): | |
| self.value = value % 2**bits | |
| self.bits = bits | |
| def __repr__(self): | |
| return f"dns.serial.Serial({self.value}, {self.bits})" | |
| def __eq__(self, other): | |
| if isinstance(other, int): | |
| other = Serial(other, self.bits) | |
| elif not isinstance(other, Serial) or other.bits != self.bits: | |
| return NotImplemented | |
| return self.value == other.value | |
| def __ne__(self, other): | |
| if isinstance(other, int): | |
| other = Serial(other, self.bits) | |
| elif not isinstance(other, Serial) or other.bits != self.bits: | |
| return NotImplemented | |
| return self.value != other.value | |
| def __lt__(self, other): | |
| if isinstance(other, int): | |
| other = Serial(other, self.bits) | |
| elif not isinstance(other, Serial) or other.bits != self.bits: | |
| return NotImplemented | |
| if self.value < other.value and other.value - self.value < 2 ** (self.bits - 1): | |
| return True | |
| elif self.value > other.value and self.value - other.value > 2 ** ( | |
| self.bits - 1 | |
| ): | |
| return True | |
| else: | |
| return False | |
| def __le__(self, other): | |
| return self == other or self < other | |
| def __gt__(self, other): | |
| if isinstance(other, int): | |
| other = Serial(other, self.bits) | |
| elif not isinstance(other, Serial) or other.bits != self.bits: | |
| return NotImplemented | |
| if self.value < other.value and other.value - self.value > 2 ** (self.bits - 1): | |
| return True | |
| elif self.value > other.value and self.value - other.value < 2 ** ( | |
| self.bits - 1 | |
| ): | |
| return True | |
| else: | |
| return False | |
| def __ge__(self, other): | |
| return self == other or self > other | |
| def __add__(self, other): | |
| v = self.value | |
| if isinstance(other, Serial): | |
| delta = other.value | |
| elif isinstance(other, int): | |
| delta = other | |
| else: | |
| raise ValueError | |
| if abs(delta) > (2 ** (self.bits - 1) - 1): | |
| raise ValueError | |
| v += delta | |
| v = v % 2**self.bits | |
| return Serial(v, self.bits) | |
| def __iadd__(self, other): | |
| v = self.value | |
| if isinstance(other, Serial): | |
| delta = other.value | |
| elif isinstance(other, int): | |
| delta = other | |
| else: | |
| raise ValueError | |
| if abs(delta) > (2 ** (self.bits - 1) - 1): | |
| raise ValueError | |
| v += delta | |
| v = v % 2**self.bits | |
| self.value = v | |
| return self | |
| def __sub__(self, other): | |
| v = self.value | |
| if isinstance(other, Serial): | |
| delta = other.value | |
| elif isinstance(other, int): | |
| delta = other | |
| else: | |
| raise ValueError | |
| if abs(delta) > (2 ** (self.bits - 1) - 1): | |
| raise ValueError | |
| v -= delta | |
| v = v % 2**self.bits | |
| return Serial(v, self.bits) | |
| def __isub__(self, other): | |
| v = self.value | |
| if isinstance(other, Serial): | |
| delta = other.value | |
| elif isinstance(other, int): | |
| delta = other | |
| else: | |
| raise ValueError | |
| if abs(delta) > (2 ** (self.bits - 1) - 1): | |
| raise ValueError | |
| v -= delta | |
| v = v % 2**self.bits | |
| self.value = v | |
| return self | |