Made the IpAddress comparable, which is the front door to the type IpRange.

Signed-off-by: Adam Rocska <adam.rocska@adams.solutions>
This commit is contained in:
Adam Rocska 2020-06-07 21:33:46 +02:00
parent d646b47877
commit 6abcb9669a
2 changed files with 42 additions and 0 deletions

View File

@ -190,3 +190,28 @@ public func ==(lhs: IpAddress, rhs: IpAddress) -> Bool {
case (.v6, .v4): return IpAddress.v6(rhs) == lhs case (.v6, .v4): return IpAddress.v6(rhs) == lhs
} }
} }
extension IpAddress: Comparable {
public static func <(lhs: IpAddress, rhs: IpAddress) -> Bool {
let left: Data
let right: Data
switch (lhs, rhs) {
case (.v4, .v6):
left = IpAddress.v6(lhs).data
right = rhs.data
case (.v6, .v4):
left = lhs.data
right = IpAddress.v6(rhs).data
default:
left = lhs.data
right = rhs.data
}
var rightSideIndex = right.startIndex
for leftByte in left {
defer { rightSideIndex = right.index(after: rightSideIndex) }
let rightByte = right[rightSideIndex]
if leftByte < rightByte { return true }
}
return false
}
}

View File

@ -234,4 +234,21 @@ class IpAddressTest: XCTestCase {
XCTAssertEqual("192.168.6.1", IpAddress("192.168.6.1").description) XCTAssertEqual("192.168.6.1", IpAddress("192.168.6.1").description)
} }
func testComparability() {
XCTAssertGreaterThan(IpAddress("192.168.0.1"), IpAddress("192.168.0.0"))
XCTAssertGreaterThan(IpAddress("192.168.1.0"), IpAddress("192.168.0.0"))
XCTAssertGreaterThan(IpAddress("192.169.0.0"), IpAddress("192.168.0.0"))
XCTAssertGreaterThan(IpAddress("193.168.0.0"), IpAddress("192.168.0.0"))
XCTAssertGreaterThan(IpAddress("193.168.0.0"), IpAddress("80.99.18.166"))
XCTAssertLessThan(IpAddress("192.168.0.0"), IpAddress("192.168.0.1"))
XCTAssertLessThan(IpAddress("192.168.0.0"), IpAddress("192.168.1.0"))
XCTAssertLessThan(IpAddress("192.168.0.0"), IpAddress("192.169.0.0"))
XCTAssertLessThan(IpAddress("192.168.0.0"), IpAddress("193.168.0.0"))
XCTAssertLessThan(IpAddress("80.99.18.166"), IpAddress("193.168.0.0"))
XCTAssertGreaterThan(IpAddress("0000:0000:0000:0000:0000:ffff:5063:12a7"), IpAddress("::ffff:80.99.18.166"))
XCTAssertGreaterThan(IpAddress("0000:0000:0000:0000:0000:ffff:5063:12a7"), IpAddress("80.99.18.166"))
XCTAssertLessThan(IpAddress("::ffff:80.99.18.166"), IpAddress("0000:0000:0000:0000:0000:ffff:5063:12a7"))
XCTAssertLessThan(IpAddress("80.99.18.166"), IpAddress("0000:0000:0000:0000:0000:ffff:5063:12a7"))
}
} }