module BetterIpaddr::InstanceMethods

Methods included in IPAddr::Base and its descendants

Attributes

family[R]

Return the magic number representing the address family. @return [Integer]

mask_addr[R]

Return the integer representation of the netmask. @return [Integer]

Public Class Methods

included(base) click to toggle source
# File lib/better_ipaddr/methods.rb, line 9
def self.included(base)
  return unless base <= IPAddr
  base.class_eval do
    define_method :stdlib_to_s, IPAddr.instance_method(:to_s)
  end
end

Public Instance Methods

+(offset) click to toggle source

Return the address greater than the original address by the given offset. Note that the result will always be a host address. @param offset [Integer] the difference between the original

address and the returned address

@return [IPAddr]

# File lib/better_ipaddr/methods.rb, line 37
def +(offset)
  self.class.new(@addr + offset, family)
end
-(offset) click to toggle source

Return the address less than the original address by the given offset. Note that the result will always be a host address. @param offset [Integer] the difference between the original

address and the returned address

@return [IPAddr]

# File lib/better_ipaddr/methods.rb, line 48
def -(offset)
  self + -offset
end
<=>(other) click to toggle source

@overload <=>(other)

Compare this address with the integer representation of another
address of the same address family.
@param [Integer] other
@return [Integer]
# File lib/better_ipaddr/methods.rb, line 64
def <=>(other)
  if other.is_a?(IPAddr)
    family_difference = family <=> other.family
    return family_difference unless family_difference == 0
  elsif !other.is_a?(Integer)
    return nil
  end

  address_difference = to_i <=> other.to_i

  if address_difference != 0 || !other.is_a?(IPAddr)
    return address_difference
  end

  other.instance_variable_get(:@mask_addr) <=> @mask_addr
end
==(other) click to toggle source

Test the equality of two IP addresses, or an IP address an integer representing an address in the same address family.

Returns false for any other type.

@param other [IPAddr, Integer] the address to compare with @return [Boolean]

# File lib/better_ipaddr/methods.rb, line 89
def ==(other)
  (other.is_a?(IPAddr) || other.is_a?(Integer)) && (self <=> other) == 0
end
[](offset) click to toggle source

The address at the given offset relative to the network address of the network. A negative offset will be used to count backwards from the highest addresses within the network. @param offset [Integer] the index within the network of the desired address @return [IPAddr] the address at the given index

# File lib/better_ipaddr/methods.rb, line 100
def [](offset)
  return self if offset == 0 && host?
  offset2 = offset >= 0 ? offset : size + offset
  self.class[to_i + offset2, family: family]
end
address_family_bit_length() click to toggle source

Returns the number of bits allowed by the address family. A more efficient form of this method is available to the specialized IPAddr child classes.

@return [Integer]

# File lib/better_ipaddr/methods.rb, line 112
def address_family_bit_length
  FAMILY_TO_BIT_LENGTH.fetch(family)
end
base(full: false) click to toggle source

Returns a string representation of the address without a prefix length.

@return [String]

# File lib/better_ipaddr/methods.rb, line 120
def base(full: false)
  if full
    to_string
  else
    stdlib_to_s
  end
end
better_to_s(cidr: false, full: false) click to toggle source
# File lib/better_ipaddr/methods.rb, line 128
def better_to_s(cidr: false, full: false)
  if cidr
    "#{base(full: full)}/#{prefix_length}"
  else
    base(full: full)
  end
end
broadcast()
Alias for: last
cidr(cidr: nil, full: false) click to toggle source

Return a string containing the CIDR representation of the address.

@return [String]

# File lib/better_ipaddr/methods.rb, line 140
def cidr(cidr: nil, full: false)
  better_to_s(cidr: true, full: full)
end
cover?(other) click to toggle source

Test whether or not this address completely encloses the other address.

# File lib/better_ipaddr/methods.rb, line 146
def cover?(other)
  first <= other.first && other.last <= last
end
each() { |self| ... } click to toggle source

@overload each

