From a1966d40898faba1136a2e75d85a8602a5a7e7f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lie=20Alvet?= Date: Thu, 21 Dec 2023 16:03:04 +0100 Subject: [PATCH] Add const unsafe `new_unchecked` to `Ipv4Network` & `Ipv6Network` (#185) * Add const unsafe `new_unchecked` to `Ipv4Network` & `Ipv6Network` * New tests added for `new_unchecked` functions --- src/ipv4.rs | 14 ++++++++++++++ src/ipv6.rs | 15 +++++++++++++++ src/lib.rs | 1 - 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/ipv4.rs b/src/ipv4.rs index 7627894..3722fd0 100644 --- a/src/ipv4.rs +++ b/src/ipv4.rs @@ -74,6 +74,12 @@ impl Ipv4Network { } } + /// Constructs without checking prefix a new `Ipv4Network` from any `Ipv4Addr, + /// and a prefix denoting the network size. + pub const unsafe fn new_unchecked(addr: Ipv4Addr, prefix: u8) -> Ipv4Network { + Ipv4Network { addr, prefix } + } + /// Constructs a new `Ipv4Network` from a network address and a network mask. /// /// If the netmask is not valid this will return an `IpNetworkError::InvalidPrefix`. @@ -362,6 +368,14 @@ mod test { assert!(net.is_err()); } + #[test] + fn create_unchecked_v4() { + let cidr = unsafe { Ipv4Network::new_unchecked(Ipv4Addr::new(77, 88, 21, 11), 24) }; + assert_eq!(cidr.prefix(), 24); + let cidr = unsafe { Ipv4Network::new_unchecked(Ipv4Addr::new(0, 0, 0, 0), 33) }; + assert_eq!(cidr.prefix(), 33); + } + #[test] fn parse_v4_24bit() { let cidr: Ipv4Network = "127.1.0.0/24".parse().unwrap(); diff --git a/src/ipv6.rs b/src/ipv6.rs index 645f9a1..8c37817 100644 --- a/src/ipv6.rs +++ b/src/ipv6.rs @@ -85,6 +85,12 @@ impl Ipv6Network { } } + /// Constructs without checking prefix a new `Ipv6Network` from any `Ipv6Addr, + /// and a prefix denoting the network size. + pub const unsafe fn new_unchecked(addr: Ipv6Addr, prefix: u8) -> Ipv6Network { + Ipv6Network { addr, prefix } + } + /// Constructs a new `Ipv6Network` from a network address and a network mask. /// /// If the netmask is not valid this will return an `IpNetworkError::InvalidPrefix`. @@ -410,6 +416,15 @@ mod test { assert!(cidr.is_err()); } + #[test] + fn create_unchecked_v6() { + let cidr = unsafe { Ipv6Network::new_unchecked(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 24) }; + assert_eq!(cidr.prefix(), 24); + let cidr = + unsafe { Ipv6Network::new_unchecked(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 129) }; + assert_eq!(cidr.prefix(), 129); + } + #[test] fn parse_v6() { let cidr: Ipv6Network = "::1/0".parse().unwrap(); diff --git a/src/lib.rs b/src/lib.rs index 4931c0a..48df9c0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,7 +3,6 @@ #![crate_type = "lib"] #![deny( missing_debug_implementations, - unsafe_code, unused_extern_crates, unused_import_braces )]