|
| 1 | +use crate::cmp::Ordering; |
1 | 2 | use crate::convert::TryInto;
|
2 | 3 | use crate::fmt;
|
3 | 4 | use crate::hash;
|
@@ -36,7 +37,7 @@ use crate::vec;
|
36 | 37 | /// assert_eq!(socket.port(), 8080);
|
37 | 38 | /// assert_eq!(socket.is_ipv4(), true);
|
38 | 39 | /// ```
|
39 |
| -#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] |
| 40 | +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, PartialOrd, Ord)] |
40 | 41 | #[stable(feature = "rust1", since = "1.0.0")]
|
41 | 42 | pub enum SocketAddr {
|
42 | 43 | /// An IPv4 socket address.
|
@@ -653,11 +654,115 @@ impl PartialEq for SocketAddrV6 {
|
653 | 654 | && self.inner.sin6_scope_id == other.inner.sin6_scope_id
|
654 | 655 | }
|
655 | 656 | }
|
| 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 | +} |
656 | 693 | #[stable(feature = "rust1", since = "1.0.0")]
|
657 | 694 | impl Eq for SocketAddrV4 {}
|
658 | 695 | #[stable(feature = "rust1", since = "1.0.0")]
|
659 | 696 | impl Eq for SocketAddrV6 {}
|
660 | 697 |
|
| 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 | + |
661 | 766 | #[stable(feature = "rust1", since = "1.0.0")]
|
662 | 767 | impl hash::Hash for SocketAddrV4 {
|
663 | 768 | fn hash<H: hash::Hasher>(&self, s: &mut H) {
|
@@ -1102,4 +1207,44 @@ mod tests {
|
1102 | 1207 | assert!(!v6.is_ipv4());
|
1103 | 1208 | assert!(v6.is_ipv6());
|
1104 | 1209 | }
|
| 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 | + } |
1105 | 1250 | }
|
0 commit comments