summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--lib/ipaddr.rb31
2 files changed, 43 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 5d2df550ed..5b76d4b77a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+Fri Oct 5 03:25:51 2007 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/ipaddr.rb (<=>): Implement IPAddr#<=> and make IPAddr
+ comparable.
+
+ * lib/ipaddr.rb (succ): Implement IPAddr#succ. You can now create
+ a range between two IPAddr's, which (Range) object is
+ enumeratable.
+
+ * lib/ipaddr.rb (to_range): A new method to create a Range object
+ for the (network) address.
+
Fri Oct 5 03:14:45 2007 Akinori MUSHA <knu@iDaemons.org>
* lib/ipaddr.rb (coerce_other): Support type coercion and make &,
diff --git a/lib/ipaddr.rb b/lib/ipaddr.rb
index 336c5e1b21..56b906c805 100644
--- a/lib/ipaddr.rb
+++ b/lib/ipaddr.rb
@@ -312,6 +312,37 @@ class IPAddr
return _reverse + ".ip6.int"
end
+ # Returns the successor to the ipaddr.
+ def succ
+ return self.clone.set(@addr + 1, @family)
+ end
+
+ # Compares the ipaddr with another.
+ def <=>(other)
+ other = coerce_other(other)
+
+ return nil if other.family != @family
+
+ return @addr <=> other.to_i
+ end
+ include Comparable
+
+ # Creates a Range object for the network address.
+ def to_range
+ begin_addr = (@addr & @mask_addr)
+
+ case @family
+ when Socket::AF_INET
+ end_addr = (@addr | (IN4MASK ^ @mask_addr))
+ when Socket::AF_INET6
+ end_addr = (@addr | (IN6MASK ^ @mask_addr))
+ else
+ raise "unsupported address family"
+ end
+
+ return clone.set(begin_addr, @family)..clone.set(end_addr, @family)
+ end
+
# Returns a string containing a human-readable representation of the
# ipaddr. ("#<IPAddr: family:address/mask>")
def inspect