Skip to content

Commit 1a96a29

Browse files
authored
Merge pull request #71 from taketo1113/add-plus-minus
Add IPAddr#+/-
2 parents 8a9a7ae + 347ff7b commit 1a96a29

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

lib/ipaddr.rb

+10
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

+40
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,46 @@ def test_carrot
399399
assert_equal("::", @in6_addr_any.to_s)
400400
end
401401

402+
def test_plus
403+
a = IPAddr.new("192.168.1.10")
404+
assert_equal("192.168.1.20", (a + 10).to_s)
405+
406+
a = IPAddr.new("0.0.0.0")
407+
assert_equal("0.0.0.10", (a + 10).to_s)
408+
409+
a = IPAddr.new("255.255.255.255")
410+
assert_raise(IPAddr::InvalidAddressError) { a + 10 }
411+
412+
a = IPAddr.new("3ffe:505:2::a")
413+
assert_equal("3ffe:505:2::14", (a + 10).to_s)
414+
415+
a = IPAddr.new("::")
416+
assert_equal("::a", (a + 10).to_s)
417+
418+
a = IPAddr.new("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")
419+
assert_raise(IPAddr::InvalidAddressError) { a + 10 }
420+
end
421+
422+
def test_minus
423+
a = IPAddr.new("192.168.1.10")
424+
assert_equal("192.168.1.0", (a - 10).to_s)
425+
426+
a = IPAddr.new("0.0.0.0")
427+
assert_raise(IPAddr::InvalidAddressError) { a - 10 }
428+
429+
a = IPAddr.new("255.255.255.255")
430+
assert_equal("255.255.255.245", (a - 10).to_s)
431+
432+
a = IPAddr.new("3ffe:505:2::a")
433+
assert_equal("3ffe:505:2::", (a - 10).to_s)
434+
435+
a = IPAddr.new("::")
436+
assert_raise(IPAddr::InvalidAddressError) { a - 10 }
437+
438+
a = IPAddr.new("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")
439+
assert_equal("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff5", (a - 10).to_s)
440+
end
441+
402442
def test_equal
403443
assert_equal(true, @a == IPAddr.new("3FFE:505:2::"))
404444
assert_equal(true, @a == IPAddr.new("3ffe:0505:0002::"))

0 commit comments

Comments
 (0)