From 8b2e334e0e3d3324307c22d37c6620b479eff0f7 Mon Sep 17 00:00:00 2001 From: Clar Charr Date: Thu, 26 Jan 2017 16:10:48 -0500 Subject: [PATCH] Ipv6Addr <-> u128 --- src/libstd/lib.rs | 3 ++- src/libstd/net/ip.rs | 40 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index 9bcecebf693d2..1f3526e1a09ff 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -261,6 +261,8 @@ #![feature(generic_param_attrs)] #![feature(hashmap_hasher)] #![feature(heap_api)] +#![feature(i128)] +#![feature(i128_type)] #![feature(inclusive_range)] #![feature(int_error_internals)] #![feature(integer_atomics)] @@ -304,7 +306,6 @@ #![feature(unwind_attributes)] #![feature(vec_push_all)] #![feature(zero_one)] -#![feature(i128)] #![cfg_attr(test, feature(update_panic_count))] // Explicitly import the prelude. The compiler uses this same unstable attribute diff --git a/src/libstd/net/ip.rs b/src/libstd/net/ip.rs index 7803cf728f2e9..3dc89e390ee20 100644 --- a/src/libstd/net/ip.rs +++ b/src/libstd/net/ip.rs @@ -1149,6 +1149,26 @@ impl FromInner for Ipv6Addr { } } +#[unstable(feature = "i128", issue = "35118")] +impl From for u128 { + fn from(ip: Ipv6Addr) -> u128 { + let ip = ip.segments(); + ((ip[0] as u128) << 112) + ((ip[1] as u128) << 96) + ((ip[2] as u128) << 80) + + ((ip[3] as u128) << 64) + ((ip[4] as u128) << 48) + ((ip[5] as u128) << 32) + + ((ip[6] as u128) << 16) + (ip[7] as u128) + } +} +#[unstable(feature = "i128", issue = "35118")] +impl From for Ipv6Addr { + fn from(ip: u128) -> Ipv6Addr { + Ipv6Addr::new( + (ip >> 112) as u16, (ip >> 96) as u16, (ip >> 80) as u16, + (ip >> 64) as u16, (ip >> 48) as u16, (ip >> 32) as u16, + (ip >> 16) as u16, ip as u16, + ) + } +} + #[stable(feature = "ipv6_from_octets", since = "1.9.0")] impl From<[u8; 16]> for Ipv6Addr { fn from(octets: [u8; 16]) -> Ipv6Addr { @@ -1500,14 +1520,26 @@ mod tests { #[test] fn test_ipv4_to_int() { - let a = Ipv4Addr::new(127, 0, 0, 1); - assert_eq!(u32::from(a), 2130706433); + let a = Ipv4Addr::new(0x11, 0x22, 0x33, 0x44); + assert_eq!(u32::from(a), 0x11223344); } #[test] fn test_int_to_ipv4() { - let a = Ipv4Addr::new(127, 0, 0, 1); - assert_eq!(Ipv4Addr::from(2130706433), a); + let a = Ipv4Addr::new(0x11, 0x22, 0x33, 0x44); + assert_eq!(Ipv4Addr::from(0x11223344), a); + } + + #[test] + fn test_ipv6_to_int() { + let a = Ipv6Addr::new(0x1122, 0x3344, 0x5566, 0x7788, 0x99aa, 0xbbcc, 0xddee, 0xff11); + assert_eq!(u128::from(a), 0x112233445566778899aabbccddeeff11u128); + } + + #[test] + fn test_int_to_ipv6() { + let a = Ipv6Addr::new(0x1122, 0x3344, 0x5566, 0x7788, 0x99aa, 0xbbcc, 0xddee, 0xff11); + assert_eq!(Ipv6Addr::from(0x112233445566778899aabbccddeeff11u128), a); } #[test]