Return an enumerator with the behavior described above.
@return [Enumerator]
# File lib/better_ipaddr/methods.rb, line 161
def each
  if block_given?
    (0...size).each do |offset|
      yield self[offset]
    end
    self
  else
    enum_for(:each)
  end
end
first() click to toggle source
# File lib/better_ipaddr/methods.rb, line 181
def first
  self[0]
end
grow(shift) click to toggle source

Return a new address with the prefix length reduced by the given amount. The new address will cover the original address. @param shift [Integer] the decrease in the prefix length @return [IPAddr]

# File lib/better_ipaddr/methods.rb, line 190
def grow(shift)
  mask(prefix_length - shift)
end
hash() click to toggle source

The first host address in the network. @return [IPAddr]

# File lib/better_ipaddr/methods.rb, line 175
def hash
  # see https://github.com/jruby/jruby/issues/4460
  # remove this override when specs still pass without it
  [self.class, @addr, @mask_addr, @family].hash
end
host?() click to toggle source

Return true if the address represents a host (i.e., only one address).

# File lib/better_ipaddr/methods.rb, line 196
def host?
  prefix_length >= address_family_bit_length
end
inspect(cidr: true, full: false) click to toggle source

Emits a snippet of ruby code that can be copied and pasted. Uses the string representation of the address, by default in CIDR notation, instead of the harder-to-read mask notation.

@return String

# File lib/better_ipaddr/kernel_method.rb, line 24
def inspect(cidr: true, full: false)
  "#{self.class}['#{better_to_s(cidr: cidr, full: full)}']"
end
last() click to toggle source

Return the last address in the network, which by convention is the broadcast address in IP networks. @return [IPAddr]

# File lib/better_ipaddr/methods.rb, line 204
def last
  self[-1]
end
Also aliased as: broadcast
netmask() click to toggle source

Return the string representation of the netmask. @return [String]

# File lib/better_ipaddr/methods.rb, line 26
def netmask
  self.class[mask_addr].to_s
end
overlap?(other) click to toggle source

Test whether or not two networks have any addresses in common (i.e., if either entirely encloses the other).

# File lib/better_ipaddr/methods.rb, line 213
def overlap?(other)
  cover?(other) || other.cover?(self)
end
prefix()
Alias for: prefix_length
prefix_length() click to toggle source

Return the prefix length. A more efficient form of this method is available to the specialized IPAddr child classes. @return [Integer]

# File lib/better_ipaddr/methods.rb, line 222
def prefix_length
  NETMASK_TO_PREFIX_LENGTH[family][mask_addr]
end
Also aliased as: prefix, prefixlen
prefixlen()
Alias for: prefix_length
shrink(shift) click to toggle source

Return a new address with the prefix length increased by the given amount. The old address will cover the new address. @param shift [Integer] the increase in the prefix length @return [Boolean]

# File lib/better_ipaddr/methods.rb, line 234
def shrink(shift)
  mask(prefix_length + shift)
end
size() click to toggle source

Return the number of host addresses representable by the network given its size. @return [Integer]

# File lib/better_ipaddr/methods.rb, line 242
def size
  2**(address_family_bit_length - prefix_length)
end
summarize_with(other) click to toggle source

Returns a summary address if the two networks can be combined into a single network without covering any other networks. Returns nil if the two networks can't be combined this way. @return [IPAddr?]

# File lib/better_ipaddr/methods.rb, line 251
def summarize_with(other)
  if other.nil?
    nil
  elsif cover?(other)
    self
  elsif other.cover?(self)
    other
  elsif other.grow(1) == grow(1)
    grow(1)
  end
end
to_range() { |first)..(yield last)| ... } click to toggle source

Return a range representing the network. A block can be given to specify a conversion procedure, for example to convert the first and last addresses to integers before building the range. @return [Range(IPAddr)]

# File lib/better_ipaddr/methods.rb, line 268
def to_range
  if block_given?
    (yield first)..(yield last)
  else
    first..last
  end
end
wildcard() click to toggle source

Return a wildcard mask representing the network. @return [IPAddr]

# File lib/better_ipaddr/methods.rb, line 279
def wildcard
  _to_string(@mask_addr.to_i ^ (2**address_family_bit_length - 1))
end