@@ -134,6 +134,63 @@ macro_rules! from_str_radix_nzint_impl {
134134from_str_radix_nzint_impl ! { NonZeroU8 NonZeroU16 NonZeroU32 NonZeroU64 NonZeroU128 NonZeroUsize
135135 NonZeroI8 NonZeroI16 NonZeroI32 NonZeroI64 NonZeroI128 NonZeroIsize }
136136
137+ // Conversion traits for NonZero integer types to wider NonZero types
138+ macro_rules! impl_nz_from_nz {
139+ ( $Small: ty, $Large: ty, $LargePrimitive: ty, #[ $attr: meta] , $doc: expr) => {
140+ #[ $attr]
141+ #[ doc = $doc]
142+ impl From <$Small> for $Large {
143+ #[ inline]
144+ fn from( small: $Small) -> $Large {
145+ // we already know a NonZero will not contain a zero
146+ unsafe {
147+ <$Large>:: new_unchecked( small. get( ) as $LargePrimitive)
148+ }
149+ }
150+ }
151+ } ;
152+ ( $Small: ty, $Large: ty, $LargePrimitive: ty, #[ $attr: meta] ) => {
153+ impl_nz_from_nz!( $Small,
154+ $Large,
155+ $LargePrimitive,
156+ #[ $attr] ,
157+ concat!( "Converts `" ,
158+ stringify!( $Small) ,
159+ "` to `" ,
160+ stringify!( $Large) ,
161+ "` losslessly.
162+
163+ ```rust
164+ let small = core::num::" , stringify!( $Small) , "::new(5).unwrap();
165+ let big: core::num::" , stringify!( $Large) , " = small.into();
166+ " ) ) ;
167+ }
168+ }
169+
170+ // NonZeroUnsigned -> NonZeroUnsigned wider
171+ impl_nz_from_nz ! { NonZeroU8 , NonZeroU16 , u16 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
172+ impl_nz_from_nz ! { NonZeroU8 , NonZeroU32 , u32 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
173+ impl_nz_from_nz ! { NonZeroU8 , NonZeroU64 , u64 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
174+ impl_nz_from_nz ! { NonZeroU8 , NonZeroU128 , u128 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
175+ impl_nz_from_nz ! { NonZeroU16 , NonZeroU32 , u32 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
176+ impl_nz_from_nz ! { NonZeroU16 , NonZeroU64 , u64 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
177+ impl_nz_from_nz ! { NonZeroU16 , NonZeroU128 , u128 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
178+ impl_nz_from_nz ! { NonZeroU32 , NonZeroU64 , u64 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
179+ impl_nz_from_nz ! { NonZeroU32 , NonZeroU128 , u128 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
180+ impl_nz_from_nz ! { NonZeroU64 , NonZeroU128 , u128 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
181+
182+ // NonZeroSigned -> NonZeroSigned wider
183+ impl_nz_from_nz ! { NonZeroI8 , NonZeroI16 , i16 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
184+ impl_nz_from_nz ! { NonZeroI8 , NonZeroI32 , i32 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
185+ impl_nz_from_nz ! { NonZeroI8 , NonZeroI64 , i64 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
186+ impl_nz_from_nz ! { NonZeroI8 , NonZeroI128 , i128 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
187+ impl_nz_from_nz ! { NonZeroI16 , NonZeroI32 , i32 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
188+ impl_nz_from_nz ! { NonZeroI16 , NonZeroI64 , i64 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
189+ impl_nz_from_nz ! { NonZeroI16 , NonZeroI128 , i128 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
190+ impl_nz_from_nz ! { NonZeroI32 , NonZeroI64 , i64 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
191+ impl_nz_from_nz ! { NonZeroI32 , NonZeroI128 , i128 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
192+ impl_nz_from_nz ! { NonZeroI64 , NonZeroI128 , i128 , #[ unstable( feature = "nonzero_int_to_wider_nonzero_int_lossless_conv" , issue = "66196" ) ] }
193+
137194/// Provides intentionally-wrapped arithmetic on `T`.
138195///
139196/// Operations like `+` on `u32` values is intended to never overflow,
0 commit comments