@@ -134,6 +134,63 @@ macro_rules! from_str_radix_nzint_impl {
134
134
from_str_radix_nzint_impl ! { NonZeroU8 NonZeroU16 NonZeroU32 NonZeroU64 NonZeroU128 NonZeroUsize
135
135
NonZeroI8 NonZeroI16 NonZeroI32 NonZeroI64 NonZeroI128 NonZeroIsize }
136
136
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
+
137
194
/// Provides intentionally-wrapped arithmetic on `T`.
138
195
///
139
196
/// Operations like `+` on `u32` values is intended to never overflow,
0 commit comments