2 files changed +48
-0
lines changed Original file line number Diff line number Diff line change @@ -183,6 +183,30 @@ macro_rules! int_impl {
183
183
( self as $UnsignedT) . trailing_ones( )
184
184
}
185
185
186
+ /// Returns the bit pattern of `self` reinterpreted as an unsigned integer of the same size.
187
+ ///
188
+ /// This is a bit safer than `as` because it wouldn't silently change the size if the code
189
+ /// is refactored.
190
+ ///
191
+ /// # Examples
192
+ ///
193
+ /// Basic usage:
194
+ ///
195
+ /// ```
196
+ /// #![feature(integer_sign_cast)]
197
+ ///
198
+ #[ doc = concat!( "let n = -1" , stringify!( $SelfT) , ";" ) ]
199
+ ///
200
+ #[ doc = concat!( "assert_eq!(n.cast_unsigned(), " , stringify!( $UnsignedT) , "::MAX);" ) ]
201
+ /// ```
202
+ #[ unstable( feature = "integer_sign_cast" , issue = "125882" ) ]
203
+ #[ must_use = "this returns the result of the operation, \
204
+ without modifying the original"]
205
+ #[ inline( always) ]
206
+ pub const fn cast_unsigned( self ) -> $UnsignedT {
207
+ self as $UnsignedT
208
+ }
209
+
186
210
/// Shifts the bits to the left by a specified amount, `n`,
187
211
/// wrapping the truncated bits to the end of the resulting integer.
188
212
///
Original file line number Diff line number Diff line change @@ -184,6 +184,30 @@ macro_rules! uint_impl {
184
184
( !self ) . trailing_zeros( )
185
185
}
186
186
187
+ /// Returns the bit pattern of `self` reinterpreted as a signed integer of the same size.
188
+ ///
189
+ /// This is a bit safer than `as` because it wouldn't silently change the size if the code
190
+ /// is refactored.
191
+ ///
192
+ /// # Examples
193
+ ///
194
+ /// Basic usage:
195
+ ///
196
+ /// ```
197
+ /// #![feature(integer_sign_cast)]
198
+ ///
199
+ #[ doc = concat!( "let n = " , stringify!( $SelfT) , "::MAX;" ) ]
200
+ ///
201
+ #[ doc = concat!( "assert_eq!(n.cast_signed(), -1" , stringify!( $SignedT) , ");" ) ]
202
+ /// ```
203
+ #[ unstable( feature = "integer_sign_cast" , issue = "125882" ) ]
204
+ #[ must_use = "this returns the result of the operation, \
205
+ without modifying the original"]
206
+ #[ inline( always) ]
207
+ pub const fn cast_signed( self ) -> $SignedT {
208
+ self as $SignedT
209
+ }
210
+
187
211
/// Shifts the bits to the left by a specified amount, `n`,
188
212
/// wrapping the truncated bits to the end of the resulting integer.
189
213
///
0 commit comments