Skip to content

Commit 27fc7e5

Browse files
committed
Implement PartialOrd and Ord for SocketAddr*
1 parent 8453936 commit 27fc7e5

File tree

1 file changed

+146
-1
lines changed

1 file changed

+146
-1
lines changed

src/libstd/net/addr.rs

+146-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::cmp::Ordering;
12
use crate::convert::TryInto;
23
use crate::fmt;
34
use crate::hash;
@@ -36,7 +37,7 @@ use crate::vec;
3637
/// assert_eq!(socket.port(), 8080);
3738
/// assert_eq!(socket.is_ipv4(), true);
3839
/// ```
39-
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
40+
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, PartialOrd, Ord)]
4041
#[stable(feature = "rust1", since = "1.0.0")]
4142
pub enum SocketAddr {
4243
/// An IPv4 socket address.
@@ -653,11 +654,115 @@ impl PartialEq for SocketAddrV6 {
653654
&& self.inner.sin6_scope_id == other.inner.sin6_scope_id
654655
}
655656
}
657+
#[stable(feature = "socketaddr_ordering", since = "1.45.0")]
658+
impl PartialEq<SocketAddrV4> for SocketAddr {
659+
fn eq(&self, other: &SocketAddrV4) -> bool {
660+
match self {
661+
SocketAddr::V4(v4) => v4 == other,
662+
SocketAddr::V6(_) => false,
663+
}
664+
}
665+
}
666+
#[stable(feature = "socketaddr_ordering", since = "1.45.0")]
667+
impl PartialEq<SocketAddrV6> for SocketAddr {
668+
fn eq(&self, other: &SocketAddrV6) -> bool {
669+
match self {
670+
SocketAddr::V4(_) => false,
671+
SocketAddr::V6(v6) => v6 == other,
672+
}
673+
}
674+
}
675+
#[stable(feature = "socketaddr_ordering", since = "1.45.0")]
676+
impl PartialEq<SocketAddr> for SocketAddrV4 {
677+
fn eq(&self, other: &SocketAddr) -> bool {
678+
match other {
679+
SocketAddr::V4(v4) => self == v4,
680+
SocketAddr::V6(_) => false,
681+
}
682+
}
683+
}
684+
#[stable(feature = "socketaddr_ordering", since = "1.45.0")]
685+
impl PartialEq<SocketAddr> for SocketAddrV6 {
686+
fn eq(&self, other: &SocketAddr) -> bool {
687+
match other {
688+
SocketAddr::V4(_) => false,
689+
SocketAddr::V6(v6) => self == v6,
690+
}
691+
}
692+
}
656693
#[stable(feature = "rust1", since = "1.0.0")]
657694
impl Eq for SocketAddrV4 {}
658695
#[stable(feature = "rust1", since = "1.0.0")]
659696
impl Eq for SocketAddrV6 {}
660697

