diff --git a/lib/ipaddr.rb b/lib/ipaddr.rb index eb018a5..54c21c8 100644 --- a/lib/ipaddr.rb +++ b/lib/ipaddr.rb @@ -374,6 +374,11 @@ def succ return self.clone.set(@addr + 1, @family) end + # Returns a new ipaddr without a mask + def unmasked + self.class.new(@unmasked_addr, @family) + end + # Compares the ipaddr with another. def <=>(other) other = coerce_other(other) @@ -504,6 +509,7 @@ def set(addr, *family) raise AddressFamilyError, "unsupported address family" end @addr = addr + @unmasked_addr = addr if family[0] @family = family[0] end @@ -616,6 +622,7 @@ def initialize(addr = '::', family = Socket::AF_UNSPEC) if family != Socket::AF_UNSPEC && @family != family raise AddressFamilyError, "address family mismatch" end + @unmasked_addr = @addr if prefixlen mask!(prefixlen) else diff --git a/test/test_ipaddr.rb b/test/test_ipaddr.rb index edfdbd2..52ccaef 100644 --- a/test/test_ipaddr.rb +++ b/test/test_ipaddr.rb @@ -422,4 +422,13 @@ def test_hash assert_equal(true, s.include?(a5)) assert_equal(true, s.include?(a6)) end + + def test_unmasked + assert_equal(IPAddr.new("1.2.3.4"), IPAddr.new("1.2.3.4").unmasked) + assert_equal(IPAddr.new("1.2.3.4"), IPAddr.new("1.2.3.4/8").unmasked) + assert_equal(IPAddr.new("0001:0002:0000:0000:0000:0000:0000:0003"), IPAddr.new("1:2::3").unmasked) + assert_equal(IPAddr.new("0001:0002:0000:0000:0000:0000:0000:0003"), IPAddr.new("1:2::3/16").unmasked) + assert_equal(IPAddr.new("1.2.3.4"), IPAddr.new(IPAddr.new("1.2.3.4").to_i, Socket::AF_INET).unmasked) + assert_equal(IPAddr.new("1.2.3.5"), IPAddr.new("1.2.3.4").succ.mask(8).unmasked) + end end