5 #[allow(unused_macros)]
6 macro_rules
! sh_impl_signed
{
7 ($t
:ident
, $f
:ident
) => {
8 #[stable(feature = "rust1", since = "1.0.0")]
9 impl Shl
<$f
> for Wrapping
<$t
> {
10 type Output
= Wrapping
<$t
>;
13 fn shl(self, other
: $f
) -> Wrapping
<$t
> {
15 Wrapping(self.0.wrapping_shr((-other
& self::shift_max
::$t
as $f
) as u32))
17 Wrapping(self.0.wrapping_shl((other
& self::shift_max
::$t
as $f
) as u32))
21 forward_ref_binop
! { impl Shl
, shl
for Wrapping
<$t
>, $f
,
22 #[stable(feature = "wrapping_ref_ops", since = "1.39.0")] }
24 #[stable(feature = "op_assign_traits", since = "1.8.0")]
25 impl ShlAssign
<$f
> for Wrapping
<$t
> {
27 fn shl_assign(&mut self, other
: $f
) {
28 *self = *self << other
;
31 forward_ref_op_assign
! { impl ShlAssign, shl_assign for Wrapping<$t>, $f }
33 #[stable(feature = "rust1", since = "1.0.0")]
34 impl Shr
<$f
> for Wrapping
<$t
> {
35 type Output
= Wrapping
<$t
>;
38 fn shr(self, other
: $f
) -> Wrapping
<$t
> {
40 Wrapping(self.0.wrapping_shl((-other
& self::shift_max
::$t
as $f
) as u32))
42 Wrapping(self.0.wrapping_shr((other
& self::shift_max
::$t
as $f
) as u32))
46 forward_ref_binop
! { impl Shr
, shr
for Wrapping
<$t
>, $f
,
47 #[stable(feature = "wrapping_ref_ops", since = "1.39.0")] }
49 #[stable(feature = "op_assign_traits", since = "1.8.0")]
50 impl ShrAssign
<$f
> for Wrapping
<$t
> {
52 fn shr_assign(&mut self, other
: $f
) {
53 *self = *self >> other
;
56 forward_ref_op_assign
! { impl ShrAssign, shr_assign for Wrapping<$t>, $f }
60 macro_rules
! sh_impl_unsigned
{
61 ($t
:ident
, $f
:ident
) => {
62 #[stable(feature = "rust1", since = "1.0.0")]
63 impl Shl
<$f
> for Wrapping
<$t
> {
64 type Output
= Wrapping
<$t
>;
67 fn shl(self, other
: $f
) -> Wrapping
<$t
> {
68 Wrapping(self.0.wrapping_shl((other
& self::shift_max
::$t
as $f
) as u32))
71 forward_ref_binop
! { impl Shl
, shl
for Wrapping
<$t
>, $f
,
72 #[stable(feature = "wrapping_ref_ops", since = "1.39.0")] }
74 #[stable(feature = "op_assign_traits", since = "1.8.0")]
75 impl ShlAssign
<$f
> for Wrapping
<$t
> {
77 fn shl_assign(&mut self, other
: $f
) {
78 *self = *self << other
;
81 forward_ref_op_assign
! { impl ShlAssign, shl_assign for Wrapping<$t>, $f }
83 #[stable(feature = "rust1", since = "1.0.0")]
84 impl Shr
<$f
> for Wrapping
<$t
> {
85 type Output
= Wrapping
<$t
>;
88 fn shr(self, other
: $f
) -> Wrapping
<$t
> {
89 Wrapping(self.0.wrapping_shr((other
& self::shift_max
::$t
as $f
) as u32))
92 forward_ref_binop
! { impl Shr
, shr
for Wrapping
<$t
>, $f
,
93 #[stable(feature = "wrapping_ref_ops", since = "1.39.0")] }
95 #[stable(feature = "op_assign_traits", since = "1.8.0")]
96 impl ShrAssign
<$f
> for Wrapping
<$t
> {
98 fn shr_assign(&mut self, other
: $f
) {
99 *self = *self >> other
;
102 forward_ref_op_assign
! { impl ShrAssign, shr_assign for Wrapping<$t>, $f }
106 // FIXME (#23545): uncomment the remaining impls
107 macro_rules
! sh_impl_all
{
108 ($
($t
:ident
)*) => ($
(
109 //sh_impl_unsigned! { $t, u8 }
110 //sh_impl_unsigned! { $t, u16 }
111 //sh_impl_unsigned! { $t, u32 }
112 //sh_impl_unsigned! { $t, u64 }
113 //sh_impl_unsigned! { $t, u128 }
114 sh_impl_unsigned
! { $t, usize }
116 //sh_impl_signed! { $t, i8 }
117 //sh_impl_signed! { $t, i16 }
118 //sh_impl_signed! { $t, i32 }
119 //sh_impl_signed! { $t, i64 }
120 //sh_impl_signed! { $t, i128 }
121 //sh_impl_signed! { $t, isize }
125 sh_impl_all
! { u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize }
127 // FIXME(30524): impl Op<T> for Wrapping<T>, impl OpAssign<T> for Wrapping<T>
128 macro_rules
! wrapping_impl
{
130 #[stable(feature = "rust1", since = "1.0.0")]
131 impl Add
for Wrapping
<$t
> {
132 type Output
= Wrapping
<$t
>;
135 fn add(self, other
: Wrapping
<$t
>) -> Wrapping
<$t
> {
136 Wrapping(self.0.wrapping_add(other
.0))
139 forward_ref_binop
! { impl Add
, add
for Wrapping
<$t
>, Wrapping
<$t
>,
140 #[stable(feature = "wrapping_ref", since = "1.14.0")] }
142 #[stable(feature = "op_assign_traits", since = "1.8.0")]
143 impl AddAssign
for Wrapping
<$t
> {
145 fn add_assign(&mut self, other
: Wrapping
<$t
>) {
146 *self = *self + other
;
149 forward_ref_op_assign
! { impl AddAssign, add_assign for Wrapping<$t>, Wrapping<$t> }
151 #[stable(feature = "rust1", since = "1.0.0")]
152 impl Sub
for Wrapping
<$t
> {
153 type Output
= Wrapping
<$t
>;
156 fn sub(self, other
: Wrapping
<$t
>) -> Wrapping
<$t
> {
157 Wrapping(self.0.wrapping_sub(other
.0))
160 forward_ref_binop
! { impl Sub
, sub
for Wrapping
<$t
>, Wrapping
<$t
>,
161 #[stable(feature = "wrapping_ref", since = "1.14.0")] }
163 #[stable(feature = "op_assign_traits", since = "1.8.0")]
164 impl SubAssign
for Wrapping
<$t
> {
166 fn sub_assign(&mut self, other
: Wrapping
<$t
>) {
167 *self = *self - other
;
170 forward_ref_op_assign
! { impl SubAssign, sub_assign for Wrapping<$t>, Wrapping<$t> }
172 #[stable(feature = "rust1", since = "1.0.0")]
173 impl Mul
for Wrapping
<$t
> {
174 type Output
= Wrapping
<$t
>;
177 fn mul(self, other
: Wrapping
<$t
>) -> Wrapping
<$t
> {
178 Wrapping(self.0.wrapping_mul(other
.0))
181 forward_ref_binop
! { impl Mul
, mul
for Wrapping
<$t
>, Wrapping
<$t
>,
182 #[stable(feature = "wrapping_ref", since = "1.14.0")] }
184 #[stable(feature = "op_assign_traits", since = "1.8.0")]
185 impl MulAssign
for Wrapping
<$t
> {
187 fn mul_assign(&mut self, other
: Wrapping
<$t
>) {
188 *self = *self * other
;
191 forward_ref_op_assign
! { impl MulAssign, mul_assign for Wrapping<$t>, Wrapping<$t> }
193 #[stable(feature = "wrapping_div", since = "1.3.0")]
194 impl Div
for Wrapping
<$t
> {
195 type Output
= Wrapping
<$t
>;
198 fn div(self, other
: Wrapping
<$t
>) -> Wrapping
<$t
> {
199 Wrapping(self.0.wrapping_div(other
.0))
202 forward_ref_binop
! { impl Div
, div
for Wrapping
<$t
>, Wrapping
<$t
>,
203 #[stable(feature = "wrapping_ref", since = "1.14.0")] }
205 #[stable(feature = "op_assign_traits", since = "1.8.0")]
206 impl DivAssign
for Wrapping
<$t
> {
208 fn div_assign(&mut self, other
: Wrapping
<$t
>) {
209 *self = *self / other
;
212 forward_ref_op_assign
! { impl DivAssign, div_assign for Wrapping<$t>, Wrapping<$t> }
214 #[stable(feature = "wrapping_impls", since = "1.7.0")]
215 impl Rem
for Wrapping
<$t
> {
216 type Output
= Wrapping
<$t
>;
219 fn rem(self, other
: Wrapping
<$t
>) -> Wrapping
<$t
> {
220 Wrapping(self.0.wrapping_rem(other
.0))
223 forward_ref_binop
! { impl Rem
, rem
for Wrapping
<$t
>, Wrapping
<$t
>,
224 #[stable(feature = "wrapping_ref", since = "1.14.0")] }
226 #[stable(feature = "op_assign_traits", since = "1.8.0")]
227 impl RemAssign
for Wrapping
<$t
> {
229 fn rem_assign(&mut self, other
: Wrapping
<$t
>) {
230 *self = *self % other
;
233 forward_ref_op_assign
! { impl RemAssign, rem_assign for Wrapping<$t>, Wrapping<$t> }
235 #[stable(feature = "rust1", since = "1.0.0")]
236 impl Not
for Wrapping
<$t
> {
237 type Output
= Wrapping
<$t
>;
240 fn not(self) -> Wrapping
<$t
> {
244 forward_ref_unop
! { impl Not
, not
for Wrapping
<$t
>,
245 #[stable(feature = "wrapping_ref", since = "1.14.0")] }
247 #[stable(feature = "rust1", since = "1.0.0")]
248 impl BitXor
for Wrapping
<$t
> {
249 type Output
= Wrapping
<$t
>;
252 fn bitxor(self, other
: Wrapping
<$t
>) -> Wrapping
<$t
> {
253 Wrapping(self.0 ^ other
.0)
256 forward_ref_binop
! { impl BitXor
, bitxor
for Wrapping
<$t
>, Wrapping
<$t
>,
257 #[stable(feature = "wrapping_ref", since = "1.14.0")] }
259 #[stable(feature = "op_assign_traits", since = "1.8.0")]
260 impl BitXorAssign
for Wrapping
<$t
> {
262 fn bitxor_assign(&mut self, other
: Wrapping
<$t
>) {
263 *self = *self ^ other
;
266 forward_ref_op_assign
! { impl BitXorAssign, bitxor_assign for Wrapping<$t>, Wrapping<$t> }
268 #[stable(feature = "rust1", since = "1.0.0")]
269 impl BitOr
for Wrapping
<$t
> {
270 type Output
= Wrapping
<$t
>;
273 fn bitor(self, other
: Wrapping
<$t
>) -> Wrapping
<$t
> {
274 Wrapping(self.0 | other
.0)
277 forward_ref_binop
! { impl BitOr
, bitor
for Wrapping
<$t
>, Wrapping
<$t
>,
278 #[stable(feature = "wrapping_ref", since = "1.14.0")] }
280 #[stable(feature = "op_assign_traits", since = "1.8.0")]
281 impl BitOrAssign
for Wrapping
<$t
> {
283 fn bitor_assign(&mut self, other
: Wrapping
<$t
>) {
284 *self = *self | other
;
287 forward_ref_op_assign
! { impl BitOrAssign, bitor_assign for Wrapping<$t>, Wrapping<$t> }
289 #[stable(feature = "rust1", since = "1.0.0")]
290 impl BitAnd
for Wrapping
<$t
> {
291 type Output
= Wrapping
<$t
>;
294 fn bitand(self, other
: Wrapping
<$t
>) -> Wrapping
<$t
> {
295 Wrapping(self.0 & other
.0)
298 forward_ref_binop
! { impl BitAnd
, bitand
for Wrapping
<$t
>, Wrapping
<$t
>,
299 #[stable(feature = "wrapping_ref", since = "1.14.0")] }
301 #[stable(feature = "op_assign_traits", since = "1.8.0")]
302 impl BitAndAssign
for Wrapping
<$t
> {
304 fn bitand_assign(&mut self, other
: Wrapping
<$t
>) {
305 *self = *self & other
;
308 forward_ref_op_assign
! { impl BitAndAssign, bitand_assign for Wrapping<$t>, Wrapping<$t> }
310 #[stable(feature = "wrapping_neg", since = "1.10.0")]
311 impl Neg
for Wrapping
<$t
> {
314 fn neg(self) -> Self {
318 forward_ref_unop
! { impl Neg
, neg
for Wrapping
<$t
>,
319 #[stable(feature = "wrapping_ref", since = "1.14.0")] }
324 wrapping_impl
! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
326 macro_rules
! wrapping_int_impl
{
330 concat
!("Returns the smallest value that can be represented by this integer type.
337 #![feature(wrapping_int_impl)]
338 use std::num::Wrapping;
340 assert_eq!(<Wrapping<", stringify
!($t
), ">>::min_value(), ",
341 "Wrapping(", stringify
!($t
), "::min_value()));
343 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
345 pub const fn min_value() -> Self {
346 Wrapping(<$t
>::min_value())
351 concat
!("Returns the largest value that can be represented by this integer type.
358 #![feature(wrapping_int_impl)]
359 use std::num::Wrapping;
361 assert_eq!(<Wrapping<", stringify
!($t
), ">>::max_value(), ",
362 "Wrapping(", stringify
!($t
), "::max_value()));
364 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
366 pub const fn max_value() -> Self {
367 Wrapping(<$t
>::max_value())
372 concat
!("Returns the number of ones in the binary representation of `self`.
379 #![feature(wrapping_int_impl)]
380 use std::num::Wrapping;
382 let n = Wrapping(0b01001100", stringify
!($t
), ");
384 assert_eq!(n.count_ones(), 3);
387 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
388 pub const fn count_ones(self) -> u32 {
394 concat
!("Returns the number of zeros in the binary representation of `self`.
401 #![feature(wrapping_int_impl)]
402 use std::num::Wrapping;
404 assert_eq!(Wrapping(!0", stringify
!($t
), ").count_zeros(), 0);
407 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
408 pub const fn count_zeros(self) -> u32 {
414 concat
!("Returns the number of trailing zeros in the binary representation
422 #![feature(wrapping_int_impl)]
423 use std::num::Wrapping;
425 let n = Wrapping(0b0101000", stringify
!($t
), ");
427 assert_eq!(n.trailing_zeros(), 3);
430 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
431 pub const fn trailing_zeros(self) -> u32 {
432 self.0.trailing_zeros()
436 /// Shifts the bits to the left by a specified amount, `n`,
437 /// wrapping the truncated bits to the end of the resulting
440 /// Please note this isn't the same operation as the `<<` shifting
448 /// #![feature(wrapping_int_impl)]
449 /// use std::num::Wrapping;
451 /// let n: Wrapping<i64> = Wrapping(0x0123456789ABCDEF);
452 /// let m: Wrapping<i64> = Wrapping(-0x76543210FEDCBA99);
454 /// assert_eq!(n.rotate_left(32), m);
457 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
458 pub const fn rotate_left(self, n
: u32) -> Self {
459 Wrapping(self.0.rotate_left(n
))
462 /// Shifts the bits to the right by a specified amount, `n`,
463 /// wrapping the truncated bits to the beginning of the resulting
466 /// Please note this isn't the same operation as the `>>` shifting
474 /// #![feature(wrapping_int_impl)]
475 /// use std::num::Wrapping;
477 /// let n: Wrapping<i64> = Wrapping(0x0123456789ABCDEF);
478 /// let m: Wrapping<i64> = Wrapping(-0xFEDCBA987654322);
480 /// assert_eq!(n.rotate_right(4), m);
483 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
484 pub const fn rotate_right(self, n
: u32) -> Self {
485 Wrapping(self.0.rotate_right(n
))
488 /// Reverses the byte order of the integer.
495 /// #![feature(wrapping_int_impl)]
496 /// use std::num::Wrapping;
498 /// let n: Wrapping<i16> = Wrapping(0b0000000_01010101);
499 /// assert_eq!(n, Wrapping(85));
501 /// let m = n.swap_bytes();
503 /// assert_eq!(m, Wrapping(0b01010101_00000000));
504 /// assert_eq!(m, Wrapping(21760));
507 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
508 pub const fn swap_bytes(self) -> Self {
509 Wrapping(self.0.swap_bytes())
512 /// Reverses the bit pattern of the integer.
516 /// Please note that this example is shared between integer types.
517 /// Which explains why `i16` is used here.
522 /// use std::num::Wrapping;
524 /// let n = Wrapping(0b0000000_01010101i16);
525 /// assert_eq!(n, Wrapping(85));
527 /// let m = n.reverse_bits();
529 /// assert_eq!(m.0 as u16, 0b10101010_00000000);
530 /// assert_eq!(m, Wrapping(-22016));
532 #[stable(feature = "reverse_bits", since = "1.37.0")]
535 rustc_const_stable(feature
= "const_reverse_bits", since
= "1.37.0"),
539 pub const fn reverse_bits(self) -> Self {
540 Wrapping(self.0.reverse_bits())
544 concat
!("Converts an integer from big endian to the target's endianness.
546 On big endian this is a no-op. On little endian the bytes are
554 #![feature(wrapping_int_impl)]
555 use std::num::Wrapping;
557 let n = Wrapping(0x1A", stringify
!($t
), ");
559 if cfg!(target_endian = \"big\") {
560 assert_eq!(<Wrapping<", stringify
!($t
), ">>::from_be(n), n)
562 assert_eq!(<Wrapping<", stringify
!($t
), ">>::from_be(n), n.swap_bytes())
566 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
567 pub const fn from_be(x
: Self) -> Self {
568 Wrapping(<$t
>::from_be(x
.0))
573 concat
!("Converts an integer from little endian to the target's endianness.
575 On little endian this is a no-op. On big endian the bytes are
583 #![feature(wrapping_int_impl)]
584 use std::num::Wrapping;
586 let n = Wrapping(0x1A", stringify
!($t
), ");
588 if cfg!(target_endian = \"little\") {
589 assert_eq!(<Wrapping<", stringify
!($t
), ">>::from_le(n), n)
591 assert_eq!(<Wrapping<", stringify
!($t
), ">>::from_le(n), n.swap_bytes())
595 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
596 pub const fn from_le(x
: Self) -> Self {
597 Wrapping(<$t
>::from_le(x
.0))
602 concat
!("Converts `self` to big endian from the target's endianness.
604 On big endian this is a no-op. On little endian the bytes are
612 #![feature(wrapping_int_impl)]
613 use std::num::Wrapping;
615 let n = Wrapping(0x1A", stringify
!($t
), ");
617 if cfg!(target_endian = \"big\") {
618 assert_eq!(n.to_be(), n)
620 assert_eq!(n.to_be(), n.swap_bytes())
624 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
625 pub const fn to_be(self) -> Self {
626 Wrapping(self.0.to_be())
631 concat
!("Converts `self` to little endian from the target's endianness.
633 On little endian this is a no-op. On big endian the bytes are
641 #![feature(wrapping_int_impl)]
642 use std::num::Wrapping;
644 let n = Wrapping(0x1A", stringify
!($t
), ");
646 if cfg!(target_endian = \"little\") {
647 assert_eq!(n.to_le(), n)
649 assert_eq!(n.to_le(), n.swap_bytes())
653 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
654 pub const fn to_le(self) -> Self {
655 Wrapping(self.0.to_le())
660 concat
!("Raises self to the power of `exp`, using exponentiation by squaring.
667 #![feature(wrapping_int_impl)]
668 use std::num::Wrapping;
670 assert_eq!(Wrapping(3", stringify
!($t
), ").pow(4), Wrapping(81));
673 Results that are too large are wrapped:
676 #![feature(wrapping_int_impl)]
677 use std::num::Wrapping;
679 assert_eq!(Wrapping(3i8).pow(5), Wrapping(-13));
680 assert_eq!(Wrapping(3i8).pow(6), Wrapping(-39));
683 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
684 pub fn pow(self, exp
: u32) -> Self {
685 Wrapping(self.0.wrapping_pow(exp
))
692 wrapping_int_impl
! { usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
694 macro_rules
! wrapping_int_impl_signed
{
698 concat
!("Returns the number of leading zeros in the binary representation of `self`.
705 #![feature(wrapping_int_impl)]
706 use std::num::Wrapping;
708 let n = Wrapping(", stringify
!($t
), "::max_value()) >> 2;
710 assert_eq!(n.leading_zeros(), 3);
713 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
714 pub const fn leading_zeros(self) -> u32 {
715 self.0.leading_zeros()
720 concat
!("Computes the absolute value of `self`, wrapping around at
721 the boundary of the type.
723 The only case where such wrapping can occur is when one takes the absolute value of the negative
724 minimal value for the type this is a positive value that is too large to represent in the type. In
725 such a case, this function returns `MIN` itself.
732 #![feature(wrapping_int_impl)]
733 use std::num::Wrapping;
735 assert_eq!(Wrapping(100", stringify
!($t
), ").abs(), Wrapping(100));
736 assert_eq!(Wrapping(-100", stringify
!($t
), ").abs(), Wrapping(100));
737 assert_eq!(Wrapping(", stringify
!($t
), "::min_value()).abs(), Wrapping(", stringify
!($t
),
739 assert_eq!(Wrapping(-128i8).abs().0 as u8, 128u8);
742 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
743 pub fn abs(self) -> Wrapping
<$t
> {
744 Wrapping(self.0.wrapping_abs())
749 concat
!("Returns a number representing sign of `self`.
751 - `0` if the number is zero
752 - `1` if the number is positive
753 - `-1` if the number is negative
760 #![feature(wrapping_int_impl)]
761 use std::num::Wrapping;
763 assert_eq!(Wrapping(10", stringify
!($t
), ").signum(), Wrapping(1));
764 assert_eq!(Wrapping(0", stringify
!($t
), ").signum(), Wrapping(0));
765 assert_eq!(Wrapping(-10", stringify
!($t
), ").signum(), Wrapping(-1));
768 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
769 pub fn signum(self) -> Wrapping
<$t
> {
770 Wrapping(self.0.signum())
775 concat
!("Returns `true` if `self` is positive and `false` if the number is zero or
783 #![feature(wrapping_int_impl)]
784 use std::num::Wrapping;
786 assert!(Wrapping(10", stringify
!($t
), ").is_positive());
787 assert!(!Wrapping(-10", stringify
!($t
), ").is_positive());
790 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
791 pub const fn is_positive(self) -> bool
{
797 concat
!("Returns `true` if `self` is negative and `false` if the number is zero or
805 #![feature(wrapping_int_impl)]
806 use std::num::Wrapping;
808 assert!(Wrapping(-10", stringify
!($t
), ").is_negative());
809 assert!(!Wrapping(10", stringify
!($t
), ").is_negative());
812 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
813 pub const fn is_negative(self) -> bool
{
821 wrapping_int_impl_signed
! { isize i8 i16 i32 i64 i128 }
823 macro_rules
! wrapping_int_impl_unsigned
{
827 concat
!("Returns the number of leading zeros in the binary representation of `self`.
834 #![feature(wrapping_int_impl)]
835 use std::num::Wrapping;
837 let n = Wrapping(", stringify
!($t
), "::max_value()) >> 2;
839 assert_eq!(n.leading_zeros(), 2);
842 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
843 pub const fn leading_zeros(self) -> u32 {
844 self.0.leading_zeros()
849 concat
!("Returns `true` if and only if `self == 2^k` for some `k`.
856 #![feature(wrapping_int_impl)]
857 use std::num::Wrapping;
859 assert!(Wrapping(16", stringify
!($t
), ").is_power_of_two());
860 assert!(!Wrapping(10", stringify
!($t
), ").is_power_of_two());
863 #[unstable(feature = "wrapping_int_impl", issue = "32463")]
864 pub fn is_power_of_two(self) -> bool
{
865 self.0.is_power_of_two
()
870 concat
!("Returns the smallest power of two greater than or equal to `self`.
872 When return value overflows (i.e., `self > (1 << (N-1))` for type
873 `uN`), overflows to `2^N = 0`.
880 #![feature(wrapping_next_power_of_two)]
881 use std::num::Wrapping;
883 assert_eq!(Wrapping(2", stringify
!($t
), ").next_power_of_two(), Wrapping(2));
884 assert_eq!(Wrapping(3", stringify
!($t
), ").next_power_of_two(), Wrapping(4));
885 assert_eq!(Wrapping(200_u8).next_power_of_two(), Wrapping(0));
888 #[unstable(feature = "wrapping_next_power_of_two", issue = "32463",
889 reason
= "needs decision on wrapping behaviour")]
890 pub fn next_power_of_two(self) -> Self {
891 Wrapping(self.0.wrapping_next_power_of_two())
898 wrapping_int_impl_unsigned
! { usize u8 u16 u32 u64 u128 }
901 #![allow(non_upper_case_globals)]
903 #[cfg(target_pointer_width = "16")]
905 pub const usize: u32 = super::u16;
906 pub const isize: u32 = super::i16;
909 #[cfg(target_pointer_width = "32")]
911 pub const usize: u32 = super::u32;
912 pub const isize: u32 = super::i32;
915 #[cfg(target_pointer_width = "64")]
917 pub const usize: u32 = super::u64;
918 pub const isize: u32 = super::i64;
921 pub const i8: u32 = (1 << 3) - 1;
922 pub const i16: u32 = (1 << 4) - 1;
923 pub const i32: u32 = (1 << 5) - 1;
924 pub const i64: u32 = (1 << 6) - 1;
925 pub const i128
: u32 = (1 << 7) - 1;
926 pub use self::platform
::isize;
928 pub const u8: u32 = i8;
929 pub const u16: u32 = i16;
930 pub const u32: u32 = i32;
931 pub const u64: u32 = i64;
932 pub const u128
: u32 = i128
;
933 pub use self::platform
::usize;