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