123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- # Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
- """Serial Number Arthimetic from RFC 1982"""
- class Serial:
- def __init__(self, value, bits=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
|