Skip to content

Commit 78b4f53

Browse files
committed
Added IPAddr#+/-
1 parent 036836d commit 78b4f53

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

lib/ipaddr.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,16 @@ def ~
151151
return self.clone.set(addr_mask(~@addr))
152152
end
153153

154+
# Returns a new ipaddr greater than the original address by offset
155+
def +(offset)
156+
self.clone.set(@addr + offset, @family)
157+
end
158+
159+
# Returns a new ipaddr less than the original address by offset
160+
def -(offset)
161+
self.clone.set(@addr - offset, @family)
162+
end
163+
154164
# Returns true if two ipaddrs are equal.
155165
def ==(other)
156166
other = coerce_other(other)

test/test_ipaddr.rb

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,46 @@ def test_carrot
385385
assert_equal("::", @in6_addr_any.to_s)
386386
end
387387

388+
def test_plus
389+
a = IPAddr.new("192.168.1.10")
390+
assert_equal("192.168.1.20", (a + 10).to_s)
391+
392+
a = IPAddr.new("0.0.0.0")
393+
assert_equal("0.0.0.10", (a + 10).to_s)
394+
395+
a = IPAddr.new("255.255.255.255")
396+
assert_raise(IPAddr::InvalidAddressError) { a + 10 }
397+
398+
a = IPAddr.new("3ffe:505:2::a")
399+
assert_equal("3ffe:505:2::14", (a + 10).to_s)
400+
401+
a = IPAddr.new("::")
402+
assert_equal("::a", (a + 10).to_s)
403+
404+
a = IPAddr.new("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")
405+
assert_raise(IPAddr::InvalidAddressError) { a + 10 }
406+
end
407+
408+
def test_minus
409+
a = IPAddr.new("192.168.1.10")
410+
assert_equal("192.168.1.0", (a - 10).to_s)
411+
412+
a = IPAddr.new("0.0.0.0")
413+
assert_raise(IPAddr::InvalidAddressError) { a - 10 }
414+
415+
a = IPAddr.new("255.255.255.255")
416+
assert_equal("255.255.255.245", (a - 10).to_s)
417+
418+
a = IPAddr.new("3ffe:505:2::a")
419+
assert_equal("3ffe:505:2::", (a - 10).to_s)
420+
421+
a = IPAddr.new("::")
422+
assert_raise(IPAddr::InvalidAddressError) { a - 10 }
423+
424+
a = IPAddr.new("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")
425+
assert_equal("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff5", (a - 10).to_s)
426+
end
427+
388428
def test_equal
389429
assert_equal(true, @a == IPAddr.new("3FFE:505:2::"))
390430
assert_equal(true, @a == IPAddr.new("3ffe:0505:0002::"))

0 commit comments

Comments
 (0)