Skip to content

Commit 74c42ac

Browse files
committed
Auto merge of #38464 - clarcharr:ip_cmp, r=sfackler
PartialEq and PartialOrd between IpAddr and Ipv[46]Addr. PartialEq was rather useful, so, I figured that I'd implement it. I added PartialOrd for good measure.
2 parents 2263d1b + 9301e2e commit 74c42ac

File tree

1 file changed

+100
-4
lines changed

1 file changed

+100
-4
lines changed

src/libstd/net/ip.rs

+100-4
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,26 @@ impl PartialEq for Ipv4Addr {
565565
}
566566
}
567567

568+
#[stable(feature = "ip_cmp", since = "1.15.0")]
569+
impl PartialEq<Ipv4Addr> for IpAddr {
570+
fn eq(&self, other: &Ipv4Addr) -> bool {
571+
match *self {
572+
IpAddr::V4(ref v4) => v4 == other,
573+
IpAddr::V6(_) => false,
574+
}
575+
}
576+
}
577+
578+
#[stable(feature = "ip_cmp", since = "1.15.0")]
579+
impl PartialEq<IpAddr> for Ipv4Addr {
580+
fn eq(&self, other: &IpAddr) -> bool {
581+
match *other {
582+
IpAddr::V4(ref v4) => self == v4,
583+
IpAddr::V6(_) => false,
584+
}
585+
}
586+
}
587+
568588
#[stable(feature = "rust1", since = "1.0.0")]
569589
impl Eq for Ipv4Addr {}
570590

@@ -582,6 +602,26 @@ impl PartialOrd for Ipv4Addr {
582602
}
583603
}
584604

605+
#[stable(feature = "ip_cmp", since = "1.15.0")]
606+
impl PartialOrd<Ipv4Addr> for IpAddr {
607+
fn partial_cmp(&self, other: &Ipv4Addr) -> Option<Ordering> {
608+
match *self {
609+
IpAddr::V4(ref v4) => v4.partial_cmp(other),
610+
IpAddr::V6(_) => Some(Ordering::Greater),
611+
}
612+
}
613+
}
614+
615+
#[stable(feature = "ip_cmp", since = "1.15.0")]
616+
impl PartialOrd<IpAddr> for Ipv4Addr {
617+
fn partial_cmp(&self, other: &IpAddr) -> Option<Ordering> {
618+
match *other {
619+
IpAddr::V4(ref v4) => self.partial_cmp(v4),
620+
IpAddr::V6(_) => Some(Ordering::Less),
621+
}
622+
}
623+
}
624+
585625
#[stable(feature = "rust1", since = "1.0.0")]
586626
impl Ord for Ipv4Addr {
587627
fn cmp(&self, other: &Ipv4Addr) -> Ordering {
@@ -1040,6 +1080,26 @@ impl PartialEq for Ipv6Addr {
10401080
}
10411081
}
10421082

1083+
#[stable(feature = "ip_cmp", since = "1.15.0")]
1084+
impl PartialEq<IpAddr> for Ipv6Addr {
1085+
fn eq(&self, other: &IpAddr) -> bool {
1086+
match *other {
1087+
IpAddr::V4(_) => false,
1088+
IpAddr::V6(ref v6) => self == v6,
1089+
}
1090+
}
1091+
}
1092+
1093+
#[stable(feature = "ip_cmp", since = "1.15.0")]
1094+
impl PartialEq<Ipv6Addr> for IpAddr {
1095+
fn eq(&self, other: &Ipv6Addr) -> bool {
1096+
match *self {
1097+
IpAddr::V4(_) => false,
1098+
IpAddr::V6(ref v6) => v6 == other,
1099+
}
1100+
}
1101+
}
1102+
10431103
#[stable(feature = "rust1", since = "1.0.0")]
10441104
impl Eq for Ipv6Addr {}
10451105

@@ -1057,6 +1117,26 @@ impl PartialOrd for Ipv6Addr {
10571117
}
10581118
}
10591119

1120+
#[stable(feature = "ip_cmp", since = "1.15.0")]
1121+
impl PartialOrd<Ipv6Addr> for IpAddr {
1122+
fn partial_cmp(&self, other: &Ipv6Addr) -> Option<Ordering> {
1123+
match *self {
1124+
IpAddr::V4(_) => Some(Ordering::Less),
1125+
IpAddr::V6(ref v6) => v6.partial_cmp(other),
1126+
}
1127+
}
1128+
}
1129+
1130+
#[stable(feature = "ip_cmp", since = "1.15.0")]
1131+
impl PartialOrd<IpAddr> for Ipv6Addr {
1132+
fn partial_cmp(&self, other: &IpAddr) -> Option<Ordering> {
1133+
match *other {
1134+
IpAddr::V4(_) => Some(Ordering::Greater),
1135+
IpAddr::V6(ref v6) => self.partial_cmp(v6),
1136+
}
1137+
}
1138+
}
1139+
10601140
#[stable(feature = "rust1", since = "1.0.0")]
10611141
impl Ord for Ipv6Addr {
10621142
fn cmp(&self, other: &Ipv6Addr) -> Ordering {
@@ -1458,10 +1538,26 @@ mod tests {
14581538
}
14591539

14601540
#[test]
1461-
fn ord() {
1462-
assert!(Ipv4Addr::new(100, 64, 3, 3) < Ipv4Addr::new(192, 0, 2, 2));
1463-
assert!("2001:db8:f00::1002".parse::<Ipv6Addr>().unwrap() <
1464-
"2001:db8:f00::2001".parse::<Ipv6Addr>().unwrap());
1541+
fn cmp() {
1542+
let v41 = Ipv4Addr::new(100, 64, 3, 3);
1543+
let v42 = Ipv4Addr::new(192, 0, 2, 2);
1544+
let v61 = "2001:db8:f00::1002".parse::<Ipv6Addr>().unwrap();
1545+
let v62 = "2001:db8:f00::2001".parse::<Ipv6Addr>().unwrap();
1546+
assert!(v41 < v42);
1547+
assert!(v61 < v62);
1548+
1549+
assert_eq!(v41, IpAddr::V4(v41));
1550+
assert_eq!(v61, IpAddr::V6(v61));
1551+
assert!(v41 != IpAddr::V4(v42));
1552+
assert!(v61 != IpAddr::V6(v62));
1553+
1554+
assert!(v41 < IpAddr::V4(v42));
1555+
assert!(v61 < IpAddr::V6(v62));
1556+
assert!(IpAddr::V4(v41) < v42);
1557+
assert!(IpAddr::V6(v61) < v62);
1558+
1559+
assert!(v41 < IpAddr::V6(v61));
1560+
assert!(IpAddr::V4(v41) < v61);
14651561
}
14661562

14671563
#[test]

0 commit comments

Comments
 (0)