ruby-changes:12673
From: knu <ko1@a...>
Date: Tue, 4 Aug 2009 15:13:00 +0900 (JST)
Subject: [ruby-changes:12673] Ruby:r24388 (trunk): * lib/ipaddr.rb (IPAddr#{eql?,hash}): Add IPAddr#{eql?,hash} so
knu 2009-08-04 15:10:42 +0900 (Tue, 04 Aug 2009) New Revision: 24388 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24388 Log: * lib/ipaddr.rb (IPAddr#{eql?,hash}): Add IPAddr#{eql?,hash} so that an IPAddr object can be used as a hash key, a set element, etc.; suggested by Nick Brown <nick@n...>. Modified files: trunk/ChangeLog trunk/lib/ipaddr.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 24387) +++ ChangeLog (revision 24388) @@ -1,3 +1,9 @@ +Tue Aug 4 15:06:58 2009 Akinori MUSHA <knu@i...> + + * lib/ipaddr.rb (IPAddr#{eql?,hash}): Add IPAddr#{eql?,hash} so + that an IPAddr object can be used as a hash key, a set element, + etc.; suggested by Nick Brown <nick@n...>. + Tue Aug 4 13:07:10 2009 NARUSE, Yui <naruse@r...> * include/ruby/oniguruma.h (ONIG_SYN_WARN_CC_DUP): defined. Index: lib/ipaddr.rb =================================================================== --- lib/ipaddr.rb (revision 24387) +++ lib/ipaddr.rb (revision 24388) @@ -331,6 +331,16 @@ end include Comparable + # Checks equality used by Hash. + def eql?(other) + return self.class == other.class && self.hash == other.hash && self == other + end + + # Returns a hash value used by Hash, Set, and Array classes + def hash + return (@addr.hash << 1) | (ipv4? ? 0 : 1) + end + # Creates a Range object for the network address. def to_range begin_addr = (@addr & @mask_addr) @@ -810,4 +820,29 @@ end + def test_hash + a1 = IPAddr.new('192.168.2.0') + a2 = IPAddr.new('192.168.2.0') + a3 = IPAddr.new('3ffe:505:2::1') + a4 = IPAddr.new('3ffe:505:2::1') + a5 = IPAddr.new('127.0.0.1') + a6 = IPAddr.new('::1') + + h = { a1 => 'ipv4', a2 => 'ipv4', a3 => 'ipv6', a4 => 'ipv6', a5 => 'ipv4', a6 => 'ipv6' } + assert_equal(4, h.size) + assert_equal('ipv4', h[a1]) + assert_equal('ipv4', h[a2]) + assert_equal('ipv6', h[a3]) + assert_equal('ipv6', h[a4]) + + require 'set' + s = Set[a1, a2, a3, a4, a5, a6] + assert_equal(4, s.size) + assert_equal(true, s.include?(a1)) + assert_equal(true, s.include?(a2)) + assert_equal(true, s.include?(a3)) + assert_equal(true, s.include?(a4)) + assert_equal(true, s.include?(a5)) + assert_equal(true, s.include?(a6)) + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/