module BetterIpaddr::InstanceMethods
Methods included in IPAddr::Base
and its descendants
Attributes
Return the magic number representing the address family. @return [Integer]
Return the integer representation of the netmask. @return [Integer]
Public Class Methods
# 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
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
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
@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
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
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
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
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
# 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
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
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
@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
# File lib/better_ipaddr/methods.rb, line 181 def first self[0] end
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
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
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
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
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
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
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
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
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
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
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
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
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