698+
#[stable(feature = "socketaddr_ordering", since = "1.45.0")]
699+
impl PartialOrd for SocketAddrV4 {
700+
fn partial_cmp(&self, other: &SocketAddrV4) -> Option<Ordering> {
701+
Some(self.cmp(other))
702+
}
703+
}
704+
705+
#[stable(feature = "socketaddr_ordering", since = "1.45.0")]
706+
impl PartialOrd<SocketAddr> for SocketAddrV4 {
707+
fn partial_cmp(&self, other: &SocketAddr) -> Option<Ordering> {
708+
match other {
709+
SocketAddr::V4(v4) => self.partial_cmp(v4),
710+
SocketAddr::V6(_) => Some(Ordering::Less),
711+
}
712+
}
713+
}
714+
715+
#[stable(feature = "socketaddr_ordering", since = "1.45.0")]
716+
impl PartialOrd<SocketAddrV4> for SocketAddr {
717+
fn partial_cmp(&self, other: &SocketAddrV4) -> Option<Ordering> {
718+
match self {
719+
SocketAddr::V4(v4) => v4.partial_cmp(other),
720+
SocketAddr::V6(_) => Some(Ordering::Greater),
721+
}
722+
}
723+
}
724+
725+
#[stable(feature = "socketaddr_ordering", since = "1.45.0")]
726+
impl PartialOrd for SocketAddrV6 {
727+
fn partial_cmp(&self, other: &SocketAddrV6) -> Option<Ordering> {
728+
Some(self.cmp(other))
729+
}
730+
}
731+
732+
#[stable(feature = "socketaddr_ordering", since = "1.45.0")]
733+
impl PartialOrd<SocketAddr> for SocketAddrV6 {
734+
fn partial_cmp(&self, other: &SocketAddr) -> Option<Ordering> {
735+
match other {
736+
SocketAddr::V4(_) => Some(Ordering::Greater),
737+
SocketAddr::V6(v6) => self.partial_cmp(v6),
738+
}
739+
}
740+
}
741+
742+
#[stable(feature = "socketaddr_ordering", since = "1.45.0")]
743+
impl PartialOrd<SocketAddrV6> for SocketAddr {
744+
fn partial_cmp(&self, other: &SocketAddrV6) -> Option<Ordering> {
745+
match self {
746+
SocketAddr::V4(_) => Some(Ordering::Less),
747+
SocketAddr::V6(v6) => v6.partial_cmp(other),
748+
}
749+
}
750+
}
751+
752+
#[stable(feature = "socketaddr_ordering", since = "1.45.0")]
753+
impl Ord for SocketAddrV4 {
754+
fn cmp(&self, other: &SocketAddrV4) -> Ordering {
755+
self.ip().cmp(other.ip()).then(self.port().cmp(&other.port()))
756+
}
757+
}
758+
759+
#[stable(feature = "socketaddr_ordering", since = "1.45.0")]
760+
impl Ord for SocketAddrV6 {
761+
fn cmp(&self, other: &SocketAddrV6) -> Ordering {
762+
self.ip().cmp(other.ip()).then(self.port().cmp(&other.port()))
763+
}
764+
}
765+
661766
#[stable(feature = "rust1", since = "1.0.0")]
662767
impl hash::Hash for SocketAddrV4 {
663768
fn hash<H: hash::Hasher>(&self, s: &mut H) {
@@ -1102,4 +1207,44 @@ mod tests {
11021207
assert!(!v6.is_ipv4());
11031208
assert!(v6.is_ipv6());
11041209
}
1210+
1211+
#[test]
1212+
fn compare() {
1213+
let v4_1 = "224.120.45.1:23456".parse::<SocketAddrV4>().unwrap();
1214+
let v4_2 = "224.210.103.5:12345".parse::<SocketAddrV4>().unwrap();
1215+
let v4_3 = "224.210.103.5:23456".parse::<SocketAddrV4>().unwrap();
1216+
let v6_1 = "[2001:db8:f00::1002]:1234".parse::<SocketAddrV6>().unwrap();
1217+
let v6_2 = "[2001:db8:f00::2001]:1234".parse::<SocketAddrV6>().unwrap();
1218+
let v6_3 = "[2001:db8:f00::2001]:2345".parse::<SocketAddrV6>().unwrap();
1219+
1220+
// equality
1221+
assert_eq!(v4_1, SocketAddr::V4(v4_1));
1222+
assert_eq!(v6_1, SocketAddr::V6(v6_1));
1223+
assert_eq!(SocketAddr::V4(v4_1), SocketAddr::V4(v4_1));
1224+
assert_eq!(SocketAddr::V6(v6_1), SocketAddr::V6(v6_1));
1225+
assert!(v4_1 != SocketAddr::V6(v6_1));
1226+
assert!(v6_1 != SocketAddr::V4(v4_1));
1227+
assert!(v4_1 != v4_2);
1228+
assert!(v6_1 != v6_2);
1229+
1230+
// compare different addresses
1231+
assert!(v4_1 < v4_2);
1232+
assert!(v4_1 < SocketAddr::V4(v4_2));
1233+
assert!(SocketAddr::V4(v4_1) < v4_2);
1234+
assert!(SocketAddr::V4(v4_1) < SocketAddr::V4(v4_2));
1235+
assert!(v6_1 < v6_2);
1236+
assert!(v6_1 < SocketAddr::V6(v6_2));
1237+
assert!(SocketAddr::V6(v6_1) < v6_2);
1238+
assert!(SocketAddr::V6(v6_1) < SocketAddr::V6(v6_2));
1239+
1240+
// compare the same address with different ports
1241+
assert!(v4_2 < v4_3);
1242+
assert!(v4_2 < SocketAddr::V4(v4_3));
1243+
assert!(SocketAddr::V4(v4_2) < v4_3);
1244+
assert!(SocketAddr::V4(v4_2) < SocketAddr::V4(v4_3));
1245+
assert!(v6_2 < v6_3);
1246+
assert!(v6_2 < SocketAddr::V6(v6_3));
1247+
assert!(SocketAddr::V6(v6_2) < v6_3);
1248+
assert!(SocketAddr::V6(v6_2) < SocketAddr::V6(v6_3));
1249+
}
11051250
}

0 commit comments

Comments
 (0)