class Net::Address::Mask

Public Class Methods

new(mask) click to toggle source
# File lib/net/address/mask.rb, line 11
def initialize(mask)
  mask = mask.nil? ? 0 : mask
  @mask = parse_mask(mask)
  raise ArgumentError, "Not valid Net::Address::Mask #{mask}" unless 0 <= @mask.to_i and @mask.to_i <= 32
end

Public Instance Methods

<=>(other) click to toggle source
# File lib/net/address/mask.rb, line 29
def <=>(other)
  begin
    other = self.class.new(other) unless other.is_a? self.class
  rescue
    nil
  end
  self.to_i <=> other.to_i
end
to_cidr() click to toggle source
# File lib/net/address/mask.rb, line 25
def to_cidr
  @mask.to_i
end
to_i() click to toggle source
# File lib/net/address/mask.rb, line 21
def to_i
  (0xFFFFFFFF << (32 - @mask.to_i)) & 0xFFFFFFFF
end
to_s() click to toggle source
# File lib/net/address/mask.rb, line 17
def to_s
  [self.to_i].pack('N').unpack('C*').join '.'
end

Private Instance Methods

parse_integer(mask) click to toggle source
# File lib/net/address/mask.rb, line 68
def parse_integer(mask)
  raise ArgumentError, "Not valid Net::Address::Mask #{mask}" if mask < 0
  return mask if mask.to_i <= 32
  matching_bits = [mask].pack('N*').unpack('B*').first.match(/^(1{0,32})(0{0,32})$/)
  raise ArgumentError, "Not valid Net::Address::Mask #{mask}" if matching_bits.nil?
  matching_bits[1].size
end
parse_mask(mask) click to toggle source
# File lib/net/address/mask.rb, line 40
def parse_mask(mask)
  case mask
    when self.class
      mask.to_cidr
    when Integer
      parse_integer(mask)
    when String
      parse_string(mask)
    else
      raise ArgumentError, "Not valid Net::Address::Mask #{mask}"
  end
end
parse_string(mask) click to toggle source
# File lib/net/address/mask.rb, line 53
def parse_string(mask)
  case mask
    when /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
      matching_bits = mask.split('.').map(&:to_i).pack('C*').unpack('B*').first.match(/^(1{0,32})(0{0,32})$/)
      raise ArgumentError, "Not valid Net::Address::Mask #{mask}" if matching_bits.nil?
      matching_bits[1].size
    when /^\/\d{1,2}$/
      mask.to_s.gsub(/\//, '').to_i
    when /^\d{1,2}$/
      mask
    else
      raise ArgumentError, "Not valid Net::Address::Mask #{mask}"
  end
end