@@ -30,6 +30,8 @@ use intrinsics::{i16_mul_with_overflow, u16_mul_with_overflow};
30
30
use intrinsics:: { i32_mul_with_overflow, u32_mul_with_overflow} ;
31
31
use intrinsics:: { i64_mul_with_overflow, u64_mul_with_overflow} ;
32
32
33
+ use :: { i8, i16, i32, i64, u8, u16, u32, u64} ;
34
+
33
35
#[ unstable( feature = "core" , reason = "may be removed, renamed, or relocated" ) ]
34
36
#[ deprecated( since = "1.0.0" , reason = "moved to inherent methods" ) ]
35
37
pub trait WrappingOps {
@@ -43,6 +45,12 @@ pub trait OverflowingOps {
43
45
fn overflowing_add ( self , rhs : Self ) -> ( Self , bool ) ;
44
46
fn overflowing_sub ( self , rhs : Self ) -> ( Self , bool ) ;
45
47
fn overflowing_mul ( self , rhs : Self ) -> ( Self , bool ) ;
48
+
49
+ fn overflowing_div ( self , rhs : Self ) -> ( Self , bool ) ;
50
+ fn overflowing_rem ( self , rhs : Self ) -> ( Self , bool ) ;
51
+
52
+ fn overflowing_shl ( self , rhs : u32 ) -> ( Self , bool ) ;
53
+ fn overflowing_shr ( self , rhs : u32 ) -> ( Self , bool ) ;
46
54
}
47
55
48
56
macro_rules! sh_impl {
@@ -184,6 +192,20 @@ macro_rules! wrapping_impl {
184
192
185
193
wrapping_impl ! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 }
186
194
195
+ mod shift_max {
196
+ #![ allow( non_upper_case_globals) ]
197
+
198
+ pub const i8: u32 = ( 1 << 3 ) - 1 ;
199
+ pub const i16: u32 = ( 1 << 4 ) - 1 ;
200
+ pub const i32: u32 = ( 1 << 5 ) - 1 ;
201
+ pub const i64: u32 = ( 1 << 6 ) - 1 ;
202
+
203
+ pub const u8: u32 = i8;
204
+ pub const u16: u32 = i16;
205
+ pub const u32: u32 = i32;
206
+ pub const u64: u32 = i64;
207
+ }
208
+
187
209
macro_rules! overflowing_impl {
188
210
( $( $t: ident) * ) => ( $(
189
211
impl OverflowingOps for $t {
@@ -205,6 +227,34 @@ macro_rules! overflowing_impl {
205
227
concat_idents!( $t, _mul_with_overflow) ( self , rhs)
206
228
}
207
229
}
230
+
231
+ #[ inline( always) ]
232
+ fn overflowing_div( self , rhs: $t) -> ( $t, bool ) {
233
+ if self == $t:: MIN && rhs == -1 {
234
+ ( 1 , true )
235
+ } else {
236
+ ( self /rhs, false )
237
+ }
238
+ }
239
+ #[ inline( always) ]
240
+ fn overflowing_rem( self , rhs: $t) -> ( $t, bool ) {
241
+ if self == $t:: MIN && rhs == -1 {
242
+ ( 0 , true )
243
+ } else {
244
+ ( self % rhs, false )
245
+ }
246
+ }
247
+
248
+ #[ inline( always) ]
249
+ fn overflowing_shl( self , rhs: u32 ) -> ( $t, bool ) {
250
+ ( self << ( rhs & self :: shift_max:: $t) ,
251
+ ( rhs > self :: shift_max:: $t) )
252
+ }
253
+ #[ inline( always) ]
254
+ fn overflowing_shr( self , rhs: u32 ) -> ( $t, bool ) {
255
+ ( self >> ( rhs & self :: shift_max:: $t) ,
256
+ ( rhs > self :: shift_max:: $t) )
257
+ }
208
258
}
209
259
) * )
210
260
}
@@ -234,6 +284,26 @@ impl OverflowingOps for usize {
234
284
( res. 0 as usize , res. 1 )
235
285
}
236
286
}
287
+ #[ inline( always) ]
288
+ fn overflowing_div ( self , rhs : usize ) -> ( usize , bool ) {
289
+ let ( r, f) = ( self as u64 ) . overflowing_div ( rhs as u64 ) ;
290
+ ( r as usize , f)
291
+ }
292
+ #[ inline( always) ]
293
+ fn overflowing_rem ( self , rhs : usize ) -> ( usize , bool ) {
294
+ let ( r, f) = ( self as u64 ) . overflowing_rem ( rhs as u64 ) ;
295
+ ( r as usize , f)
296
+ }
297
+ #[ inline( always) ]
298
+ fn overflowing_shl ( self , rhs : u32 ) -> ( usize , bool ) {
299
+ let ( r, f) = ( self as u64 ) . overflowing_shl ( rhs) ;
300
+ ( r as usize , f)
301
+ }
302
+ #[ inline( always) ]
303
+ fn overflowing_shr ( self , rhs : u32 ) -> ( usize , bool ) {
304
+ let ( r, f) = ( self as u64 ) . overflowing_shr ( rhs) ;
305
+ ( r as usize , f)
306
+ }
237
307
}
238
308
239
309
#[ cfg( target_pointer_width = "32" ) ]
@@ -259,6 +329,26 @@ impl OverflowingOps for usize {
259
329
( res. 0 as usize , res. 1 )
260
330
}
261
331
}
332
+ #[ inline( always) ]
333
+ fn overflowing_div ( self , rhs : usize ) -> ( usize , bool ) {
334
+ let ( r, f) = ( self as u32 ) . overflowing_div ( rhs as u32 ) ;
335
+ ( r as usize , f)
336
+ }
337
+ #[ inline( always) ]
338
+ fn overflowing_rem ( self , rhs : usize ) -> ( usize , bool ) {
339
+ let ( r, f) = ( self as u32 ) . overflowing_rem ( rhs as u32 ) ;
340
+ ( r as usize , f)
341
+ }
342
+ #[ inline( always) ]
343
+ fn overflowing_shl ( self , rhs : u32 ) -> ( usize , bool ) {
344
+ let ( r, f) = ( self as u32 ) . overflowing_shl ( rhs) ;
345
+ ( r as usize , f)
346
+ }
347
+ #[ inline( always) ]
348
+ fn overflowing_shr ( self , rhs : u32 ) -> ( usize , bool ) {
349
+ let ( r, f) = ( self as u32 ) . overflowing_shr ( rhs) ;
350
+ ( r as usize , f)
351
+ }
262
352
}
263
353
264
354
#[ cfg( target_pointer_width = "64" ) ]
@@ -284,6 +374,26 @@ impl OverflowingOps for isize {
284
374
( res. 0 as isize , res. 1 )
285
375
}
286
376
}
377
+ #[ inline( always) ]
378
+ fn overflowing_div ( self , rhs : isize ) -> ( isize , bool ) {
379
+ let ( r, f) = ( self as i64 ) . overflowing_div ( rhs as i64 ) ;
380
+ ( r as isize , f)
381
+ }
382
+ #[ inline( always) ]
383
+ fn overflowing_rem ( self , rhs : isize ) -> ( isize , bool ) {
384
+ let ( r, f) = ( self as i64 ) . overflowing_rem ( rhs as i64 ) ;
385
+ ( r as isize , f)
386
+ }
387
+ #[ inline( always) ]
388
+ fn overflowing_shl ( self , rhs : u32 ) -> ( isize , bool ) {
389
+ let ( r, f) = ( self as i64 ) . overflowing_shl ( rhs) ;
390
+ ( r as isize , f)
391
+ }
392
+ #[ inline( always) ]
393
+ fn overflowing_shr ( self , rhs : u32 ) -> ( isize , bool ) {
394
+ let ( r, f) = ( self as i64 ) . overflowing_shr ( rhs) ;
395
+ ( r as isize , f)
396
+ }
287
397
}
288
398
289
399
#[ cfg( target_pointer_width = "32" ) ]
@@ -309,4 +419,24 @@ impl OverflowingOps for isize {
309
419
( res. 0 as isize , res. 1 )
310
420
}
311
421
}
422
+ #[ inline( always) ]
423
+ fn overflowing_div ( self , rhs : isize ) -> ( isize , bool ) {
424
+ let ( r, f) = ( self as i32 ) . overflowing_div ( rhs as i32 ) ;
425
+ ( r as isize , f)
426
+ }
427
+ #[ inline( always) ]
428
+ fn overflowing_rem ( self , rhs : isize ) -> ( isize , bool ) {
429
+ let ( r, f) = ( self as i32 ) . overflowing_rem ( rhs as i32 ) ;
430
+ ( r as isize , f)
431
+ }
432
+ #[ inline( always) ]
433
+ fn overflowing_shl ( self , rhs : u32 ) -> ( isize , bool ) {
434
+ let ( r, f) = ( self as i32 ) . overflowing_shl ( rhs) ;
435
+ ( r as isize , f)
436
+ }
437
+ #[ inline( always) ]
438
+ fn overflowing_shr ( self , rhs : u32 ) -> ( isize , bool ) {
439
+ let ( r, f) = ( self as i32 ) . overflowing_shr ( rhs) ;
440
+ ( r as isize , f)
441
+ }
312
442
}
0 commit comments