@@ -177,7 +177,7 @@ macro_rules! checked_op {
177177
178178// `Int` + `SignedInt` implemented for signed integers
179179macro_rules! int_impl {
180- ( $ActualT: ident, $UnsignedT: ty, $BITS: expr,
180+ ( $SelfT : ty , $ ActualT: ident, $UnsignedT: ty, $BITS: expr,
181181 $add_with_overflow: path,
182182 $sub_with_overflow: path,
183183 $mul_with_overflow: path) => {
@@ -850,6 +850,17 @@ macro_rules! int_impl {
850850 /// ```
851851 #[ stable( feature = "num_wrapping" , since = "1.2.0" ) ]
852852 #[ inline( always) ]
853+ #[ cfg( not( stage0) ) ]
854+ pub fn wrapping_shl( self , rhs: u32 ) -> Self {
855+ unsafe {
856+ intrinsics:: unchecked_shl( self , ( rhs & ( $BITS - 1 ) ) as $SelfT)
857+ }
858+ }
859+
860+ /// Stage 0
861+ #[ stable( feature = "num_wrapping" , since = "1.2.0" ) ]
862+ #[ inline( always) ]
863+ #[ cfg( stage0) ]
853864 pub fn wrapping_shl( self , rhs: u32 ) -> Self {
854865 self . overflowing_shl( rhs) . 0
855866 }
@@ -875,6 +886,17 @@ macro_rules! int_impl {
875886 /// ```
876887 #[ stable( feature = "num_wrapping" , since = "1.2.0" ) ]
877888 #[ inline( always) ]
889+ #[ cfg( not( stage0) ) ]
890+ pub fn wrapping_shr( self , rhs: u32 ) -> Self {
891+ unsafe {
892+ intrinsics:: unchecked_shr( self , ( rhs & ( $BITS - 1 ) ) as $SelfT)
893+ }
894+ }
895+
896+ /// Stage 0
897+ #[ stable( feature = "num_wrapping" , since = "1.2.0" ) ]
898+ #[ inline( always) ]
899+ #[ cfg( stage0) ]
878900 pub fn wrapping_shr( self , rhs: u32 ) -> Self {
879901 self . overflowing_shr( rhs) . 0
880902 }
@@ -1089,6 +1111,15 @@ macro_rules! int_impl {
10891111 /// ```
10901112 #[ inline]
10911113 #[ stable( feature = "wrapping" , since = "1.7.0" ) ]
1114+ #[ cfg( not( stage0) ) ]
1115+ pub fn overflowing_shl( self , rhs: u32 ) -> ( Self , bool ) {
1116+ ( self . wrapping_shl( rhs) , ( rhs > ( $BITS - 1 ) ) )
1117+ }
1118+
1119+ /// Stage 0
1120+ #[ inline]
1121+ #[ stable( feature = "wrapping" , since = "1.7.0" ) ]
1122+ #[ cfg( stage0) ]
10921123 pub fn overflowing_shl( self , rhs: u32 ) -> ( Self , bool ) {
10931124 ( self << ( rhs & ( $BITS - 1 ) ) , ( rhs > ( $BITS - 1 ) ) )
10941125 }
@@ -1111,6 +1142,15 @@ macro_rules! int_impl {
11111142 /// ```
11121143 #[ inline]
11131144 #[ stable( feature = "wrapping" , since = "1.7.0" ) ]
1145+ #[ cfg( not( stage0) ) ]
1146+ pub fn overflowing_shr( self , rhs: u32 ) -> ( Self , bool ) {
1147+ ( self . wrapping_shr( rhs) , ( rhs > ( $BITS - 1 ) ) )
1148+ }
1149+
1150+ /// Stage 0
1151+ #[ inline]
1152+ #[ stable( feature = "wrapping" , since = "1.7.0" ) ]
1153+ #[ cfg( stage0) ]
11141154 pub fn overflowing_shr( self , rhs: u32 ) -> ( Self , bool ) {
11151155 ( self >> ( rhs & ( $BITS - 1 ) ) , ( rhs > ( $BITS - 1 ) ) )
11161156 }
@@ -1268,39 +1308,39 @@ macro_rules! int_impl {
12681308
12691309#[ lang = "i8" ]
12701310impl i8 {
1271- int_impl ! { i8 , u8 , 8 ,
1311+ int_impl ! { i8 , i8 , u8 , 8 ,
12721312 intrinsics:: add_with_overflow,
12731313 intrinsics:: sub_with_overflow,
12741314 intrinsics:: mul_with_overflow }
12751315}
12761316
12771317#[ lang = "i16" ]
12781318impl i16 {
1279- int_impl ! { i16 , u16 , 16 ,
1319+ int_impl ! { i16 , i16 , u16 , 16 ,
12801320 intrinsics:: add_with_overflow,
12811321 intrinsics:: sub_with_overflow,
12821322 intrinsics:: mul_with_overflow }
12831323}
12841324
12851325#[ lang = "i32" ]
12861326impl i32 {
1287- int_impl ! { i32 , u32 , 32 ,
1327+ int_impl ! { i32 , i32 , u32 , 32 ,
12881328 intrinsics:: add_with_overflow,
12891329 intrinsics:: sub_with_overflow,
12901330 intrinsics:: mul_with_overflow }
12911331}
12921332
12931333#[ lang = "i64" ]
12941334impl i64 {
1295- int_impl ! { i64 , u64 , 64 ,
1335+ int_impl ! { i64 , i64 , u64 , 64 ,
12961336 intrinsics:: add_with_overflow,
12971337 intrinsics:: sub_with_overflow,
12981338 intrinsics:: mul_with_overflow }
12991339}
13001340
13011341#[ lang = "i128" ]
13021342impl i128 {
1303- int_impl ! { i128 , u128 , 128 ,
1343+ int_impl ! { i128 , i128 , u128 , 128 ,
13041344 intrinsics:: add_with_overflow,
13051345 intrinsics:: sub_with_overflow,
13061346 intrinsics:: mul_with_overflow }
@@ -1309,7 +1349,7 @@ impl i128 {
13091349#[ cfg( target_pointer_width = "16" ) ]
13101350#[ lang = "isize" ]
13111351impl isize {
1312- int_impl ! { i16 , u16 , 16 ,
1352+ int_impl ! { isize , i16 , u16 , 16 ,
13131353 intrinsics:: add_with_overflow,
13141354 intrinsics:: sub_with_overflow,
13151355 intrinsics:: mul_with_overflow }
@@ -1318,7 +1358,7 @@ impl isize {
13181358#[ cfg( target_pointer_width = "32" ) ]
13191359#[ lang = "isize" ]
13201360impl isize {
1321- int_impl ! { i32 , u32 , 32 ,
1361+ int_impl ! { isize , i32 , u32 , 32 ,
13221362 intrinsics:: add_with_overflow,
13231363 intrinsics:: sub_with_overflow,
13241364 intrinsics:: mul_with_overflow }
@@ -1327,15 +1367,15 @@ impl isize {
13271367#[ cfg( target_pointer_width = "64" ) ]
13281368#[ lang = "isize" ]
13291369impl isize {
1330- int_impl ! { i64 , u64 , 64 ,
1370+ int_impl ! { isize , i64 , u64 , 64 ,
13311371 intrinsics:: add_with_overflow,
13321372 intrinsics:: sub_with_overflow,
13331373 intrinsics:: mul_with_overflow }
13341374}
13351375
13361376// `Int` + `UnsignedInt` implemented for unsigned integers
13371377macro_rules! uint_impl {
1338- ( $ActualT: ty, $BITS: expr,
1378+ ( $SelfT : ty , $ ActualT: ty, $BITS: expr,
13391379 $ctpop: path,
13401380 $ctlz: path,
13411381 $cttz: path,
@@ -1978,6 +2018,17 @@ macro_rules! uint_impl {
19782018 /// ```
19792019 #[ stable( feature = "num_wrapping" , since = "1.2.0" ) ]
19802020 #[ inline( always) ]
2021+ #[ cfg( not( stage0) ) ]
2022+ pub fn wrapping_shl( self , rhs: u32 ) -> Self {
2023+ unsafe {
2024+ intrinsics:: unchecked_shl( self , ( rhs & ( $BITS - 1 ) ) as $SelfT)
2025+ }
2026+ }
2027+
2028+ /// Stage 0
2029+ #[ stable( feature = "num_wrapping" , since = "1.2.0" ) ]
2030+ #[ inline( always) ]
2031+ #[ cfg( stage0) ]
19812032 pub fn wrapping_shl( self , rhs: u32 ) -> Self {
19822033 self . overflowing_shl( rhs) . 0
19832034 }
@@ -2003,6 +2054,17 @@ macro_rules! uint_impl {
20032054 /// ```
20042055 #[ stable( feature = "num_wrapping" , since = "1.2.0" ) ]
20052056 #[ inline( always) ]
2057+ #[ cfg( not( stage0) ) ]
2058+ pub fn wrapping_shr( self , rhs: u32 ) -> Self {
2059+ unsafe {
2060+ intrinsics:: unchecked_shr( self , ( rhs & ( $BITS - 1 ) ) as $SelfT)
2061+ }
2062+ }
2063+
2064+ /// Stage 0
2065+ #[ stable( feature = "num_wrapping" , since = "1.2.0" ) ]
2066+ #[ inline( always) ]
2067+ #[ cfg( stage0) ]
20062068 pub fn wrapping_shr( self , rhs: u32 ) -> Self {
20072069 self . overflowing_shr( rhs) . 0
20082070 }
@@ -2170,6 +2232,15 @@ macro_rules! uint_impl {
21702232 /// ```
21712233 #[ inline]
21722234 #[ stable( feature = "wrapping" , since = "1.7.0" ) ]
2235+ #[ cfg( not( stage0) ) ]
2236+ pub fn overflowing_shl( self , rhs: u32 ) -> ( Self , bool ) {
2237+ ( self . wrapping_shl( rhs) , ( rhs > ( $BITS - 1 ) ) )
2238+ }
2239+
2240+ /// Stage 0
2241+ #[ inline]
2242+ #[ stable( feature = "wrapping" , since = "1.7.0" ) ]
2243+ #[ cfg( stage0) ]
21732244 pub fn overflowing_shl( self , rhs: u32 ) -> ( Self , bool ) {
21742245 ( self << ( rhs & ( $BITS - 1 ) ) , ( rhs > ( $BITS - 1 ) ) )
21752246 }
@@ -2192,6 +2263,16 @@ macro_rules! uint_impl {
21922263 /// ```
21932264 #[ inline]
21942265 #[ stable( feature = "wrapping" , since = "1.7.0" ) ]
2266+ #[ cfg( not( stage0) ) ]
2267+ pub fn overflowing_shr( self , rhs: u32 ) -> ( Self , bool ) {
2268+ ( self . wrapping_shr( rhs) , ( rhs > ( $BITS - 1 ) ) )
2269+
2270+ }
2271+
2272+ /// Stage 0
2273+ #[ inline]
2274+ #[ stable( feature = "wrapping" , since = "1.7.0" ) ]
2275+ #[ cfg( stage0) ]
21952276 pub fn overflowing_shr( self , rhs: u32 ) -> ( Self , bool ) {
21962277 ( self >> ( rhs & ( $BITS - 1 ) ) , ( rhs > ( $BITS - 1 ) ) )
21972278 }
@@ -2292,7 +2373,7 @@ macro_rules! uint_impl {
22922373
22932374#[ lang = "u8" ]
22942375impl u8 {
2295- uint_impl ! { u8 , 8 ,
2376+ uint_impl ! { u8 , u8 , 8 ,
22962377 intrinsics:: ctpop,
22972378 intrinsics:: ctlz,
22982379 intrinsics:: cttz,
@@ -2304,7 +2385,7 @@ impl u8 {
23042385
23052386#[ lang = "u16" ]
23062387impl u16 {
2307- uint_impl ! { u16 , 16 ,
2388+ uint_impl ! { u16 , u16 , 16 ,
23082389 intrinsics:: ctpop,
23092390 intrinsics:: ctlz,
23102391 intrinsics:: cttz,
@@ -2316,7 +2397,7 @@ impl u16 {
23162397
23172398#[ lang = "u32" ]
23182399impl u32 {
2319- uint_impl ! { u32 , 32 ,
2400+ uint_impl ! { u32 , u32 , 32 ,
23202401 intrinsics:: ctpop,
23212402 intrinsics:: ctlz,
23222403 intrinsics:: cttz,
@@ -2328,7 +2409,7 @@ impl u32 {
23282409
23292410#[ lang = "u64" ]
23302411impl u64 {
2331- uint_impl ! { u64 , 64 ,
2412+ uint_impl ! { u64 , u64 , 64 ,
23322413 intrinsics:: ctpop,
23332414 intrinsics:: ctlz,
23342415 intrinsics:: cttz,
@@ -2340,7 +2421,7 @@ impl u64 {
23402421
23412422#[ lang = "u128" ]
23422423impl u128 {
2343- uint_impl ! { u128 , 128 ,
2424+ uint_impl ! { u128 , u128 , 128 ,
23442425 intrinsics:: ctpop,
23452426 intrinsics:: ctlz,
23462427 intrinsics:: cttz,
@@ -2353,7 +2434,7 @@ impl u128 {
23532434#[ cfg( target_pointer_width = "16" ) ]
23542435#[ lang = "usize" ]
23552436impl usize {
2356- uint_impl ! { u16 , 16 ,
2437+ uint_impl ! { usize , u16 , 16 ,
23572438 intrinsics:: ctpop,
23582439 intrinsics:: ctlz,
23592440 intrinsics:: cttz,
@@ -2365,7 +2446,7 @@ impl usize {
23652446#[ cfg( target_pointer_width = "32" ) ]
23662447#[ lang = "usize" ]
23672448impl usize {
2368- uint_impl ! { u32 , 32 ,
2449+ uint_impl ! { usize , u32 , 32 ,
23692450 intrinsics:: ctpop,
23702451 intrinsics:: ctlz,
23712452 intrinsics:: cttz,
@@ -2378,7 +2459,7 @@ impl usize {
23782459#[ cfg( target_pointer_width = "64" ) ]
23792460#[ lang = "usize" ]
23802461impl usize {
2381- uint_impl ! { u64 , 64 ,
2462+ uint_impl ! { usize , u64 , 64 ,
23822463 intrinsics:: ctpop,
23832464 intrinsics:: ctlz,
23842465 intrinsics:: cttz,
0 commit comments