@@ -317,11 +317,307 @@ macro_rules! wrapping_impl {
317
317
}
318
318
forward_ref_unop! { impl Neg , neg for Wrapping <$t>,
319
319
#[ stable( feature = "wrapping_ref" , since = "1.14.0" ) ] }
320
+
320
321
) * )
321
322
}
322
323
323
324
wrapping_impl ! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
324
325
326
+ macro_rules! wrapping_int_impl {
327
+ ( $( $t: ty) * ) => ( $(
328
+ impl Wrapping <$t> {
329
+ /// Returns the number of ones in the binary representation of
330
+ /// `self`.
331
+ ///
332
+ /// # Examples
333
+ ///
334
+ /// Basic usage:
335
+ ///
336
+ /// ```
337
+ /// #![feature(wrapping_int_impl)]
338
+ /// use std::num::Wrapping;
339
+ ///
340
+ /// let n: Wrapping<i8> = Wrapping(-0b1000_0000);
341
+ ///
342
+ /// assert_eq!(n.count_ones(), 1);
343
+ /// ```
344
+ #[ inline]
345
+ #[ unstable( feature = "wrapping_int_impl" , issue = "32463" ) ]
346
+ pub fn count_ones( self ) -> u32 {
347
+ self . 0 . count_ones( )
348
+ }
349
+
350
+ /// Returns the number of zeros in the binary representation of
351
+ /// `self`.
352
+ ///
353
+ /// # Examples
354
+ ///
355
+ /// Basic usage:
356
+ ///
357
+ /// ```
358
+ /// #![feature(wrapping_int_impl)]
359
+ /// use std::num::Wrapping;
360
+ ///
361
+ /// let n: Wrapping<i8> = Wrapping(-0b1000_0000);
362
+ ///
363
+ /// assert_eq!(n.count_zeros(), 7);
364
+ /// ```
365
+ #[ inline]
366
+ #[ unstable( feature = "wrapping_int_impl" , issue = "32463" ) ]
367
+ pub fn count_zeros( self ) -> u32 {
368
+ self . 0 . count_zeros( )
369
+ }
370
+
371
+ /// Returns the number of leading zeros in the binary representation
372
+ /// of `self`.
373
+ ///
374
+ /// # Examples
375
+ ///
376
+ /// Basic usage:
377
+ ///
378
+ /// ```
379
+ /// #![feature(wrapping_int_impl)]
380
+ /// use std::num::Wrapping;
381
+ ///
382
+ /// let n: Wrapping<i16> = Wrapping(-1);
383
+ ///
384
+ /// assert_eq!(n.leading_zeros(), 0);
385
+ /// ```
386
+ #[ inline]
387
+ #[ unstable( feature = "wrapping_int_impl" , issue = "32463" ) ]
388
+ pub fn leading_zeros( self ) -> u32 {
389
+ self . 0 . leading_zeros( )
390
+ }
391
+
392
+ /// Returns the number of trailing zeros in the binary representation
393
+ /// of `self`.
394
+ ///
395
+ /// # Examples
396
+ ///
397
+ /// Basic usage:
398
+ ///
399
+ /// ```
400
+ /// #![feature(wrapping_int_impl)]
401
+ /// use std::num::Wrapping;
402
+ ///
403
+ /// let n: Wrapping<i8> = Wrapping(-4);
404
+ ///
405
+ /// assert_eq!(n.trailing_zeros(), 2);
406
+ /// ```
407
+ #[ inline]
408
+ #[ unstable( feature = "wrapping_int_impl" , issue = "32463" ) ]
409
+ pub fn trailing_zeros( self ) -> u32 {
410
+ self . 0 . trailing_zeros( )
411
+ }
412
+
413
+ /// Shifts the bits to the left by a specified amount, `n`,
414
+ /// wrapping the truncated bits to the end of the resulting
415
+ /// integer.
416
+ ///
417
+ /// Please note this isn't the same operation as `>>`!
418
+ ///
419
+ /// # Examples
420
+ ///
421
+ /// Basic usage:
422
+ ///
423
+ /// ```
424
+ /// #![feature(wrapping_int_impl)]
425
+ /// use std::num::Wrapping;
426
+ ///
427
+ /// let n: Wrapping<i64> = Wrapping(0x0123456789ABCDEF);
428
+ /// let m: Wrapping<i64> = Wrapping(-0x76543210FEDCBA99);
429
+ ///
430
+ /// assert_eq!(n.rotate_left(32), m);
431
+ /// ```
432
+ #[ inline]
433
+ #[ unstable( feature = "wrapping_int_impl" , issue = "32463" ) ]
434
+ pub fn rotate_left( self , n: u32 ) -> Self {
435
+ Wrapping ( self . 0 . rotate_left( n) )
436
+ }
437
+
438
+ /// Shifts the bits to the right by a specified amount, `n`,
439
+ /// wrapping the truncated bits to the beginning of the resulting
440
+ /// integer.
441
+ ///
442
+ /// Please note this isn't the same operation as `<<`!
443
+ ///
444
+ /// # Examples
445
+ ///
446
+ /// Basic usage:
447
+ ///
448
+ /// ```
449
+ /// #![feature(wrapping_int_impl)]
450
+ /// use std::num::Wrapping;
451
+ ///
452
+ /// let n: Wrapping<i64> = Wrapping(0x0123456789ABCDEF);
453
+ /// let m: Wrapping<i64> = Wrapping(-0xFEDCBA987654322);
454
+ ///
455
+ /// assert_eq!(n.rotate_right(4), m);
456
+ /// ```
457
+ #[ inline]
458
+ #[ unstable( feature = "wrapping_int_impl" , issue = "32463" ) ]
459
+ pub fn rotate_right( self , n: u32 ) -> Self {
460
+ Wrapping ( self . 0 . rotate_right( n) )
461
+ }
462
+
463
+ /// Reverses the byte order of the integer.
464
+ ///
465
+ /// # Examples
466
+ ///
467
+ /// Basic usage:
468
+ ///
469
+ /// ```
470
+ /// #![feature(wrapping_int_impl)]
471
+ /// use std::num::Wrapping;
472
+ ///
473
+ /// let n: Wrapping<i16> = Wrapping(0b0000000_01010101);
474
+ /// assert_eq!(n, Wrapping(85));
475
+ ///
476
+ /// let m = n.swap_bytes();
477
+ ///
478
+ /// assert_eq!(m, Wrapping(0b01010101_00000000));
479
+ /// assert_eq!(m, Wrapping(21760));
480
+ /// ```
481
+ #[ inline]
482
+ #[ unstable( feature = "wrapping_int_impl" , issue = "32463" ) ]
483
+ pub fn swap_bytes( self ) -> Self {
484
+ Wrapping ( self . 0 . swap_bytes( ) )
485
+ }
486
+
487
+ /// Converts an integer from big endian to the target's endianness.
488
+ ///
489
+ /// On big endian this is a no-op. On little endian the bytes are
490
+ /// swapped.
491
+ ///
492
+ /// # Examples
493
+ ///
494
+ /// Basic usage:
495
+ ///
496
+ /// ```
497
+ /// #![feature(wrapping_int_impl)]
498
+ /// use std::num::Wrapping;
499
+ ///
500
+ /// let n: Wrapping<i64> = Wrapping(0x0123456789ABCDEF);
501
+ ///
502
+ /// if cfg!(target_endian = "big") {
503
+ /// assert_eq!(Wrapping::<i64>::from_be(n), n);
504
+ /// } else {
505
+ /// assert_eq!(Wrapping::<i64>::from_be(n), n.swap_bytes());
506
+ /// }
507
+ /// ```
508
+ #[ inline]
509
+ #[ unstable( feature = "wrapping_int_impl" , issue = "32463" ) ]
510
+ pub fn from_be( x: Self ) -> Self {
511
+ Wrapping ( <$t>:: from_be( x. 0 ) )
512
+ }
513
+
514
+ /// Converts an integer from little endian to the target's endianness.
515
+ ///
516
+ /// On little endian this is a no-op. On big endian the bytes are
517
+ /// swapped.
518
+ ///
519
+ /// # Examples
520
+ ///
521
+ /// Basic usage:
522
+ ///
523
+ /// ```
524
+ /// #![feature(wrapping_int_impl)]
525
+ /// use std::num::Wrapping;
526
+ ///
527
+ /// let n: Wrapping<i64> = Wrapping(0x0123456789ABCDEF);
528
+ ///
529
+ /// if cfg!(target_endian = "little") {
530
+ /// assert_eq!(Wrapping::<i64>::from_le(n), n);
531
+ /// } else {
532
+ /// assert_eq!(Wrapping::<i64>::from_le(n), n.swap_bytes());
533
+ /// }
534
+ /// ```
535
+ #[ inline]
536
+ #[ unstable( feature = "wrapping_int_impl" , issue = "32463" ) ]
537
+ pub fn from_le( x: Self ) -> Self {
538
+ Wrapping ( <$t>:: from_le( x. 0 ) )
539
+ }
540
+
541
+ /// Converts `self` to big endian from the target's endianness.
542
+ ///
543
+ /// On big endian this is a no-op. On little endian the bytes are
544
+ /// swapped.
545
+ ///
546
+ /// # Examples
547
+ ///
548
+ /// Basic usage:
549
+ ///
550
+ /// ```
551
+ /// #![feature(wrapping_int_impl)]
552
+ /// use std::num::Wrapping;
553
+ ///
554
+ /// let n: Wrapping<i64> = Wrapping(0x0123456789ABCDEF);
555
+ ///
556
+ /// if cfg!(target_endian = "big") {
557
+ /// assert_eq!(n.to_be(), n);
558
+ /// } else {
559
+ /// assert_eq!(n.to_be(), n.swap_bytes());
560
+ /// }
561
+ /// ```
562
+ #[ inline]
563
+ #[ unstable( feature = "wrapping_int_impl" , issue = "32463" ) ]
564
+ pub fn to_be( self ) -> Self {
565
+ Wrapping ( self . 0 . to_be( ) )
566
+ }
567
+
568
+ /// Converts `self` to little endian from the target's endianness.
569
+ ///
570
+ /// On little endian this is a no-op. On big endian the bytes are
571
+ /// swapped.
572
+ ///
573
+ /// # Examples
574
+ ///
575
+ /// Basic usage:
576
+ ///
577
+ /// ```
578
+ /// #![feature(wrapping_int_impl)]
579
+ /// use std::num::Wrapping;
580
+ ///
581
+ /// let n: Wrapping<i64> = Wrapping(0x0123456789ABCDEF);
582
+ ///
583
+ /// if cfg!(target_endian = "little") {
584
+ /// assert_eq!(n.to_le(), n);
585
+ /// } else {
586
+ /// assert_eq!(n.to_le(), n.swap_bytes());
587
+ /// }
588
+ /// ```
589
+ #[ inline]
590
+ #[ unstable( feature = "wrapping_int_impl" , issue = "32463" ) ]
591
+ pub fn to_le( self ) -> Self {
592
+ Wrapping ( self . 0 . to_le( ) )
593
+ }
594
+
595
+ /// Raises self to the power of `exp`, using exponentiation by
596
+ /// squaring.
597
+ ///
598
+ /// # Examples
599
+ ///
600
+ /// Basic usage:
601
+ ///
602
+ /// ```
603
+ /// #![feature(wrapping_int_impl)]
604
+ /// use std::num::Wrapping;
605
+ ///
606
+ /// let x: Wrapping<i32> = Wrapping(2); // or any other integer type
607
+ ///
608
+ /// assert_eq!(x.pow(4), Wrapping(16));
609
+ #[ inline]
610
+ #[ unstable( feature = "wrapping_int_impl" , issue = "32463" ) ]
611
+ pub fn pow( self , exp: u32 ) -> Self {
612
+ Wrapping ( self . 0 . pow( exp) )
613
+ }
614
+ }
615
+ ) * )
616
+ }
617
+
618
+ wrapping_int_impl ! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
619
+
620
+
325
621
mod shift_max {
326
622
#![ allow( non_upper_case_globals) ]
327
623
@@ -355,3 +651,6 @@ mod shift_max {
355
651
pub const u64: u32 = i64;
356
652
pub use self :: platform:: usize;
357
653
}
654
+
655
+
656
+
0 commit comments