Skip to content

Commit 1081c2e

Browse files
authored
Merge pull request #47 from skipkayhil/optimize-include
Improve performance of include? by 5-10x
2 parents 1dfa2a8 + b8d0323 commit 1081c2e

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

lib/ipaddr.rb

+16-14
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,7 @@ def mask(prefixlen)
176176
def include?(other)
177177
other = coerce_other(other)
178178
return false unless other.family == family
179-
range = to_range
180-
other = other.to_range
181-
range.begin <= other.begin && range.end >= other.end
179+
begin_addr <= other.begin_addr && end_addr >= other.end_addr
182180
end
183181
alias === include?
184182

@@ -406,17 +404,6 @@ def hash
406404

407405
# Creates a Range object for the network address.
408406
def to_range
409-
begin_addr = (@addr & @mask_addr)
410-
411-
case @family
412-
when Socket::AF_INET
413-
end_addr = (@addr | (IN4MASK ^ @mask_addr))
414-
when Socket::AF_INET6
415-
end_addr = (@addr | (IN6MASK ^ @mask_addr))
416-
else
417-
raise AddressFamilyError, "unsupported address family"
418-
end
419-
420407
self.class.new(begin_addr, @family)..self.class.new(end_addr, @family)
421408
end
422409

@@ -497,6 +484,21 @@ def zone_id=(zid)
497484

498485
protected
499486

487+
def begin_addr
488+
@addr & @mask_addr
489+
end
490+
491+
def end_addr
492+
case @family
493+
when Socket::AF_INET
494+
@addr | (IN4MASK ^ @mask_addr)
495+
when Socket::AF_INET6
496+
@addr | (IN6MASK ^ @mask_addr)
497+
else
498+
raise AddressFamilyError, "unsupported address family"
499+
end
500+
end
501+
500502
# Set +@addr+, the internal stored ip address, to given +addr+. The
501503
# parameter +addr+ is validated using the first +family+ member,
502504
# which is +Socket::AF_INET+ or +Socket::AF_INET6+.

0 commit comments

Comments
 (0)