class SerialNumber
Handles serial values, adjusting correctly for wraparound.
From the DNS and Bind book, p. 139:
“The DNS serial number is a 32-bit unsigned integer whose value ranges from 0 to 4,294,967,295. The serial number uses sequence space arithmetic, which means that for any serial number, half the numbers in the number space (2,147,483,647 numbers) are less than the serial number, and half the numbers are larger.”“
Constants
- MAX_DIFFERENCE
- MAX_VALUE
- MIN_VALUE
Attributes
value[RW]
Public Class Methods
compare(sss1, sss2)
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 62 def self.compare(sss1, sss2) compare_values(sss1.value, sss2.value) end
compare_values(value_1, value_2)
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 47 def self.compare_values(value_1, value_2) distance = (value_1 - value_2).abs if distance == 0 0 elsif distance < MAX_DIFFERENCE value_1 - value_2 elsif distance > MAX_DIFFERENCE value_2 - value_1 else # distance == MAX_DIFFERENCE raise "Cannot compare 2 numbers whose difference is exactly #{MAX_DIFFERENCE.to_s(16)} (#{value_1}, #{value_2})." end end
new(value)
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 20 def initialize(value) self.class.validate(value) @value = value end
next_serial_value(value)
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 67 def self.next_serial_value(value) validate(value) value == MAX_VALUE ? 0 : value + 1 end
object(thing)
click to toggle source
Call this when you have an object that may be either a SerialNumber
or a Fixnum/Bignum, and you want to ensure that you have a SerialNumber
.
# File lib/mock_dns_server/serial_number.rb, line 29 def self.object(thing) if thing.is_a?(SerialNumber) thing elsif thing.nil? nil else SerialNumber.new(thing) end end
validate(value)
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 40 def self.validate(value) if value < MIN_VALUE || value > MAX_VALUE raise "Invalid value (#{value}), must be between #{MIN_VALUE} and #{MAX_VALUE}." end end
Public Instance Methods
<(other)
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 88 def <(other) self.<=>(other) < 0 end
<=(other)
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 98 def <=(other) self.<=>(other) <= 0 end
<=>(other)
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 78 def <=>(other) self.class.compare(self, other) end
==(other)
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 103 def ==(other) self.class == other.class && self.value == other.value end
>(other)
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 83 def >(other) self.<=>(other) > 0 end
>=(other)
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 93 def >=(other) self.<=>(other) >= 0 end
eql?(other)
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 113 def eql?(other) self.==(other) end
hash()
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 109 def hash value.hash end
next_serial()
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 73 def next_serial self.class.new(self.class.next_serial_value(value)) end
to_i()
click to toggle source
Can be used to normalize an object that may be a Fixnum or a SerialNumber
to an int:
# File lib/mock_dns_server/serial_number.rb, line 118 def to_i value end
to_s()
click to toggle source
# File lib/mock_dns_server/serial_number.rb, line 123 def to_s "#{self.class}: value = #{value}" end