From 45215f4cb22229fa82be6977e26a1a5fc20e1609 Mon Sep 17 00:00:00 2001 From: Aljoscha Meyer Date: Thu, 25 Mar 2021 16:47:52 +0100 Subject: [PATCH 1/2] Implement Arbitrary for nonzero integers --- src/lib.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 213614d..a83a5f9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,6 +37,8 @@ pub mod size_hint; use core::cell::{Cell, RefCell, UnsafeCell}; use core::iter; use core::mem; +use core::num::{NonZeroI8, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI128, NonZeroIsize}; +use core::num::{NonZeroU8, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU128, NonZeroUsize}; use core::ops::{Range, RangeBounds, RangeFrom, RangeInclusive, RangeTo, RangeToInclusive}; use core::str; use core::time::Duration; @@ -1010,6 +1012,37 @@ impl<'a, A: Arbitrary<'a>> Arbitrary<'a> for ::std::num::Wrapping { } } +macro_rules! implement_nonzero_int { + ($nonzero:ty, $int:ty) => { + impl<'a> Arbitrary<'a> for $nonzero { + fn arbitrary(u: &mut Unstructured<'a>) -> Result { + match Self::new(<$int as Arbitrary<'a>>::arbitrary(u)?) { + Some(n) => Ok(n), + None => Err(Error::IncorrectFormat), + } + } + + #[inline] + fn size_hint(depth: usize) -> (usize, Option) { + <$int as Arbitrary<'a>>::size_hint(depth) + } + } + } +} + +implement_nonzero_int!(NonZeroI8, i8); +implement_nonzero_int!(NonZeroI16, i16); +implement_nonzero_int!(NonZeroI32, i32); +implement_nonzero_int!(NonZeroI64, i64); +implement_nonzero_int!(NonZeroI128, i128); +implement_nonzero_int!(NonZeroIsize, isize); +implement_nonzero_int!(NonZeroU8, u8); +implement_nonzero_int!(NonZeroU16, u16); +implement_nonzero_int!(NonZeroU32, u32); +implement_nonzero_int!(NonZeroU64, u64); +implement_nonzero_int!(NonZeroU128, u128); +implement_nonzero_int!(NonZeroUsize, usize); + #[cfg(test)] mod test { use super::*; From 4edc0c3f38a40ea3bcd59dcf8a55f5a272b26db3 Mon Sep 17 00:00:00 2001 From: Aljoscha Meyer Date: Thu, 25 Mar 2021 17:05:48 +0100 Subject: [PATCH 2/2] Appease the linter --- src/lib.rs | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a83a5f9..339505b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,8 +37,8 @@ pub mod size_hint; use core::cell::{Cell, RefCell, UnsafeCell}; use core::iter; use core::mem; -use core::num::{NonZeroI8, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI128, NonZeroIsize}; -use core::num::{NonZeroU8, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU128, NonZeroUsize}; +use core::num::{NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize}; +use core::num::{NonZeroU128, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize}; use core::ops::{Range, RangeBounds, RangeFrom, RangeInclusive, RangeTo, RangeToInclusive}; use core::str; use core::time::Duration; @@ -1027,21 +1027,21 @@ macro_rules! implement_nonzero_int { <$int as Arbitrary<'a>>::size_hint(depth) } } - } + }; } -implement_nonzero_int!(NonZeroI8, i8); -implement_nonzero_int!(NonZeroI16, i16); -implement_nonzero_int!(NonZeroI32, i32); -implement_nonzero_int!(NonZeroI64, i64); -implement_nonzero_int!(NonZeroI128, i128); -implement_nonzero_int!(NonZeroIsize, isize); -implement_nonzero_int!(NonZeroU8, u8); -implement_nonzero_int!(NonZeroU16, u16); -implement_nonzero_int!(NonZeroU32, u32); -implement_nonzero_int!(NonZeroU64, u64); -implement_nonzero_int!(NonZeroU128, u128); -implement_nonzero_int!(NonZeroUsize, usize); +implement_nonzero_int! { NonZeroI8, i8 } +implement_nonzero_int! { NonZeroI16, i16 } +implement_nonzero_int! { NonZeroI32, i32 } +implement_nonzero_int! { NonZeroI64, i64 } +implement_nonzero_int! { NonZeroI128, i128 } +implement_nonzero_int! { NonZeroIsize, isize } +implement_nonzero_int! { NonZeroU8, u8 } +implement_nonzero_int! { NonZeroU16, u16 } +implement_nonzero_int! { NonZeroU32, u32 } +implement_nonzero_int! { NonZeroU64, u64 } +implement_nonzero_int! { NonZeroU128, u128 } +implement_nonzero_int! { NonZeroUsize, usize } #[cfg(test)] mod test {