]> git.lizzy.rs Git - rust.git/blob - src/libcore/num/mod.rs
df1c00ccd184f17e7c4cdf9004b8eff68ad95ef9
[rust.git] / src / libcore / num / mod.rs
1 // ignore-tidy-filelength
2
3 //! Numeric traits and functions for the built-in numeric types.
4
5 #![stable(feature = "rust1", since = "1.0.0")]
6
7 use crate::convert::{TryFrom, Infallible};
8 use crate::fmt;
9 use crate::intrinsics;
10 use crate::mem;
11 use crate::ops;
12 use crate::str::FromStr;
13
14 macro_rules! impl_nonzero_fmt {
15     ( #[$stability: meta] ( $( $Trait: ident ),+ ) for $Ty: ident ) => {
16         $(
17             #[$stability]
18             impl fmt::$Trait for $Ty {
19                 #[inline]
20                 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21                     self.get().fmt(f)
22                 }
23             }
24         )+
25     }
26 }
27
28 macro_rules! doc_comment {
29     ($x:expr, $($tt:tt)*) => {
30         #[doc = $x]
31         $($tt)*
32     };
33 }
34
35 macro_rules! nonzero_integers {
36     ( $( #[$stability: meta] $Ty: ident($Int: ty); )+ ) => {
37         $(
38             doc_comment! {
39                 concat!("An integer that is known not to equal zero.
40
41 This enables some memory layout optimization.
42 For example, `Option<", stringify!($Ty), ">` is the same size as `", stringify!($Int), "`:
43
44 ```rust
45 use std::mem::size_of;
46 assert_eq!(size_of::<Option<core::num::", stringify!($Ty), ">>(), size_of::<", stringify!($Int),
47 ">());
48 ```"),
49                 #[$stability]
50                 #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
51                 #[repr(transparent)]
52                 #[rustc_layout_scalar_valid_range_start(1)]
53                 #[rustc_nonnull_optimization_guaranteed]
54                 pub struct $Ty($Int);
55             }
56
57             impl $Ty {
58                 /// Creates a non-zero without checking the value.
59                 ///
60                 /// # Safety
61                 ///
62                 /// The value must not be zero.
63                 #[$stability]
64                 #[inline]
65                 pub const unsafe fn new_unchecked(n: $Int) -> Self {
66                     $Ty(n)
67                 }
68
69                 /// Creates a non-zero if the given value is not zero.
70                 #[$stability]
71                 #[inline]
72                 pub fn new(n: $Int) -> Option<Self> {
73                     if n != 0 {
74                         Some(unsafe { $Ty(n) })
75                     } else {
76                         None
77                     }
78                 }
79
80                 /// Returns the value as a primitive type.
81                 #[$stability]
82                 #[inline]
83                 pub const fn get(self) -> $Int {
84                     self.0
85                 }
86
87             }
88
89             #[stable(feature = "from_nonzero", since = "1.31.0")]
90             impl From<$Ty> for $Int {
91                 fn from(nonzero: $Ty) -> Self {
92                     nonzero.0
93                 }
94             }
95
96             impl_nonzero_fmt! {
97                 #[$stability] (Debug, Display, Binary, Octal, LowerHex, UpperHex) for $Ty
98             }
99         )+
100     }
101 }
102
103 nonzero_integers! {
104     #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU8(u8);
105     #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU16(u16);
106     #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU32(u32);
107     #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU64(u64);
108     #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU128(u128);
109     #[stable(feature = "nonzero", since = "1.28.0")] NonZeroUsize(usize);
110     #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI8(i8);
111     #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI16(i16);
112     #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI32(i32);
113     #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI64(i64);
114     #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI128(i128);
115     #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroIsize(isize);
116 }
117
118 macro_rules! from_str_radix_nzint_impl {
119     ($($t:ty)*) => {$(
120         #[stable(feature = "nonzero_parse", since = "1.35.0")]
121         impl FromStr for $t {
122             type Err = ParseIntError;
123             fn from_str(src: &str) -> Result<Self, Self::Err> {
124                 Self::new(from_str_radix(src, 10)?)
125                     .ok_or(ParseIntError {
126                         kind: IntErrorKind::Zero
127                     })
128             }
129         }
130     )*}
131 }
132
133 from_str_radix_nzint_impl! { NonZeroU8 NonZeroU16 NonZeroU32 NonZeroU64 NonZeroU128 NonZeroUsize
134                              NonZeroI8 NonZeroI16 NonZeroI32 NonZeroI64 NonZeroI128 NonZeroIsize }
135
136 /// Provides intentionally-wrapped arithmetic on `T`.
137 ///
138 /// Operations like `+` on `u32` values is intended to never overflow,
139 /// and in some debug configurations overflow is detected and results
140 /// in a panic. While most arithmetic falls into this category, some
141 /// code explicitly expects and relies upon modular arithmetic (e.g.,
142 /// hashing).
143 ///
144 /// Wrapping arithmetic can be achieved either through methods like
145 /// `wrapping_add`, or through the `Wrapping<T>` type, which says that
146 /// all standard arithmetic operations on the underlying value are
147 /// intended to have wrapping semantics.
148 ///
149 /// The underlying value can be retrieved through the `.0` index of the
150 /// `Wrapping` tuple.
151 ///
152 /// # Examples
153 ///
154 /// ```
155 /// use std::num::Wrapping;
156 ///
157 /// let zero = Wrapping(0u32);
158 /// let one = Wrapping(1u32);
159 ///
160 /// assert_eq!(std::u32::MAX, (zero - one).0);
161 /// ```
162 #[stable(feature = "rust1", since = "1.0.0")]
163 #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default, Hash)]
164 #[repr(transparent)]
165 pub struct Wrapping<T>(#[stable(feature = "rust1", since = "1.0.0")]
166                        pub T);
167
168 #[stable(feature = "rust1", since = "1.0.0")]
169 impl<T: fmt::Debug> fmt::Debug for Wrapping<T> {
170     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
171         self.0.fmt(f)
172     }
173 }
174
175 #[stable(feature = "wrapping_display", since = "1.10.0")]
176 impl<T: fmt::Display> fmt::Display for Wrapping<T> {
177     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
178         self.0.fmt(f)
179     }
180 }
181
182 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
183 impl<T: fmt::Binary> fmt::Binary for Wrapping<T> {
184     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
185         self.0.fmt(f)
186     }
187 }
188
189 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
190 impl<T: fmt::Octal> fmt::Octal for Wrapping<T> {
191     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
192         self.0.fmt(f)
193     }
194 }
195
196 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
197 impl<T: fmt::LowerHex> fmt::LowerHex for Wrapping<T> {
198     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
199         self.0.fmt(f)
200     }
201 }
202
203 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
204 impl<T: fmt::UpperHex> fmt::UpperHex for Wrapping<T> {
205     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
206         self.0.fmt(f)
207     }
208 }
209
210 // All these modules are technically private and only exposed for coretests:
211 pub mod flt2dec;
212 pub mod dec2flt;
213 pub mod bignum;
214 pub mod diy_float;
215
216 mod wrapping;
217
218 macro_rules! usize_isize_to_xe_bytes_doc {
219     () => {"
220
221 **Note**: This function returns an array of length 2, 4 or 8 bytes
222 depending on the target pointer size.
223
224 "}
225 }
226
227
228 macro_rules! usize_isize_from_xe_bytes_doc {
229     () => {"
230
231 **Note**: This function takes an array of length 2, 4 or 8 bytes
232 depending on the target pointer size.
233
234 "}
235 }
236
237 // `Int` + `SignedInt` implemented for signed integers
238 macro_rules! int_impl {
239     ($SelfT:ty, $ActualT:ident, $UnsignedT:ty, $BITS:expr, $Min:expr, $Max:expr, $Feature:expr,
240      $EndFeature:expr, $rot:expr, $rot_op:expr, $rot_result:expr, $swap_op:expr, $swapped:expr,
241      $reversed:expr, $le_bytes:expr, $be_bytes:expr,
242      $to_xe_bytes_doc:expr, $from_xe_bytes_doc:expr) => {
243         doc_comment! {
244             concat!("Returns the smallest value that can be represented by this integer type.
245
246 # Examples
247
248 Basic usage:
249
250 ```
251 ", $Feature, "assert_eq!(", stringify!($SelfT), "::min_value(), ", stringify!($Min), ");",
252 $EndFeature, "
253 ```"),
254             #[stable(feature = "rust1", since = "1.0.0")]
255             #[inline]
256             #[rustc_promotable]
257             pub const fn min_value() -> Self {
258                 !0 ^ ((!0 as $UnsignedT) >> 1) as Self
259             }
260         }
261
262         doc_comment! {
263             concat!("Returns the largest value that can be represented by this integer type.
264
265 # Examples
266
267 Basic usage:
268
269 ```
270 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value(), ", stringify!($Max), ");",
271 $EndFeature, "
272 ```"),
273             #[stable(feature = "rust1", since = "1.0.0")]
274             #[inline]
275             #[rustc_promotable]
276             pub const fn max_value() -> Self {
277                 !Self::min_value()
278             }
279         }
280
281         doc_comment! {
282             concat!("Converts a string slice in a given base to an integer.
283
284 The string is expected to be an optional `+` or `-` sign followed by digits.
285 Leading and trailing whitespace represent an error. Digits are a subset of these characters,
286 depending on `radix`:
287
288  * `0-9`
289  * `a-z`
290  * `A-Z`
291
292 # Panics
293
294 This function panics if `radix` is not in the range from 2 to 36.
295
296 # Examples
297
298 Basic usage:
299
300 ```
301 ", $Feature, "assert_eq!(", stringify!($SelfT), "::from_str_radix(\"A\", 16), Ok(10));",
302 $EndFeature, "
303 ```"),
304             #[stable(feature = "rust1", since = "1.0.0")]
305             pub fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError> {
306                 from_str_radix(src, radix)
307             }
308         }
309
310         doc_comment! {
311             concat!("Returns the number of ones in the binary representation of `self`.
312
313 # Examples
314
315 Basic usage:
316
317 ```
318 ", $Feature, "let n = 0b100_0000", stringify!($SelfT), ";
319
320 assert_eq!(n.count_ones(), 1);",
321 $EndFeature, "
322 ```
323 "),
324             #[stable(feature = "rust1", since = "1.0.0")]
325             #[inline]
326             pub const fn count_ones(self) -> u32 { (self as $UnsignedT).count_ones() }
327         }
328
329         doc_comment! {
330             concat!("Returns the number of zeros in the binary representation of `self`.
331
332 # Examples
333
334 Basic usage:
335
336 ```
337 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value().count_zeros(), 1);", $EndFeature, "
338 ```"),
339             #[stable(feature = "rust1", since = "1.0.0")]
340             #[inline]
341             pub const fn count_zeros(self) -> u32 {
342                 (!self).count_ones()
343             }
344         }
345
346         doc_comment! {
347             concat!("Returns the number of leading zeros in the binary representation of `self`.
348
349 # Examples
350
351 Basic usage:
352
353 ```
354 ", $Feature, "let n = -1", stringify!($SelfT), ";
355
356 assert_eq!(n.leading_zeros(), 0);",
357 $EndFeature, "
358 ```"),
359             #[stable(feature = "rust1", since = "1.0.0")]
360             #[inline]
361             pub const fn leading_zeros(self) -> u32 {
362                 (self as $UnsignedT).leading_zeros()
363             }
364         }
365
366         doc_comment! {
367             concat!("Returns the number of trailing zeros in the binary representation of `self`.
368
369 # Examples
370
371 Basic usage:
372
373 ```
374 ", $Feature, "let n = -4", stringify!($SelfT), ";
375
376 assert_eq!(n.trailing_zeros(), 2);",
377 $EndFeature, "
378 ```"),
379             #[stable(feature = "rust1", since = "1.0.0")]
380             #[inline]
381             pub const fn trailing_zeros(self) -> u32 {
382                 (self as $UnsignedT).trailing_zeros()
383             }
384         }
385
386         doc_comment! {
387             concat!("Shifts the bits to the left by a specified amount, `n`,
388 wrapping the truncated bits to the end of the resulting integer.
389
390 Please note this isn't the same operation as the `<<` shifting operator!
391
392 # Examples
393
394 Basic usage:
395
396 ```
397 let n = ", $rot_op, stringify!($SelfT), ";
398 let m = ", $rot_result, ";
399
400 assert_eq!(n.rotate_left(", $rot, "), m);
401 ```"),
402             #[stable(feature = "rust1", since = "1.0.0")]
403             #[must_use = "this returns the result of the operation, \
404                           without modifying the original"]
405             #[inline]
406             pub const fn rotate_left(self, n: u32) -> Self {
407                 (self as $UnsignedT).rotate_left(n) as Self
408             }
409         }
410
411         doc_comment! {
412             concat!("Shifts the bits to the right by a specified amount, `n`,
413 wrapping the truncated bits to the beginning of the resulting
414 integer.
415
416 Please note this isn't the same operation as the `>>` shifting operator!
417
418 # Examples
419
420 Basic usage:
421
422 ```
423 let n = ", $rot_result, stringify!($SelfT), ";
424 let m = ", $rot_op, ";
425
426 assert_eq!(n.rotate_right(", $rot, "), m);
427 ```"),
428             #[stable(feature = "rust1", since = "1.0.0")]
429             #[must_use = "this returns the result of the operation, \
430                           without modifying the original"]
431             #[inline]
432             pub const fn rotate_right(self, n: u32) -> Self {
433                 (self as $UnsignedT).rotate_right(n) as Self
434             }
435         }
436
437         doc_comment! {
438             concat!("Reverses the byte order of the integer.
439
440 # Examples
441
442 Basic usage:
443
444 ```
445 let n = ", $swap_op, stringify!($SelfT), ";
446
447 let m = n.swap_bytes();
448
449 assert_eq!(m, ", $swapped, ");
450 ```"),
451             #[stable(feature = "rust1", since = "1.0.0")]
452             #[inline]
453             pub const fn swap_bytes(self) -> Self {
454                 (self as $UnsignedT).swap_bytes() as Self
455             }
456         }
457
458         doc_comment! {
459             concat!("Reverses the bit pattern of the integer.
460
461 # Examples
462
463 Basic usage:
464
465 ```
466 let n = ", $swap_op, stringify!($SelfT), ";
467 let m = n.reverse_bits();
468
469 assert_eq!(m, ", $reversed, ");
470 ```"),
471             #[stable(feature = "reverse_bits", since = "1.37.0")]
472             #[inline]
473             #[must_use]
474             pub const fn reverse_bits(self) -> Self {
475                 (self as $UnsignedT).reverse_bits() as Self
476             }
477         }
478
479         doc_comment! {
480             concat!("Converts an integer from big endian to the target's endianness.
481
482 On big endian this is a no-op. On little endian the bytes are swapped.
483
484 # Examples
485
486 Basic usage:
487
488 ```
489 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
490
491 if cfg!(target_endian = \"big\") {
492     assert_eq!(", stringify!($SelfT), "::from_be(n), n)
493 } else {
494     assert_eq!(", stringify!($SelfT), "::from_be(n), n.swap_bytes())
495 }",
496 $EndFeature, "
497 ```"),
498             #[stable(feature = "rust1", since = "1.0.0")]
499             #[inline]
500             pub const fn from_be(x: Self) -> Self {
501                 #[cfg(target_endian = "big")]
502                 {
503                     x
504                 }
505                 #[cfg(not(target_endian = "big"))]
506                 {
507                     x.swap_bytes()
508                 }
509             }
510         }
511
512         doc_comment! {
513             concat!("Converts an integer from little endian to the target's endianness.
514
515 On little endian this is a no-op. On big endian the bytes are swapped.
516
517 # Examples
518
519 Basic usage:
520
521 ```
522 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
523
524 if cfg!(target_endian = \"little\") {
525     assert_eq!(", stringify!($SelfT), "::from_le(n), n)
526 } else {
527     assert_eq!(", stringify!($SelfT), "::from_le(n), n.swap_bytes())
528 }",
529 $EndFeature, "
530 ```"),
531             #[stable(feature = "rust1", since = "1.0.0")]
532             #[inline]
533             pub const fn from_le(x: Self) -> Self {
534                 #[cfg(target_endian = "little")]
535                 {
536                     x
537                 }
538                 #[cfg(not(target_endian = "little"))]
539                 {
540                     x.swap_bytes()
541                 }
542             }
543         }
544
545         doc_comment! {
546             concat!("Converts `self` to big endian from the target's endianness.
547
548 On big endian this is a no-op. On little endian the bytes are swapped.
549
550 # Examples
551
552 Basic usage:
553
554 ```
555 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
556
557 if cfg!(target_endian = \"big\") {
558     assert_eq!(n.to_be(), n)
559 } else {
560     assert_eq!(n.to_be(), n.swap_bytes())
561 }",
562 $EndFeature, "
563 ```"),
564             #[stable(feature = "rust1", since = "1.0.0")]
565             #[inline]
566             pub const fn to_be(self) -> Self { // or not to be?
567                 #[cfg(target_endian = "big")]
568                 {
569                     self
570                 }
571                 #[cfg(not(target_endian = "big"))]
572                 {
573                     self.swap_bytes()
574                 }
575             }
576         }
577
578         doc_comment! {
579             concat!("Converts `self` to little endian from the target's endianness.
580
581 On little endian this is a no-op. On big endian the bytes are swapped.
582
583 # Examples
584
585 Basic usage:
586
587 ```
588 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
589
590 if cfg!(target_endian = \"little\") {
591     assert_eq!(n.to_le(), n)
592 } else {
593     assert_eq!(n.to_le(), n.swap_bytes())
594 }",
595 $EndFeature, "
596 ```"),
597             #[stable(feature = "rust1", since = "1.0.0")]
598             #[inline]
599             pub const fn to_le(self) -> Self {
600                 #[cfg(target_endian = "little")]
601                 {
602                     self
603                 }
604                 #[cfg(not(target_endian = "little"))]
605                 {
606                     self.swap_bytes()
607                 }
608             }
609         }
610
611         doc_comment! {
612             concat!("Checked integer addition. Computes `self + rhs`, returning `None`
613 if overflow occurred.
614
615 # Examples
616
617 Basic usage:
618
619 ```
620 ", $Feature, "assert_eq!((", stringify!($SelfT),
621 "::max_value() - 2).checked_add(1), Some(", stringify!($SelfT), "::max_value() - 1));
622 assert_eq!((", stringify!($SelfT), "::max_value() - 2).checked_add(3), None);",
623 $EndFeature, "
624 ```"),
625             #[stable(feature = "rust1", since = "1.0.0")]
626             #[must_use = "this returns the result of the operation, \
627                           without modifying the original"]
628             #[inline]
629             pub fn checked_add(self, rhs: Self) -> Option<Self> {
630                 let (a, b) = self.overflowing_add(rhs);
631                 if b {None} else {Some(a)}
632             }
633         }
634
635         doc_comment! {
636             concat!("Checked integer subtraction. Computes `self - rhs`, returning `None` if
637 overflow occurred.
638
639 # Examples
640
641 Basic usage:
642
643 ```
644 ", $Feature, "assert_eq!((", stringify!($SelfT),
645 "::min_value() + 2).checked_sub(1), Some(", stringify!($SelfT), "::min_value() + 1));
646 assert_eq!((", stringify!($SelfT), "::min_value() + 2).checked_sub(3), None);",
647 $EndFeature, "
648 ```"),
649             #[stable(feature = "rust1", since = "1.0.0")]
650             #[must_use = "this returns the result of the operation, \
651                           without modifying the original"]
652             #[inline]
653             pub fn checked_sub(self, rhs: Self) -> Option<Self> {
654                 let (a, b) = self.overflowing_sub(rhs);
655                 if b {None} else {Some(a)}
656             }
657         }
658
659         doc_comment! {
660             concat!("Checked integer multiplication. Computes `self * rhs`, returning `None` if
661 overflow occurred.
662
663 # Examples
664
665 Basic usage:
666
667 ```
668 ", $Feature, "assert_eq!(", stringify!($SelfT),
669 "::max_value().checked_mul(1), Some(", stringify!($SelfT), "::max_value()));
670 assert_eq!(", stringify!($SelfT), "::max_value().checked_mul(2), None);",
671 $EndFeature, "
672 ```"),
673             #[stable(feature = "rust1", since = "1.0.0")]
674             #[must_use = "this returns the result of the operation, \
675                           without modifying the original"]
676             #[inline]
677             pub fn checked_mul(self, rhs: Self) -> Option<Self> {
678                 let (a, b) = self.overflowing_mul(rhs);
679                 if b {None} else {Some(a)}
680             }
681         }
682
683         doc_comment! {
684             concat!("Checked integer division. Computes `self / rhs`, returning `None` if `rhs == 0`
685 or the division results in overflow.
686
687 # Examples
688
689 Basic usage:
690
691 ```
692 ", $Feature, "assert_eq!((", stringify!($SelfT),
693 "::min_value() + 1).checked_div(-1), Some(", stringify!($Max), "));
694 assert_eq!(", stringify!($SelfT), "::min_value().checked_div(-1), None);
695 assert_eq!((1", stringify!($SelfT), ").checked_div(0), None);",
696 $EndFeature, "
697 ```"),
698             #[stable(feature = "rust1", since = "1.0.0")]
699             #[must_use = "this returns the result of the operation, \
700                           without modifying the original"]
701             #[inline]
702             pub fn checked_div(self, rhs: Self) -> Option<Self> {
703                 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
704                     None
705                 } else {
706                     Some(unsafe { intrinsics::unchecked_div(self, rhs) })
707                 }
708             }
709         }
710
711         doc_comment! {
712             concat!("Checked Euclidean division. Computes `self.div_euclid(rhs)`,
713 returning `None` if `rhs == 0` or the division results in overflow.
714
715 # Examples
716
717 Basic usage:
718
719 ```
720 assert_eq!((", stringify!($SelfT),
721 "::min_value() + 1).checked_div_euclid(-1), Some(", stringify!($Max), "));
722 assert_eq!(", stringify!($SelfT), "::min_value().checked_div_euclid(-1), None);
723 assert_eq!((1", stringify!($SelfT), ").checked_div_euclid(0), None);
724 ```"),
725             #[stable(feature = "euclidean_division", since = "1.38.0")]
726             #[must_use = "this returns the result of the operation, \
727                           without modifying the original"]
728             #[inline]
729             pub fn checked_div_euclid(self, rhs: Self) -> Option<Self> {
730                 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
731                     None
732                 } else {
733                     Some(self.div_euclid(rhs))
734                 }
735             }
736         }
737
738         doc_comment! {
739             concat!("Checked integer remainder. Computes `self % rhs`, returning `None` if
740 `rhs == 0` or the division results in overflow.
741
742 # Examples
743
744 Basic usage:
745
746 ```
747 ", $Feature, "use std::", stringify!($SelfT), ";
748
749 assert_eq!(5", stringify!($SelfT), ".checked_rem(2), Some(1));
750 assert_eq!(5", stringify!($SelfT), ".checked_rem(0), None);
751 assert_eq!(", stringify!($SelfT), "::MIN.checked_rem(-1), None);",
752 $EndFeature, "
753 ```"),
754             #[stable(feature = "wrapping", since = "1.7.0")]
755             #[must_use = "this returns the result of the operation, \
756                           without modifying the original"]
757             #[inline]
758             pub fn checked_rem(self, rhs: Self) -> Option<Self> {
759                 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
760                     None
761                 } else {
762                     Some(unsafe { intrinsics::unchecked_rem(self, rhs) })
763                 }
764             }
765         }
766
767         doc_comment! {
768             concat!("Checked Euclidean remainder. Computes `self.rem_euclid(rhs)`, returning `None`
769 if `rhs == 0` or the division results in overflow.
770
771 # Examples
772
773 Basic usage:
774
775 ```
776 use std::", stringify!($SelfT), ";
777
778 assert_eq!(5", stringify!($SelfT), ".checked_rem_euclid(2), Some(1));
779 assert_eq!(5", stringify!($SelfT), ".checked_rem_euclid(0), None);
780 assert_eq!(", stringify!($SelfT), "::MIN.checked_rem_euclid(-1), None);
781 ```"),
782             #[stable(feature = "euclidean_division", since = "1.38.0")]
783             #[must_use = "this returns the result of the operation, \
784                           without modifying the original"]
785             #[inline]
786             pub fn checked_rem_euclid(self, rhs: Self) -> Option<Self> {
787                 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
788                     None
789                 } else {
790                     Some(self.rem_euclid(rhs))
791                 }
792             }
793         }
794
795         doc_comment! {
796             concat!("Checked negation. Computes `-self`, returning `None` if `self == MIN`.
797
798 # Examples
799
800 Basic usage:
801
802 ```
803 ", $Feature, "use std::", stringify!($SelfT), ";
804
805 assert_eq!(5", stringify!($SelfT), ".checked_neg(), Some(-5));
806 assert_eq!(", stringify!($SelfT), "::MIN.checked_neg(), None);",
807 $EndFeature, "
808 ```"),
809             #[stable(feature = "wrapping", since = "1.7.0")]
810             #[inline]
811             pub fn checked_neg(self) -> Option<Self> {
812                 let (a, b) = self.overflowing_neg();
813                 if b {None} else {Some(a)}
814             }
815         }
816
817         doc_comment! {
818             concat!("Checked shift left. Computes `self << rhs`, returning `None` if `rhs` is larger
819 than or equal to the number of bits in `self`.
820
821 # Examples
822
823 Basic usage:
824
825 ```
826 ", $Feature, "assert_eq!(0x1", stringify!($SelfT), ".checked_shl(4), Some(0x10));
827 assert_eq!(0x1", stringify!($SelfT), ".checked_shl(129), None);",
828 $EndFeature, "
829 ```"),
830             #[stable(feature = "wrapping", since = "1.7.0")]
831             #[must_use = "this returns the result of the operation, \
832                           without modifying the original"]
833             #[inline]
834             pub fn checked_shl(self, rhs: u32) -> Option<Self> {
835                 let (a, b) = self.overflowing_shl(rhs);
836                 if b {None} else {Some(a)}
837             }
838         }
839
840         doc_comment! {
841             concat!("Checked shift right. Computes `self >> rhs`, returning `None` if `rhs` is
842 larger than or equal to the number of bits in `self`.
843
844 # Examples
845
846 Basic usage:
847
848 ```
849 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".checked_shr(4), Some(0x1));
850 assert_eq!(0x10", stringify!($SelfT), ".checked_shr(128), None);",
851 $EndFeature, "
852 ```"),
853             #[stable(feature = "wrapping", since = "1.7.0")]
854             #[must_use = "this returns the result of the operation, \
855                           without modifying the original"]
856             #[inline]
857             pub fn checked_shr(self, rhs: u32) -> Option<Self> {
858                 let (a, b) = self.overflowing_shr(rhs);
859                 if b {None} else {Some(a)}
860             }
861         }
862
863         doc_comment! {
864             concat!("Checked absolute value. Computes `self.abs()`, returning `None` if
865 `self == MIN`.
866
867 # Examples
868
869 Basic usage:
870
871 ```
872 ", $Feature, "use std::", stringify!($SelfT), ";
873
874 assert_eq!((-5", stringify!($SelfT), ").checked_abs(), Some(5));
875 assert_eq!(", stringify!($SelfT), "::MIN.checked_abs(), None);",
876 $EndFeature, "
877 ```"),
878             #[stable(feature = "no_panic_abs", since = "1.13.0")]
879             #[inline]
880             pub fn checked_abs(self) -> Option<Self> {
881                 if self.is_negative() {
882                     self.checked_neg()
883                 } else {
884                     Some(self)
885                 }
886             }
887         }
888
889         doc_comment! {
890             concat!("Checked exponentiation. Computes `self.pow(exp)`, returning `None` if
891 overflow occurred.
892
893 # Examples
894
895 Basic usage:
896
897 ```
898 ", $Feature, "assert_eq!(8", stringify!($SelfT), ".checked_pow(2), Some(64));
899 assert_eq!(", stringify!($SelfT), "::max_value().checked_pow(2), None);",
900 $EndFeature, "
901 ```"),
902
903             #[stable(feature = "no_panic_pow", since = "1.34.0")]
904             #[must_use = "this returns the result of the operation, \
905                           without modifying the original"]
906             #[inline]
907             pub fn checked_pow(self, mut exp: u32) -> Option<Self> {
908                 let mut base = self;
909                 let mut acc: Self = 1;
910
911                 while exp > 1 {
912                     if (exp & 1) == 1 {
913                         acc = acc.checked_mul(base)?;
914                     }
915                     exp /= 2;
916                     base = base.checked_mul(base)?;
917                 }
918
919                 // Deal with the final bit of the exponent separately, since
920                 // squaring the base afterwards is not necessary and may cause a
921                 // needless overflow.
922                 if exp == 1 {
923                     acc = acc.checked_mul(base)?;
924                 }
925
926                 Some(acc)
927             }
928         }
929
930         doc_comment! {
931             concat!("Saturating integer addition. Computes `self + rhs`, saturating at the numeric
932 bounds instead of overflowing.
933
934 # Examples
935
936 Basic usage:
937
938 ```
939 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_add(1), 101);
940 assert_eq!(", stringify!($SelfT), "::max_value().saturating_add(100), ", stringify!($SelfT),
941 "::max_value());",
942 $EndFeature, "
943 ```"),
944
945             #[stable(feature = "rust1", since = "1.0.0")]
946             #[rustc_const_unstable(feature = "const_saturating_int_methods")]
947             #[must_use = "this returns the result of the operation, \
948                           without modifying the original"]
949             #[inline]
950             pub const fn saturating_add(self, rhs: Self) -> Self {
951                 intrinsics::saturating_add(self, rhs)
952             }
953         }
954
955
956         doc_comment! {
957             concat!("Saturating integer subtraction. Computes `self - rhs`, saturating at the
958 numeric bounds instead of overflowing.
959
960 # Examples
961
962 Basic usage:
963
964 ```
965 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_sub(127), -27);
966 assert_eq!(", stringify!($SelfT), "::min_value().saturating_sub(100), ", stringify!($SelfT),
967 "::min_value());",
968 $EndFeature, "
969 ```"),
970             #[stable(feature = "rust1", since = "1.0.0")]
971             #[rustc_const_unstable(feature = "const_saturating_int_methods")]
972             #[must_use = "this returns the result of the operation, \
973                           without modifying the original"]
974             #[inline]
975             pub const fn saturating_sub(self, rhs: Self) -> Self {
976                 intrinsics::saturating_sub(self, rhs)
977             }
978         }
979
980         doc_comment! {
981             concat!("Saturating integer negation. Computes `-self`, returning `MAX` if `self == MIN`
982 instead of overflowing.
983
984 # Examples
985
986 Basic usage:
987
988 ```
989 ", $Feature, "#![feature(saturating_neg)]
990 assert_eq!(100", stringify!($SelfT), ".saturating_neg(), -100);
991 assert_eq!((-100", stringify!($SelfT), ").saturating_neg(), 100);
992 assert_eq!(", stringify!($SelfT), "::min_value().saturating_neg(), ", stringify!($SelfT),
993 "::max_value());
994 assert_eq!(", stringify!($SelfT), "::max_value().saturating_neg(), ", stringify!($SelfT),
995 "::min_value() + 1);",
996 $EndFeature, "
997 ```"),
998
999             #[unstable(feature = "saturating_neg", issue = "59983")]
1000             #[inline]
1001             pub fn saturating_neg(self) -> Self {
1002                 intrinsics::saturating_sub(0, self)
1003             }
1004         }
1005
1006         doc_comment! {
1007             concat!("Saturating absolute value. Computes `self.abs()`, returning `MAX` if `self ==
1008 MIN` instead of overflowing.
1009
1010 # Examples
1011
1012 Basic usage:
1013
1014 ```
1015 ", $Feature, "#![feature(saturating_neg)]
1016 assert_eq!(100", stringify!($SelfT), ".saturating_abs(), 100);
1017 assert_eq!((-100", stringify!($SelfT), ").saturating_abs(), 100);
1018 assert_eq!(", stringify!($SelfT), "::min_value().saturating_abs(), ", stringify!($SelfT),
1019 "::max_value());
1020 assert_eq!((", stringify!($SelfT), "::min_value() + 1).saturating_abs(), ", stringify!($SelfT),
1021 "::max_value());",
1022 $EndFeature, "
1023 ```"),
1024
1025             #[unstable(feature = "saturating_neg", issue = "59983")]
1026             #[inline]
1027             pub fn saturating_abs(self) -> Self {
1028                 if self.is_negative() {
1029                     self.saturating_neg()
1030                 } else {
1031                     self
1032                 }
1033             }
1034         }
1035
1036         doc_comment! {
1037             concat!("Saturating integer multiplication. Computes `self * rhs`, saturating at the
1038 numeric bounds instead of overflowing.
1039
1040 # Examples
1041
1042 Basic usage:
1043
1044 ```
1045 ", $Feature, "use std::", stringify!($SelfT), ";
1046
1047 assert_eq!(10", stringify!($SelfT), ".saturating_mul(12), 120);
1048 assert_eq!(", stringify!($SelfT), "::MAX.saturating_mul(10), ", stringify!($SelfT), "::MAX);
1049 assert_eq!(", stringify!($SelfT), "::MIN.saturating_mul(10), ", stringify!($SelfT), "::MIN);",
1050 $EndFeature, "
1051 ```"),
1052             #[stable(feature = "wrapping", since = "1.7.0")]
1053             #[must_use = "this returns the result of the operation, \
1054                           without modifying the original"]
1055             #[inline]
1056             pub fn saturating_mul(self, rhs: Self) -> Self {
1057                 self.checked_mul(rhs).unwrap_or_else(|| {
1058                     if (self < 0 && rhs < 0) || (self > 0 && rhs > 0) {
1059                         Self::max_value()
1060                     } else {
1061                         Self::min_value()
1062                     }
1063                 })
1064             }
1065         }
1066
1067         doc_comment! {
1068             concat!("Saturating integer exponentiation. Computes `self.pow(exp)`,
1069 saturating at the numeric bounds instead of overflowing.
1070
1071 # Examples
1072
1073 Basic usage:
1074
1075 ```
1076 ", $Feature, "use std::", stringify!($SelfT), ";
1077
1078 assert_eq!((-4", stringify!($SelfT), ").saturating_pow(3), -64);
1079 assert_eq!(", stringify!($SelfT), "::MIN.saturating_pow(2), ", stringify!($SelfT), "::MAX);
1080 assert_eq!(", stringify!($SelfT), "::MIN.saturating_pow(3), ", stringify!($SelfT), "::MIN);",
1081 $EndFeature, "
1082 ```"),
1083             #[stable(feature = "no_panic_pow", since = "1.34.0")]
1084             #[must_use = "this returns the result of the operation, \
1085                           without modifying the original"]
1086             #[inline]
1087             pub fn saturating_pow(self, exp: u32) -> Self {
1088                 match self.checked_pow(exp) {
1089                     Some(x) => x,
1090                     None if self < 0 && exp % 2 == 1 => Self::min_value(),
1091                     None => Self::max_value(),
1092                 }
1093             }
1094         }
1095
1096         doc_comment! {
1097             concat!("Wrapping (modular) addition. Computes `self + rhs`, wrapping around at the
1098 boundary of the type.
1099
1100 # Examples
1101
1102 Basic usage:
1103
1104 ```
1105 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_add(27), 127);
1106 assert_eq!(", stringify!($SelfT), "::max_value().wrapping_add(2), ", stringify!($SelfT),
1107 "::min_value() + 1);",
1108 $EndFeature, "
1109 ```"),
1110             #[stable(feature = "rust1", since = "1.0.0")]
1111             #[must_use = "this returns the result of the operation, \
1112                           without modifying the original"]
1113             #[inline]
1114             pub const fn wrapping_add(self, rhs: Self) -> Self {
1115                 #[cfg(boostrap_stdarch_ignore_this)] {
1116                     intrinsics::overflowing_add(self, rhs)
1117                 }
1118
1119                 #[cfg(not(boostrap_stdarch_ignore_this))] {
1120                     intrinsics::wrapping_add(self, rhs)
1121                 }
1122             }
1123         }
1124
1125         doc_comment! {
1126             concat!("Wrapping (modular) subtraction. Computes `self - rhs`, wrapping around at the
1127 boundary of the type.
1128
1129 # Examples
1130
1131 Basic usage:
1132
1133 ```
1134 ", $Feature, "assert_eq!(0", stringify!($SelfT), ".wrapping_sub(127), -127);
1135 assert_eq!((-2", stringify!($SelfT), ").wrapping_sub(", stringify!($SelfT), "::max_value()), ",
1136 stringify!($SelfT), "::max_value());",
1137 $EndFeature, "
1138 ```"),
1139             #[stable(feature = "rust1", since = "1.0.0")]
1140             #[must_use = "this returns the result of the operation, \
1141                           without modifying the original"]
1142             #[inline]
1143             pub const fn wrapping_sub(self, rhs: Self) -> Self {
1144                 #[cfg(boostrap_stdarch_ignore_this)] {
1145                     intrinsics::overflowing_sub(self, rhs)
1146                 }
1147
1148                 #[cfg(not(boostrap_stdarch_ignore_this))] {
1149                     intrinsics::wrapping_sub(self, rhs)
1150                 }
1151             }
1152         }
1153
1154         doc_comment! {
1155             concat!("Wrapping (modular) multiplication. Computes `self * rhs`, wrapping around at
1156 the boundary of the type.
1157
1158 # Examples
1159
1160 Basic usage:
1161
1162 ```
1163 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".wrapping_mul(12), 120);
1164 assert_eq!(11i8.wrapping_mul(12), -124);",
1165 $EndFeature, "
1166 ```"),
1167             #[stable(feature = "rust1", since = "1.0.0")]
1168             #[must_use = "this returns the result of the operation, \
1169                           without modifying the original"]
1170             #[inline]
1171             pub const fn wrapping_mul(self, rhs: Self) -> Self {
1172                 #[cfg(boostrap_stdarch_ignore_this)] {
1173                     intrinsics::overflowing_mul(self, rhs)
1174                 }
1175
1176                 #[cfg(not(boostrap_stdarch_ignore_this))] {
1177                     intrinsics::wrapping_mul(self, rhs)
1178                 }
1179             }
1180         }
1181
1182         doc_comment! {
1183             concat!("Wrapping (modular) division. Computes `self / rhs`, wrapping around at the
1184 boundary of the type.
1185
1186 The only case where such wrapping can occur is when one divides `MIN / -1` on a signed type (where
1187 `MIN` is the negative minimal value for the type); this is equivalent to `-MIN`, a positive value
1188 that is too large to represent in the type. In such a case, this function returns `MIN` itself.
1189
1190 # Panics
1191
1192 This function will panic if `rhs` is 0.
1193
1194 # Examples
1195
1196 Basic usage:
1197
1198 ```
1199 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_div(10), 10);
1200 assert_eq!((-128i8).wrapping_div(-1), -128);",
1201 $EndFeature, "
1202 ```"),
1203             #[stable(feature = "num_wrapping", since = "1.2.0")]
1204             #[must_use = "this returns the result of the operation, \
1205                           without modifying the original"]
1206             #[inline]
1207             pub fn wrapping_div(self, rhs: Self) -> Self {
1208                 self.overflowing_div(rhs).0
1209             }
1210         }
1211
1212         doc_comment! {
1213             concat!("Wrapping Euclidean division. Computes `self.div_euclid(rhs)`,
1214 wrapping around at the boundary of the type.
1215
1216 Wrapping will only occur in `MIN / -1` on a signed type (where `MIN` is the negative minimal value
1217 for the type). This is equivalent to `-MIN`, a positive value that is too large to represent in the
1218 type. In this case, this method returns `MIN` itself.
1219
1220 # Panics
1221
1222 This function will panic if `rhs` is 0.
1223
1224 # Examples
1225
1226 Basic usage:
1227
1228 ```
1229 assert_eq!(100", stringify!($SelfT), ".wrapping_div_euclid(10), 10);
1230 assert_eq!((-128i8).wrapping_div_euclid(-1), -128);
1231 ```"),
1232             #[stable(feature = "euclidean_division", since = "1.38.0")]
1233             #[must_use = "this returns the result of the operation, \
1234                           without modifying the original"]
1235             #[inline]
1236             pub fn wrapping_div_euclid(self, rhs: Self) -> Self {
1237                 self.overflowing_div_euclid(rhs).0
1238             }
1239         }
1240
1241         doc_comment! {
1242             concat!("Wrapping (modular) remainder. Computes `self % rhs`, wrapping around at the
1243 boundary of the type.
1244
1245 Such wrap-around never actually occurs mathematically; implementation artifacts make `x % y`
1246 invalid for `MIN / -1` on a signed type (where `MIN` is the negative minimal value). In such a case,
1247 this function returns `0`.
1248
1249 # Panics
1250
1251 This function will panic if `rhs` is 0.
1252
1253 # Examples
1254
1255 Basic usage:
1256
1257 ```
1258 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_rem(10), 0);
1259 assert_eq!((-128i8).wrapping_rem(-1), 0);",
1260 $EndFeature, "
1261 ```"),
1262             #[stable(feature = "num_wrapping", since = "1.2.0")]
1263             #[must_use = "this returns the result of the operation, \
1264                           without modifying the original"]
1265             #[inline]
1266             pub fn wrapping_rem(self, rhs: Self) -> Self {
1267                 self.overflowing_rem(rhs).0
1268             }
1269         }
1270
1271         doc_comment! {
1272             concat!("Wrapping Euclidean remainder. Computes `self.rem_euclid(rhs)`, wrapping around
1273 at the boundary of the type.
1274
1275 Wrapping will only occur in `MIN % -1` on a signed type (where `MIN` is the negative minimal value
1276 for the type). In this case, this method returns 0.
1277
1278 # Panics
1279
1280 This function will panic if `rhs` is 0.
1281
1282 # Examples
1283
1284 Basic usage:
1285
1286 ```
1287 assert_eq!(100", stringify!($SelfT), ".wrapping_rem_euclid(10), 0);
1288 assert_eq!((-128i8).wrapping_rem_euclid(-1), 0);
1289 ```"),
1290             #[stable(feature = "euclidean_division", since = "1.38.0")]
1291             #[must_use = "this returns the result of the operation, \
1292                           without modifying the original"]
1293             #[inline]
1294             pub fn wrapping_rem_euclid(self, rhs: Self) -> Self {
1295                 self.overflowing_rem_euclid(rhs).0
1296             }
1297         }
1298
1299         doc_comment! {
1300             concat!("Wrapping (modular) negation. Computes `-self`, wrapping around at the boundary
1301 of the type.
1302
1303 The only case where such wrapping can occur is when one negates `MIN` on a signed type (where `MIN`
1304 is the negative minimal value for the type); this is a positive value that is too large to represent
1305 in the type. In such a case, this function returns `MIN` itself.
1306
1307 # Examples
1308
1309 Basic usage:
1310
1311 ```
1312 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_neg(), -100);
1313 assert_eq!(", stringify!($SelfT), "::min_value().wrapping_neg(), ", stringify!($SelfT),
1314 "::min_value());",
1315 $EndFeature, "
1316 ```"),
1317             #[stable(feature = "num_wrapping", since = "1.2.0")]
1318             #[inline]
1319             pub const fn wrapping_neg(self) -> Self {
1320                 self.overflowing_neg().0
1321             }
1322         }
1323
1324         doc_comment! {
1325             concat!("Panic-free bitwise shift-left; yields `self << mask(rhs)`, where `mask` removes
1326 any high-order bits of `rhs` that would cause the shift to exceed the bitwidth of the type.
1327
1328 Note that this is *not* the same as a rotate-left; the RHS of a wrapping shift-left is restricted to
1329 the range of the type, rather than the bits shifted out of the LHS being returned to the other end.
1330 The primitive integer types all implement a `rotate_left` function, which may be what you want
1331 instead.
1332
1333 # Examples
1334
1335 Basic usage:
1336
1337 ```
1338 ", $Feature, "assert_eq!((-1", stringify!($SelfT), ").wrapping_shl(7), -128);
1339 assert_eq!((-1", stringify!($SelfT), ").wrapping_shl(128), -1);",
1340 $EndFeature, "
1341 ```"),
1342             #[stable(feature = "num_wrapping", since = "1.2.0")]
1343             #[must_use = "this returns the result of the operation, \
1344                           without modifying the original"]
1345             #[inline]
1346             pub const fn wrapping_shl(self, rhs: u32) -> Self {
1347                 unsafe {
1348                     intrinsics::unchecked_shl(self, (rhs & ($BITS - 1)) as $SelfT)
1349                 }
1350             }
1351         }
1352
1353         doc_comment! {
1354             concat!("Panic-free bitwise shift-right; yields `self >> mask(rhs)`, where `mask`
1355 removes any high-order bits of `rhs` that would cause the shift to exceed the bitwidth of the type.
1356
1357 Note that this is *not* the same as a rotate-right; the RHS of a wrapping shift-right is restricted
1358 to the range of the type, rather than the bits shifted out of the LHS being returned to the other
1359 end. The primitive integer types all implement a `rotate_right` function, which may be what you want
1360 instead.
1361
1362 # Examples
1363
1364 Basic usage:
1365
1366 ```
1367 ", $Feature, "assert_eq!((-128", stringify!($SelfT), ").wrapping_shr(7), -1);
1368 assert_eq!((-128i16).wrapping_shr(64), -128);",
1369 $EndFeature, "
1370 ```"),
1371             #[stable(feature = "num_wrapping", since = "1.2.0")]
1372             #[must_use = "this returns the result of the operation, \
1373                           without modifying the original"]
1374             #[inline]
1375             pub const fn wrapping_shr(self, rhs: u32) -> Self {
1376                 unsafe {
1377                     intrinsics::unchecked_shr(self, (rhs & ($BITS - 1)) as $SelfT)
1378                 }
1379             }
1380         }
1381
1382         doc_comment! {
1383             concat!("Wrapping (modular) absolute value. Computes `self.abs()`, wrapping around at
1384 the boundary of the type.
1385
1386 The only case where such wrapping can occur is when one takes the absolute value of the negative
1387 minimal value for the type this is a positive value that is too large to represent in the type. In
1388 such a case, this function returns `MIN` itself.
1389
1390 # Examples
1391
1392 Basic usage:
1393
1394 ```
1395 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_abs(), 100);
1396 assert_eq!((-100", stringify!($SelfT), ").wrapping_abs(), 100);
1397 assert_eq!(", stringify!($SelfT), "::min_value().wrapping_abs(), ", stringify!($SelfT),
1398 "::min_value());
1399 assert_eq!((-128i8).wrapping_abs() as u8, 128);",
1400 $EndFeature, "
1401 ```"),
1402             #[stable(feature = "no_panic_abs", since = "1.13.0")]
1403             #[inline]
1404             pub const fn wrapping_abs(self) -> Self {
1405                 (self ^ (self >> ($BITS - 1))).wrapping_sub(self >> ($BITS - 1))
1406             }
1407         }
1408
1409         doc_comment! {
1410             concat!("Wrapping (modular) exponentiation. Computes `self.pow(exp)`,
1411 wrapping around at the boundary of the type.
1412
1413 # Examples
1414
1415 Basic usage:
1416
1417 ```
1418 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".wrapping_pow(4), 81);
1419 assert_eq!(3i8.wrapping_pow(5), -13);
1420 assert_eq!(3i8.wrapping_pow(6), -39);",
1421 $EndFeature, "
1422 ```"),
1423             #[stable(feature = "no_panic_pow", since = "1.34.0")]
1424             #[must_use = "this returns the result of the operation, \
1425                           without modifying the original"]
1426             #[inline]
1427             pub fn wrapping_pow(self, mut exp: u32) -> Self {
1428                 let mut base = self;
1429                 let mut acc: Self = 1;
1430
1431                 while exp > 1 {
1432                     if (exp & 1) == 1 {
1433                         acc = acc.wrapping_mul(base);
1434                     }
1435                     exp /= 2;
1436                     base = base.wrapping_mul(base);
1437                 }
1438
1439                 // Deal with the final bit of the exponent separately, since
1440                 // squaring the base afterwards is not necessary and may cause a
1441                 // needless overflow.
1442                 if exp == 1 {
1443                     acc = acc.wrapping_mul(base);
1444                 }
1445
1446                 acc
1447             }
1448         }
1449
1450         doc_comment! {
1451             concat!("Calculates `self` + `rhs`
1452
1453 Returns a tuple of the addition along with a boolean indicating whether an arithmetic overflow would
1454 occur. If an overflow would have occurred then the wrapped value is returned.
1455
1456 # Examples
1457
1458 Basic usage:
1459
1460 ```
1461 ", $Feature, "use std::", stringify!($SelfT), ";
1462
1463 assert_eq!(5", stringify!($SelfT), ".overflowing_add(2), (7, false));
1464 assert_eq!(", stringify!($SelfT), "::MAX.overflowing_add(1), (", stringify!($SelfT),
1465 "::MIN, true));", $EndFeature, "
1466 ```"),
1467             #[stable(feature = "wrapping", since = "1.7.0")]
1468             #[must_use = "this returns the result of the operation, \
1469                           without modifying the original"]
1470             #[inline]
1471             pub const fn overflowing_add(self, rhs: Self) -> (Self, bool) {
1472                 let (a, b) = intrinsics::add_with_overflow(self as $ActualT, rhs as $ActualT);
1473                 (a as Self, b)
1474             }
1475         }
1476
1477         doc_comment! {
1478             concat!("Calculates `self` - `rhs`
1479
1480 Returns a tuple of the subtraction along with a boolean indicating whether an arithmetic overflow
1481 would occur. If an overflow would have occurred then the wrapped value is returned.
1482
1483 # Examples
1484
1485 Basic usage:
1486
1487 ```
1488 ", $Feature, "use std::", stringify!($SelfT), ";
1489
1490 assert_eq!(5", stringify!($SelfT), ".overflowing_sub(2), (3, false));
1491 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_sub(1), (", stringify!($SelfT),
1492 "::MAX, true));", $EndFeature, "
1493 ```"),
1494             #[stable(feature = "wrapping", since = "1.7.0")]
1495             #[must_use = "this returns the result of the operation, \
1496                           without modifying the original"]
1497             #[inline]
1498             pub const fn overflowing_sub(self, rhs: Self) -> (Self, bool) {
1499                 let (a, b) = intrinsics::sub_with_overflow(self as $ActualT, rhs as $ActualT);
1500                 (a as Self, b)
1501             }
1502         }
1503
1504         doc_comment! {
1505             concat!("Calculates the multiplication of `self` and `rhs`.
1506
1507 Returns a tuple of the multiplication along with a boolean indicating whether an arithmetic overflow
1508 would occur. If an overflow would have occurred then the wrapped value is returned.
1509
1510 # Examples
1511
1512 Basic usage:
1513
1514 ```
1515 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".overflowing_mul(2), (10, false));
1516 assert_eq!(1_000_000_000i32.overflowing_mul(10), (1410065408, true));",
1517 $EndFeature, "
1518 ```"),
1519             #[stable(feature = "wrapping", since = "1.7.0")]
1520             #[must_use = "this returns the result of the operation, \
1521                           without modifying the original"]
1522             #[inline]
1523             pub const fn overflowing_mul(self, rhs: Self) -> (Self, bool) {
1524                 let (a, b) = intrinsics::mul_with_overflow(self as $ActualT, rhs as $ActualT);
1525                 (a as Self, b)
1526             }
1527         }
1528
1529         doc_comment! {
1530             concat!("Calculates the divisor when `self` is divided by `rhs`.
1531
1532 Returns a tuple of the divisor along with a boolean indicating whether an arithmetic overflow would
1533 occur. If an overflow would occur then self is returned.
1534
1535 # Panics
1536
1537 This function will panic if `rhs` is 0.
1538
1539 # Examples
1540
1541 Basic usage:
1542
1543 ```
1544 ", $Feature, "use std::", stringify!($SelfT), ";
1545
1546 assert_eq!(5", stringify!($SelfT), ".overflowing_div(2), (2, false));
1547 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_div(-1), (", stringify!($SelfT),
1548 "::MIN, true));",
1549 $EndFeature, "
1550 ```"),
1551             #[inline]
1552             #[stable(feature = "wrapping", since = "1.7.0")]
1553             #[must_use = "this returns the result of the operation, \
1554                           without modifying the original"]
1555             pub fn overflowing_div(self, rhs: Self) -> (Self, bool) {
1556                 if self == Self::min_value() && rhs == -1 {
1557                     (self, true)
1558                 } else {
1559                     (self / rhs, false)
1560                 }
1561             }
1562         }
1563
1564         doc_comment! {
1565             concat!("Calculates the quotient of Euclidean division `self.div_euclid(rhs)`.
1566
1567 Returns a tuple of the divisor along with a boolean indicating whether an arithmetic overflow would
1568 occur. If an overflow would occur then `self` is returned.
1569
1570 # Panics
1571
1572 This function will panic if `rhs` is 0.
1573
1574 # Examples
1575
1576 Basic usage:
1577
1578 ```
1579 use std::", stringify!($SelfT), ";
1580
1581 assert_eq!(5", stringify!($SelfT), ".overflowing_div_euclid(2), (2, false));
1582 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_div_euclid(-1), (", stringify!($SelfT),
1583 "::MIN, true));
1584 ```"),
1585             #[inline]
1586             #[stable(feature = "euclidean_division", since = "1.38.0")]
1587             #[must_use = "this returns the result of the operation, \
1588                           without modifying the original"]
1589             pub fn overflowing_div_euclid(self, rhs: Self) -> (Self, bool) {
1590                 if self == Self::min_value() && rhs == -1 {
1591                     (self, true)
1592                 } else {
1593                     (self.div_euclid(rhs), false)
1594                 }
1595             }
1596         }
1597
1598         doc_comment! {
1599             concat!("Calculates the remainder when `self` is divided by `rhs`.
1600
1601 Returns a tuple of the remainder after dividing along with a boolean indicating whether an
1602 arithmetic overflow would occur. If an overflow would occur then 0 is returned.
1603
1604 # Panics
1605
1606 This function will panic if `rhs` is 0.
1607
1608 # Examples
1609
1610 Basic usage:
1611
1612 ```
1613 ", $Feature, "use std::", stringify!($SelfT), ";
1614
1615 assert_eq!(5", stringify!($SelfT), ".overflowing_rem(2), (1, false));
1616 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_rem(-1), (0, true));",
1617 $EndFeature, "
1618 ```"),
1619             #[inline]
1620             #[stable(feature = "wrapping", since = "1.7.0")]
1621             #[must_use = "this returns the result of the operation, \
1622                           without modifying the original"]
1623             pub fn overflowing_rem(self, rhs: Self) -> (Self, bool) {
1624                 if self == Self::min_value() && rhs == -1 {
1625                     (0, true)
1626                 } else {
1627                     (self % rhs, false)
1628                 }
1629             }
1630         }
1631
1632
1633         doc_comment! {
1634             concat!("Overflowing Euclidean remainder. Calculates `self.rem_euclid(rhs)`.
1635
1636 Returns a tuple of the remainder after dividing along with a boolean indicating whether an
1637 arithmetic overflow would occur. If an overflow would occur then 0 is returned.
1638
1639 # Panics
1640
1641 This function will panic if `rhs` is 0.
1642
1643 # Examples
1644
1645 Basic usage:
1646
1647 ```
1648 use std::", stringify!($SelfT), ";
1649
1650 assert_eq!(5", stringify!($SelfT), ".overflowing_rem_euclid(2), (1, false));
1651 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_rem_euclid(-1), (0, true));
1652 ```"),
1653             #[stable(feature = "euclidean_division", since = "1.38.0")]
1654             #[must_use = "this returns the result of the operation, \
1655                           without modifying the original"]
1656             #[inline]
1657             pub fn overflowing_rem_euclid(self, rhs: Self) -> (Self, bool) {
1658                 if self == Self::min_value() && rhs == -1 {
1659                     (0, true)
1660                 } else {
1661                     (self.rem_euclid(rhs), false)
1662                 }
1663             }
1664         }
1665
1666
1667         doc_comment! {
1668             concat!("Negates self, overflowing if this is equal to the minimum value.
1669
1670 Returns a tuple of the negated version of self along with a boolean indicating whether an overflow
1671 happened. If `self` is the minimum value (e.g., `i32::MIN` for values of type `i32`), then the
1672 minimum value will be returned again and `true` will be returned for an overflow happening.
1673
1674 # Examples
1675
1676 Basic usage:
1677
1678 ```
1679 ", $Feature, "use std::", stringify!($SelfT), ";
1680
1681 assert_eq!(2", stringify!($SelfT), ".overflowing_neg(), (-2, false));
1682 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_neg(), (", stringify!($SelfT),
1683 "::MIN, true));", $EndFeature, "
1684 ```"),
1685             #[inline]
1686             #[stable(feature = "wrapping", since = "1.7.0")]
1687             pub const fn overflowing_neg(self) -> (Self, bool) {
1688                 ((!self).wrapping_add(1), self == Self::min_value())
1689             }
1690         }
1691
1692         doc_comment! {
1693             concat!("Shifts self left by `rhs` bits.
1694
1695 Returns a tuple of the shifted version of self along with a boolean indicating whether the shift
1696 value was larger than or equal to the number of bits. If the shift value is too large, then value is
1697 masked (N-1) where N is the number of bits, and this value is then used to perform the shift.
1698
1699 # Examples
1700
1701 Basic usage:
1702
1703 ```
1704 ", $Feature, "assert_eq!(0x1", stringify!($SelfT),".overflowing_shl(4), (0x10, false));
1705 assert_eq!(0x1i32.overflowing_shl(36), (0x10, true));",
1706 $EndFeature, "
1707 ```"),
1708             #[stable(feature = "wrapping", since = "1.7.0")]
1709             #[must_use = "this returns the result of the operation, \
1710                           without modifying the original"]
1711             #[inline]
1712             pub const fn overflowing_shl(self, rhs: u32) -> (Self, bool) {
1713                 (self.wrapping_shl(rhs), (rhs > ($BITS - 1)))
1714             }
1715         }
1716
1717         doc_comment! {
1718             concat!("Shifts self right by `rhs` bits.
1719
1720 Returns a tuple of the shifted version of self along with a boolean indicating whether the shift
1721 value was larger than or equal to the number of bits. If the shift value is too large, then value is
1722 masked (N-1) where N is the number of bits, and this value is then used to perform the shift.
1723
1724 # Examples
1725
1726 Basic usage:
1727
1728 ```
1729 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".overflowing_shr(4), (0x1, false));
1730 assert_eq!(0x10i32.overflowing_shr(36), (0x1, true));",
1731 $EndFeature, "
1732 ```"),
1733             #[stable(feature = "wrapping", since = "1.7.0")]
1734             #[must_use = "this returns the result of the operation, \
1735                           without modifying the original"]
1736             #[inline]
1737             pub const fn overflowing_shr(self, rhs: u32) -> (Self, bool) {
1738                 (self.wrapping_shr(rhs), (rhs > ($BITS - 1)))
1739             }
1740         }
1741
1742         doc_comment! {
1743             concat!("Computes the absolute value of `self`.
1744
1745 Returns a tuple of the absolute version of self along with a boolean indicating whether an overflow
1746 happened. If self is the minimum value (e.g., ", stringify!($SelfT), "::MIN for values of type
1747  ", stringify!($SelfT), "), then the minimum value will be returned again and true will be returned
1748 for an overflow happening.
1749
1750 # Examples
1751
1752 Basic usage:
1753
1754 ```
1755 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".overflowing_abs(), (10, false));
1756 assert_eq!((-10", stringify!($SelfT), ").overflowing_abs(), (10, false));
1757 assert_eq!((", stringify!($SelfT), "::min_value()).overflowing_abs(), (", stringify!($SelfT),
1758 "::min_value(), true));",
1759 $EndFeature, "
1760 ```"),
1761             #[stable(feature = "no_panic_abs", since = "1.13.0")]
1762             #[inline]
1763             pub const fn overflowing_abs(self) -> (Self, bool) {
1764                 (self ^ (self >> ($BITS - 1))).overflowing_sub(self >> ($BITS - 1))
1765             }
1766         }
1767
1768         doc_comment! {
1769             concat!("Raises self to the power of `exp`, using exponentiation by squaring.
1770
1771 Returns a tuple of the exponentiation along with a bool indicating
1772 whether an overflow happened.
1773
1774 # Examples
1775
1776 Basic usage:
1777
1778 ```
1779 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".overflowing_pow(4), (81, false));
1780 assert_eq!(3i8.overflowing_pow(5), (-13, true));",
1781 $EndFeature, "
1782 ```"),
1783             #[stable(feature = "no_panic_pow", since = "1.34.0")]
1784             #[must_use = "this returns the result of the operation, \
1785                           without modifying the original"]
1786             #[inline]
1787             pub fn overflowing_pow(self, mut exp: u32) -> (Self, bool) {
1788                 let mut base = self;
1789                 let mut acc: Self = 1;
1790                 let mut overflown = false;
1791                 // Scratch space for storing results of overflowing_mul.
1792                 let mut r;
1793
1794                 while exp > 1 {
1795                     if (exp & 1) == 1 {
1796                         r = acc.overflowing_mul(base);
1797                         acc = r.0;
1798                         overflown |= r.1;
1799                     }
1800                     exp /= 2;
1801                     r = base.overflowing_mul(base);
1802                     base = r.0;
1803                     overflown |= r.1;
1804                 }
1805
1806                 // Deal with the final bit of the exponent separately, since
1807                 // squaring the base afterwards is not necessary and may cause a
1808                 // needless overflow.
1809                 if exp == 1 {
1810                     r = acc.overflowing_mul(base);
1811                     acc = r.0;
1812                     overflown |= r.1;
1813                 }
1814
1815                 (acc, overflown)
1816             }
1817         }
1818
1819         doc_comment! {
1820             concat!("Raises self to the power of `exp`, using exponentiation by squaring.
1821
1822 # Examples
1823
1824 Basic usage:
1825
1826 ```
1827 ", $Feature, "let x: ", stringify!($SelfT), " = 2; // or any other integer type
1828
1829 assert_eq!(x.pow(5), 32);",
1830 $EndFeature, "
1831 ```"),
1832             #[stable(feature = "rust1", since = "1.0.0")]
1833             #[must_use = "this returns the result of the operation, \
1834                           without modifying the original"]
1835             #[inline]
1836             #[rustc_inherit_overflow_checks]
1837             pub fn pow(self, mut exp: u32) -> Self {
1838                 let mut base = self;
1839                 let mut acc = 1;
1840
1841                 while exp > 1 {
1842                     if (exp & 1) == 1 {
1843                         acc = acc * base;
1844                     }
1845                     exp /= 2;
1846                     base = base * base;
1847                 }
1848
1849                 // Deal with the final bit of the exponent separately, since
1850                 // squaring the base afterwards is not necessary and may cause a
1851                 // needless overflow.
1852                 if exp == 1 {
1853                     acc = acc * base;
1854                 }
1855
1856                 acc
1857             }
1858         }
1859
1860         doc_comment! {
1861             concat!("Calculates the quotient of Euclidean division of `self` by `rhs`.
1862
1863 This computes the integer `n` such that `self = n * rhs + self.rem_euclid(rhs)`,
1864 with `0 <= self.rem_euclid(rhs) < rhs`.
1865
1866 In other words, the result is `self / rhs` rounded to the integer `n`
1867 such that `self >= n * rhs`.
1868 If `self > 0`, this is equal to round towards zero (the default in Rust);
1869 if `self < 0`, this is equal to round towards +/- infinity.
1870
1871 # Panics
1872
1873 This function will panic if `rhs` is 0.
1874
1875 # Examples
1876
1877 Basic usage:
1878
1879 ```
1880 let a: ", stringify!($SelfT), " = 7; // or any other integer type
1881 let b = 4;
1882
1883 assert_eq!(a.div_euclid(b), 1); // 7 >= 4 * 1
1884 assert_eq!(a.div_euclid(-b), -1); // 7 >= -4 * -1
1885 assert_eq!((-a).div_euclid(b), -2); // -7 >= 4 * -2
1886 assert_eq!((-a).div_euclid(-b), 2); // -7 >= -4 * 2
1887 ```"),
1888             #[stable(feature = "euclidean_division", since = "1.38.0")]
1889             #[must_use = "this returns the result of the operation, \
1890                           without modifying the original"]
1891             #[inline]
1892             #[rustc_inherit_overflow_checks]
1893             pub fn div_euclid(self, rhs: Self) -> Self {
1894                 let q = self / rhs;
1895                 if self % rhs < 0 {
1896                     return if rhs > 0 { q - 1 } else { q + 1 }
1897                 }
1898                 q
1899             }
1900         }
1901
1902
1903         doc_comment! {
1904             concat!("Calculates the least nonnegative remainder of `self (mod rhs)`.
1905
1906 This is done as if by the Euclidean division algorithm -- given
1907 `r = self.rem_euclid(rhs)`, `self = rhs * self.div_euclid(rhs) + r`, and
1908 `0 <= r < abs(rhs)`.
1909
1910 # Panics
1911
1912 This function will panic if `rhs` is 0.
1913
1914 # Examples
1915
1916 Basic usage:
1917
1918 ```
1919 let a: ", stringify!($SelfT), " = 7; // or any other integer type
1920 let b = 4;
1921
1922 assert_eq!(a.rem_euclid(b), 3);
1923 assert_eq!((-a).rem_euclid(b), 1);
1924 assert_eq!(a.rem_euclid(-b), 3);
1925 assert_eq!((-a).rem_euclid(-b), 1);
1926 ```"),
1927             #[stable(feature = "euclidean_division", since = "1.38.0")]
1928             #[must_use = "this returns the result of the operation, \
1929                           without modifying the original"]
1930             #[inline]
1931             #[rustc_inherit_overflow_checks]
1932             pub fn rem_euclid(self, rhs: Self) -> Self {
1933                 let r = self % rhs;
1934                 if r < 0 {
1935                     if rhs < 0 {
1936                         r - rhs
1937                     } else {
1938                         r + rhs
1939                     }
1940                 } else {
1941                     r
1942                 }
1943             }
1944         }
1945
1946         doc_comment! {
1947             concat!("Computes the absolute value of `self`.
1948
1949 # Overflow behavior
1950
1951 The absolute value of `", stringify!($SelfT), "::min_value()` cannot be represented as an
1952 `", stringify!($SelfT), "`, and attempting to calculate it will cause an overflow. This means that
1953 code in debug mode will trigger a panic on this case and optimized code will return `",
1954 stringify!($SelfT), "::min_value()` without a panic.
1955
1956 # Examples
1957
1958 Basic usage:
1959
1960 ```
1961 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".abs(), 10);
1962 assert_eq!((-10", stringify!($SelfT), ").abs(), 10);",
1963 $EndFeature, "
1964 ```"),
1965             #[stable(feature = "rust1", since = "1.0.0")]
1966             #[inline]
1967             #[rustc_inherit_overflow_checks]
1968             pub const fn abs(self) -> Self {
1969                 // Note that the #[inline] above means that the overflow
1970                 // semantics of the subtraction depend on the crate we're being
1971                 // inlined into.
1972                 (self ^ (self >> ($BITS - 1))) - (self >> ($BITS - 1))
1973             }
1974         }
1975
1976         doc_comment! {
1977             concat!("Returns a number representing sign of `self`.
1978
1979  - `0` if the number is zero
1980  - `1` if the number is positive
1981  - `-1` if the number is negative
1982
1983 # Examples
1984
1985 Basic usage:
1986
1987 ```
1988 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".signum(), 1);
1989 assert_eq!(0", stringify!($SelfT), ".signum(), 0);
1990 assert_eq!((-10", stringify!($SelfT), ").signum(), -1);",
1991 $EndFeature, "
1992 ```"),
1993             #[stable(feature = "rust1", since = "1.0.0")]
1994             #[rustc_const_unstable(feature = "const_int_sign")]
1995             #[inline]
1996             pub const fn signum(self) -> Self {
1997                 (self > 0) as Self - (self < 0) as Self
1998             }
1999         }
2000
2001         doc_comment! {
2002             concat!("Returns `true` if `self` is positive and `false` if the number is zero or
2003 negative.
2004
2005 # Examples
2006
2007 Basic usage:
2008
2009 ```
2010 ", $Feature, "assert!(10", stringify!($SelfT), ".is_positive());
2011 assert!(!(-10", stringify!($SelfT), ").is_positive());",
2012 $EndFeature, "
2013 ```"),
2014             #[stable(feature = "rust1", since = "1.0.0")]
2015             #[inline]
2016             pub const fn is_positive(self) -> bool { self > 0 }
2017         }
2018
2019         doc_comment! {
2020             concat!("Returns `true` if `self` is negative and `false` if the number is zero or
2021 positive.
2022
2023 # Examples
2024
2025 Basic usage:
2026
2027 ```
2028 ", $Feature, "assert!((-10", stringify!($SelfT), ").is_negative());
2029 assert!(!10", stringify!($SelfT), ".is_negative());",
2030 $EndFeature, "
2031 ```"),
2032             #[stable(feature = "rust1", since = "1.0.0")]
2033             #[inline]
2034             pub const fn is_negative(self) -> bool { self < 0 }
2035         }
2036
2037         doc_comment! {
2038             concat!("Return the memory representation of this integer as a byte array in
2039 big-endian (network) byte order.
2040 ",
2041 $to_xe_bytes_doc,
2042 "
2043 # Examples
2044
2045 ```
2046 let bytes = ", $swap_op, stringify!($SelfT), ".to_be_bytes();
2047 assert_eq!(bytes, ", $be_bytes, ");
2048 ```"),
2049             #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2050             #[rustc_const_unstable(feature = "const_int_conversion")]
2051             #[inline]
2052             pub const fn to_be_bytes(self) -> [u8; mem::size_of::<Self>()] {
2053                 self.to_be().to_ne_bytes()
2054             }
2055         }
2056
2057 doc_comment! {
2058             concat!("Return the memory representation of this integer as a byte array in
2059 little-endian byte order.
2060 ",
2061 $to_xe_bytes_doc,
2062 "
2063 # Examples
2064
2065 ```
2066 let bytes = ", $swap_op, stringify!($SelfT), ".to_le_bytes();
2067 assert_eq!(bytes, ", $le_bytes, ");
2068 ```"),
2069             #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2070             #[rustc_const_unstable(feature = "const_int_conversion")]
2071             #[inline]
2072             pub const fn to_le_bytes(self) -> [u8; mem::size_of::<Self>()] {
2073                 self.to_le().to_ne_bytes()
2074             }
2075         }
2076
2077         doc_comment! {
2078             concat!("
2079 Return the memory representation of this integer as a byte array in
2080 native byte order.
2081
2082 As the target platform's native endianness is used, portable code
2083 should use [`to_be_bytes`] or [`to_le_bytes`], as appropriate,
2084 instead.
2085 ",
2086 $to_xe_bytes_doc,
2087 "
2088 [`to_be_bytes`]: #method.to_be_bytes
2089 [`to_le_bytes`]: #method.to_le_bytes
2090
2091 # Examples
2092
2093 ```
2094 let bytes = ", $swap_op, stringify!($SelfT), ".to_ne_bytes();
2095 assert_eq!(bytes, if cfg!(target_endian = \"big\") {
2096         ", $be_bytes, "
2097     } else {
2098         ", $le_bytes, "
2099     });
2100 ```"),
2101             #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2102             #[rustc_const_unstable(feature = "const_int_conversion")]
2103             #[inline]
2104             pub const fn to_ne_bytes(self) -> [u8; mem::size_of::<Self>()] {
2105                 unsafe { mem::transmute(self) }
2106             }
2107         }
2108
2109 doc_comment! {
2110             concat!("Create an integer value from its representation as a byte array in
2111 big endian.
2112 ",
2113 $from_xe_bytes_doc,
2114 "
2115 # Examples
2116
2117 ```
2118 let value = ", stringify!($SelfT), "::from_be_bytes(", $be_bytes, ");
2119 assert_eq!(value, ", $swap_op, ");
2120 ```
2121
2122 When starting from a slice rather than an array, fallible conversion APIs can be used:
2123
2124 ```
2125 use std::convert::TryInto;
2126
2127 fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
2128     let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
2129     *input = rest;
2130     ", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
2131 }
2132 ```"),
2133             #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2134             #[rustc_const_unstable(feature = "const_int_conversion")]
2135             #[inline]
2136             pub const fn from_be_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
2137                 Self::from_be(Self::from_ne_bytes(bytes))
2138             }
2139         }
2140
2141 doc_comment! {
2142             concat!("
2143 Create an integer value from its representation as a byte array in
2144 little endian.
2145 ",
2146 $from_xe_bytes_doc,
2147 "
2148 # Examples
2149
2150 ```
2151 let value = ", stringify!($SelfT), "::from_le_bytes(", $le_bytes, ");
2152 assert_eq!(value, ", $swap_op, ");
2153 ```
2154
2155 When starting from a slice rather than an array, fallible conversion APIs can be used:
2156
2157 ```
2158 use std::convert::TryInto;
2159
2160 fn read_le_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
2161     let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
2162     *input = rest;
2163     ", stringify!($SelfT), "::from_le_bytes(int_bytes.try_into().unwrap())
2164 }
2165 ```"),
2166             #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2167             #[rustc_const_unstable(feature = "const_int_conversion")]
2168             #[inline]
2169             pub const fn from_le_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
2170                 Self::from_le(Self::from_ne_bytes(bytes))
2171             }
2172         }
2173
2174         doc_comment! {
2175             concat!("Create an integer value from its memory representation as a byte
2176 array in native endianness.
2177
2178 As the target platform's native endianness is used, portable code
2179 likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as
2180 appropriate instead.
2181
2182 [`from_be_bytes`]: #method.from_be_bytes
2183 [`from_le_bytes`]: #method.from_le_bytes
2184 ",
2185 $from_xe_bytes_doc,
2186 "
2187 # Examples
2188
2189 ```
2190 let value = ", stringify!($SelfT), "::from_ne_bytes(if cfg!(target_endian = \"big\") {
2191         ", $be_bytes, "
2192     } else {
2193         ", $le_bytes, "
2194     });
2195 assert_eq!(value, ", $swap_op, ");
2196 ```
2197
2198 When starting from a slice rather than an array, fallible conversion APIs can be used:
2199
2200 ```
2201 use std::convert::TryInto;
2202
2203 fn read_ne_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
2204     let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
2205     *input = rest;
2206     ", stringify!($SelfT), "::from_ne_bytes(int_bytes.try_into().unwrap())
2207 }
2208 ```"),
2209             #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2210             #[rustc_const_unstable(feature = "const_int_conversion")]
2211             #[inline]
2212             pub const fn from_ne_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
2213                 unsafe { mem::transmute(bytes) }
2214             }
2215         }
2216     }
2217 }
2218
2219 #[lang = "i8"]
2220 impl i8 {
2221     int_impl! { i8, i8, u8, 8, -128, 127, "", "", 2, "-0x7e", "0xa", "0x12", "0x12", "0x48",
2222         "[0x12]", "[0x12]", "", "" }
2223 }
2224
2225 #[lang = "i16"]
2226 impl i16 {
2227     int_impl! { i16, i16, u16, 16, -32768, 32767, "", "", 4, "-0x5ffd", "0x3a", "0x1234", "0x3412",
2228         "0x2c48", "[0x34, 0x12]", "[0x12, 0x34]", "", "" }
2229 }
2230
2231 #[lang = "i32"]
2232 impl i32 {
2233     int_impl! { i32, i32, u32, 32, -2147483648, 2147483647, "", "", 8, "0x10000b3", "0xb301",
2234         "0x12345678", "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]",
2235         "[0x12, 0x34, 0x56, 0x78]", "", "" }
2236 }
2237
2238 #[lang = "i64"]
2239 impl i64 {
2240     int_impl! { i64, i64, u64, 64, -9223372036854775808, 9223372036854775807, "", "", 12,
2241          "0xaa00000000006e1", "0x6e10aa", "0x1234567890123456", "0x5634129078563412",
2242          "0x6a2c48091e6a2c48", "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
2243          "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]", "", "" }
2244 }
2245
2246 #[lang = "i128"]
2247 impl i128 {
2248     int_impl! { i128, i128, u128, 128, -170141183460469231731687303715884105728,
2249         170141183460469231731687303715884105727, "", "", 16,
2250         "0x13f40000000000000000000000004f76", "0x4f7613f4", "0x12345678901234567890123456789012",
2251         "0x12907856341290785634129078563412", "0x48091e6a2c48091e6a2c48091e6a2c48",
2252         "[0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, \
2253           0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
2254         "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, \
2255           0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12]", "", "" }
2256 }
2257
2258 #[cfg(target_pointer_width = "16")]
2259 #[lang = "isize"]
2260 impl isize {
2261     int_impl! { isize, i16, u16, 16, -32768, 32767, "", "", 4, "-0x5ffd", "0x3a", "0x1234",
2262         "0x3412", "0x2c48", "[0x34, 0x12]", "[0x12, 0x34]",
2263         usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
2264 }
2265
2266 #[cfg(target_pointer_width = "32")]
2267 #[lang = "isize"]
2268 impl isize {
2269     int_impl! { isize, i32, u32, 32, -2147483648, 2147483647, "", "", 8, "0x10000b3", "0xb301",
2270         "0x12345678", "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]",
2271         "[0x12, 0x34, 0x56, 0x78]",
2272         usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
2273 }
2274
2275 #[cfg(target_pointer_width = "64")]
2276 #[lang = "isize"]
2277 impl isize {
2278     int_impl! { isize, i64, u64, 64, -9223372036854775808, 9223372036854775807, "", "",
2279         12, "0xaa00000000006e1", "0x6e10aa",  "0x1234567890123456", "0x5634129078563412",
2280          "0x6a2c48091e6a2c48", "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
2281          "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]",
2282          usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
2283 }
2284
2285 // `Int` + `UnsignedInt` implemented for unsigned integers
2286 macro_rules! uint_impl {
2287     ($SelfT:ty, $ActualT:ty, $BITS:expr, $MaxV:expr, $Feature:expr, $EndFeature:expr,
2288         $rot:expr, $rot_op:expr, $rot_result:expr, $swap_op:expr, $swapped:expr,
2289         $reversed:expr, $le_bytes:expr, $be_bytes:expr,
2290         $to_xe_bytes_doc:expr, $from_xe_bytes_doc:expr) => {
2291         doc_comment! {
2292             concat!("Returns the smallest value that can be represented by this integer type.
2293
2294 # Examples
2295
2296 Basic usage:
2297
2298 ```
2299 ", $Feature, "assert_eq!(", stringify!($SelfT), "::min_value(), 0);", $EndFeature, "
2300 ```"),
2301             #[stable(feature = "rust1", since = "1.0.0")]
2302             #[rustc_promotable]
2303             #[inline]
2304             pub const fn min_value() -> Self { 0 }
2305         }
2306
2307         doc_comment! {
2308             concat!("Returns the largest value that can be represented by this integer type.
2309
2310 # Examples
2311
2312 Basic usage:
2313
2314 ```
2315 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value(), ",
2316 stringify!($MaxV), ");", $EndFeature, "
2317 ```"),
2318             #[stable(feature = "rust1", since = "1.0.0")]
2319             #[rustc_promotable]
2320             #[inline]
2321             pub const fn max_value() -> Self { !0 }
2322         }
2323
2324         doc_comment! {
2325             concat!("Converts a string slice in a given base to an integer.
2326
2327 The string is expected to be an optional `+` sign
2328 followed by digits.
2329 Leading and trailing whitespace represent an error.
2330 Digits are a subset of these characters, depending on `radix`:
2331
2332 * `0-9`
2333 * `a-z`
2334 * `A-Z`
2335
2336 # Panics
2337
2338 This function panics if `radix` is not in the range from 2 to 36.
2339
2340 # Examples
2341
2342 Basic usage:
2343
2344 ```
2345 ", $Feature, "assert_eq!(", stringify!($SelfT), "::from_str_radix(\"A\", 16), Ok(10));",
2346 $EndFeature, "
2347 ```"),
2348             #[stable(feature = "rust1", since = "1.0.0")]
2349             pub fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError> {
2350                 from_str_radix(src, radix)
2351             }
2352         }
2353
2354         doc_comment! {
2355             concat!("Returns the number of ones in the binary representation of `self`.
2356
2357 # Examples
2358
2359 Basic usage:
2360
2361 ```
2362 ", $Feature, "let n = 0b01001100", stringify!($SelfT), ";
2363
2364 assert_eq!(n.count_ones(), 3);", $EndFeature, "
2365 ```"),
2366             #[stable(feature = "rust1", since = "1.0.0")]
2367             #[inline]
2368             pub const fn count_ones(self) -> u32 {
2369                 intrinsics::ctpop(self as $ActualT) as u32
2370             }
2371         }
2372
2373         doc_comment! {
2374             concat!("Returns the number of zeros in the binary representation of `self`.
2375
2376 # Examples
2377
2378 Basic usage:
2379
2380 ```
2381 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value().count_zeros(), 0);", $EndFeature, "
2382 ```"),
2383             #[stable(feature = "rust1", since = "1.0.0")]
2384             #[inline]
2385             pub const fn count_zeros(self) -> u32 {
2386                 (!self).count_ones()
2387             }
2388         }
2389
2390         doc_comment! {
2391             concat!("Returns the number of leading zeros in the binary representation of `self`.
2392
2393 # Examples
2394
2395 Basic usage:
2396
2397 ```
2398 ", $Feature, "let n = ", stringify!($SelfT), "::max_value() >> 2;
2399
2400 assert_eq!(n.leading_zeros(), 2);", $EndFeature, "
2401 ```"),
2402             #[stable(feature = "rust1", since = "1.0.0")]
2403             #[inline]
2404             pub const fn leading_zeros(self) -> u32 {
2405                 intrinsics::ctlz(self as $ActualT) as u32
2406             }
2407         }
2408
2409         doc_comment! {
2410             concat!("Returns the number of trailing zeros in the binary representation
2411 of `self`.
2412
2413 # Examples
2414
2415 Basic usage:
2416
2417 ```
2418 ", $Feature, "let n = 0b0101000", stringify!($SelfT), ";
2419
2420 assert_eq!(n.trailing_zeros(), 3);", $EndFeature, "
2421 ```"),
2422             #[stable(feature = "rust1", since = "1.0.0")]
2423             #[inline]
2424             pub const fn trailing_zeros(self) -> u32 {
2425                 intrinsics::cttz(self) as u32
2426             }
2427         }
2428
2429         doc_comment! {
2430             concat!("Shifts the bits to the left by a specified amount, `n`,
2431 wrapping the truncated bits to the end of the resulting integer.
2432
2433 Please note this isn't the same operation as the `<<` shifting operator!
2434
2435 # Examples
2436
2437 Basic usage:
2438
2439 ```
2440 let n = ", $rot_op, stringify!($SelfT), ";
2441 let m = ", $rot_result, ";
2442
2443 assert_eq!(n.rotate_left(", $rot, "), m);
2444 ```"),
2445             #[stable(feature = "rust1", since = "1.0.0")]
2446             #[must_use = "this returns the result of the operation, \
2447                           without modifying the original"]
2448             #[inline]
2449             pub const fn rotate_left(self, n: u32) -> Self {
2450                 intrinsics::rotate_left(self, n as $SelfT)
2451             }
2452         }
2453
2454         doc_comment! {
2455             concat!("Shifts the bits to the right by a specified amount, `n`,
2456 wrapping the truncated bits to the beginning of the resulting
2457 integer.
2458
2459 Please note this isn't the same operation as the `>>` shifting operator!
2460
2461 # Examples
2462
2463 Basic usage:
2464
2465 ```
2466 let n = ", $rot_result, stringify!($SelfT), ";
2467 let m = ", $rot_op, ";
2468
2469 assert_eq!(n.rotate_right(", $rot, "), m);
2470 ```"),
2471             #[stable(feature = "rust1", since = "1.0.0")]
2472             #[must_use = "this returns the result of the operation, \
2473                           without modifying the original"]
2474             #[inline]
2475             pub const fn rotate_right(self, n: u32) -> Self {
2476                 intrinsics::rotate_right(self, n as $SelfT)
2477             }
2478         }
2479
2480         doc_comment! {
2481             concat!("
2482 Reverses the byte order of the integer.
2483
2484 # Examples
2485
2486 Basic usage:
2487
2488 ```
2489 let n = ", $swap_op, stringify!($SelfT), ";
2490 let m = n.swap_bytes();
2491
2492 assert_eq!(m, ", $swapped, ");
2493 ```"),
2494             #[stable(feature = "rust1", since = "1.0.0")]
2495             #[inline]
2496             pub const fn swap_bytes(self) -> Self {
2497                 intrinsics::bswap(self as $ActualT) as Self
2498             }
2499         }
2500
2501         doc_comment! {
2502             concat!("Reverses the bit pattern of the integer.
2503
2504 # Examples
2505
2506 Basic usage:
2507
2508 ```
2509 let n = ", $swap_op, stringify!($SelfT), ";
2510 let m = n.reverse_bits();
2511
2512 assert_eq!(m, ", $reversed, ");
2513 ```"),
2514             #[stable(feature = "reverse_bits", since = "1.37.0")]
2515             #[inline]
2516             #[must_use]
2517             pub const fn reverse_bits(self) -> Self {
2518                 intrinsics::bitreverse(self as $ActualT) as Self
2519             }
2520         }
2521
2522         doc_comment! {
2523             concat!("Converts an integer from big endian to the target's endianness.
2524
2525 On big endian this is a no-op. On little endian the bytes are
2526 swapped.
2527
2528 # Examples
2529
2530 Basic usage:
2531
2532 ```
2533 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2534
2535 if cfg!(target_endian = \"big\") {
2536     assert_eq!(", stringify!($SelfT), "::from_be(n), n)
2537 } else {
2538     assert_eq!(", stringify!($SelfT), "::from_be(n), n.swap_bytes())
2539 }", $EndFeature, "
2540 ```"),
2541             #[stable(feature = "rust1", since = "1.0.0")]
2542             #[inline]
2543             pub const fn from_be(x: Self) -> Self {
2544                 #[cfg(target_endian = "big")]
2545                 {
2546                     x
2547                 }
2548                 #[cfg(not(target_endian = "big"))]
2549                 {
2550                     x.swap_bytes()
2551                 }
2552             }
2553         }
2554
2555         doc_comment! {
2556             concat!("Converts an integer from little endian to the target's endianness.
2557
2558 On little endian this is a no-op. On big endian the bytes are
2559 swapped.
2560
2561 # Examples
2562
2563 Basic usage:
2564
2565 ```
2566 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2567
2568 if cfg!(target_endian = \"little\") {
2569     assert_eq!(", stringify!($SelfT), "::from_le(n), n)
2570 } else {
2571     assert_eq!(", stringify!($SelfT), "::from_le(n), n.swap_bytes())
2572 }", $EndFeature, "
2573 ```"),
2574             #[stable(feature = "rust1", since = "1.0.0")]
2575             #[inline]
2576             pub const fn from_le(x: Self) -> Self {
2577                 #[cfg(target_endian = "little")]
2578                 {
2579                     x
2580                 }
2581                 #[cfg(not(target_endian = "little"))]
2582                 {
2583                     x.swap_bytes()
2584                 }
2585             }
2586         }
2587
2588         doc_comment! {
2589             concat!("Converts `self` to big endian from the target's endianness.
2590
2591 On big endian this is a no-op. On little endian the bytes are
2592 swapped.
2593
2594 # Examples
2595
2596 Basic usage:
2597
2598 ```
2599 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2600
2601 if cfg!(target_endian = \"big\") {
2602     assert_eq!(n.to_be(), n)
2603 } else {
2604     assert_eq!(n.to_be(), n.swap_bytes())
2605 }", $EndFeature, "
2606 ```"),
2607             #[stable(feature = "rust1", since = "1.0.0")]
2608             #[inline]
2609             pub const fn to_be(self) -> Self { // or not to be?
2610                 #[cfg(target_endian = "big")]
2611                 {
2612                     self
2613                 }
2614                 #[cfg(not(target_endian = "big"))]
2615                 {
2616                     self.swap_bytes()
2617                 }
2618             }
2619         }
2620
2621         doc_comment! {
2622             concat!("Converts `self` to little endian from the target's endianness.
2623
2624 On little endian this is a no-op. On big endian the bytes are
2625 swapped.
2626
2627 # Examples
2628
2629 Basic usage:
2630
2631 ```
2632 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2633
2634 if cfg!(target_endian = \"little\") {
2635     assert_eq!(n.to_le(), n)
2636 } else {
2637     assert_eq!(n.to_le(), n.swap_bytes())
2638 }", $EndFeature, "
2639 ```"),
2640             #[stable(feature = "rust1", since = "1.0.0")]
2641             #[inline]
2642             pub const fn to_le(self) -> Self {
2643                 #[cfg(target_endian = "little")]
2644                 {
2645                     self
2646                 }
2647                 #[cfg(not(target_endian = "little"))]
2648                 {
2649                     self.swap_bytes()
2650                 }
2651             }
2652         }
2653
2654         doc_comment! {
2655             concat!("Checked integer addition. Computes `self + rhs`, returning `None`
2656 if overflow occurred.
2657
2658 # Examples
2659
2660 Basic usage:
2661
2662 ```
2663 ", $Feature, "assert_eq!((", stringify!($SelfT), "::max_value() - 2).checked_add(1), ",
2664 "Some(", stringify!($SelfT), "::max_value() - 1));
2665 assert_eq!((", stringify!($SelfT), "::max_value() - 2).checked_add(3), None);", $EndFeature, "
2666 ```"),
2667             #[stable(feature = "rust1", since = "1.0.0")]
2668             #[must_use = "this returns the result of the operation, \
2669                           without modifying the original"]
2670             #[inline]
2671             pub fn checked_add(self, rhs: Self) -> Option<Self> {
2672                 let (a, b) = self.overflowing_add(rhs);
2673                 if b {None} else {Some(a)}
2674             }
2675         }
2676
2677         doc_comment! {
2678             concat!("Checked integer subtraction. Computes `self - rhs`, returning
2679 `None` if overflow occurred.
2680
2681 # Examples
2682
2683 Basic usage:
2684
2685 ```
2686 ", $Feature, "assert_eq!(1", stringify!($SelfT), ".checked_sub(1), Some(0));
2687 assert_eq!(0", stringify!($SelfT), ".checked_sub(1), None);", $EndFeature, "
2688 ```"),
2689             #[stable(feature = "rust1", since = "1.0.0")]
2690             #[must_use = "this returns the result of the operation, \
2691                           without modifying the original"]
2692             #[inline]
2693             pub fn checked_sub(self, rhs: Self) -> Option<Self> {
2694                 let (a, b) = self.overflowing_sub(rhs);
2695                 if b {None} else {Some(a)}
2696             }
2697         }
2698
2699         doc_comment! {
2700             concat!("Checked integer multiplication. Computes `self * rhs`, returning
2701 `None` if overflow occurred.
2702
2703 # Examples
2704
2705 Basic usage:
2706
2707 ```
2708 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".checked_mul(1), Some(5));
2709 assert_eq!(", stringify!($SelfT), "::max_value().checked_mul(2), None);", $EndFeature, "
2710 ```"),
2711             #[stable(feature = "rust1", since = "1.0.0")]
2712             #[must_use = "this returns the result of the operation, \
2713                           without modifying the original"]
2714             #[inline]
2715             pub fn checked_mul(self, rhs: Self) -> Option<Self> {
2716                 let (a, b) = self.overflowing_mul(rhs);
2717                 if b {None} else {Some(a)}
2718             }
2719         }
2720
2721         doc_comment! {
2722             concat!("Checked integer division. Computes `self / rhs`, returning `None`
2723 if `rhs == 0`.
2724
2725 # Examples
2726
2727 Basic usage:
2728
2729 ```
2730 ", $Feature, "assert_eq!(128", stringify!($SelfT), ".checked_div(2), Some(64));
2731 assert_eq!(1", stringify!($SelfT), ".checked_div(0), None);", $EndFeature, "
2732 ```"),
2733             #[stable(feature = "rust1", since = "1.0.0")]
2734             #[must_use = "this returns the result of the operation, \
2735                           without modifying the original"]
2736             #[inline]
2737             pub fn checked_div(self, rhs: Self) -> Option<Self> {
2738                 match rhs {
2739                     0 => None,
2740                     rhs => Some(unsafe { intrinsics::unchecked_div(self, rhs) }),
2741                 }
2742             }
2743         }
2744
2745         doc_comment! {
2746             concat!("Checked Euclidean division. Computes `self.div_euclid(rhs)`, returning `None`
2747 if `rhs == 0`.
2748
2749 # Examples
2750
2751 Basic usage:
2752
2753 ```
2754 assert_eq!(128", stringify!($SelfT), ".checked_div_euclid(2), Some(64));
2755 assert_eq!(1", stringify!($SelfT), ".checked_div_euclid(0), None);
2756 ```"),
2757             #[stable(feature = "euclidean_division", since = "1.38.0")]
2758             #[must_use = "this returns the result of the operation, \
2759                           without modifying the original"]
2760             #[inline]
2761             pub fn checked_div_euclid(self, rhs: Self) -> Option<Self> {
2762                 if rhs == 0 {
2763                     None
2764                 } else {
2765                     Some(self.div_euclid(rhs))
2766                 }
2767             }
2768         }
2769
2770
2771         doc_comment! {
2772             concat!("Checked integer remainder. Computes `self % rhs`, returning `None`
2773 if `rhs == 0`.
2774
2775 # Examples
2776
2777 Basic usage:
2778
2779 ```
2780 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".checked_rem(2), Some(1));
2781 assert_eq!(5", stringify!($SelfT), ".checked_rem(0), None);", $EndFeature, "
2782 ```"),
2783             #[stable(feature = "wrapping", since = "1.7.0")]
2784             #[must_use = "this returns the result of the operation, \
2785                           without modifying the original"]
2786             #[inline]
2787             pub fn checked_rem(self, rhs: Self) -> Option<Self> {
2788                 if rhs == 0 {
2789                     None
2790                 } else {
2791                     Some(unsafe { intrinsics::unchecked_rem(self, rhs) })
2792                 }
2793             }
2794         }
2795
2796         doc_comment! {
2797             concat!("Checked Euclidean modulo. Computes `self.rem_euclid(rhs)`, returning `None`
2798 if `rhs == 0`.
2799
2800 # Examples
2801
2802 Basic usage:
2803
2804 ```
2805 assert_eq!(5", stringify!($SelfT), ".checked_rem_euclid(2), Some(1));
2806 assert_eq!(5", stringify!($SelfT), ".checked_rem_euclid(0), None);
2807 ```"),
2808             #[stable(feature = "euclidean_division", since = "1.38.0")]
2809             #[must_use = "this returns the result of the operation, \
2810                           without modifying the original"]
2811             #[inline]
2812             pub fn checked_rem_euclid(self, rhs: Self) -> Option<Self> {
2813                 if rhs == 0 {
2814                     None
2815                 } else {
2816                     Some(self.rem_euclid(rhs))
2817                 }
2818             }
2819         }
2820
2821         doc_comment! {
2822             concat!("Checked negation. Computes `-self`, returning `None` unless `self ==
2823 0`.
2824
2825 Note that negating any positive integer will overflow.
2826
2827 # Examples
2828
2829 Basic usage:
2830
2831 ```
2832 ", $Feature, "assert_eq!(0", stringify!($SelfT), ".checked_neg(), Some(0));
2833 assert_eq!(1", stringify!($SelfT), ".checked_neg(), None);", $EndFeature, "
2834 ```"),
2835             #[stable(feature = "wrapping", since = "1.7.0")]
2836             #[inline]
2837             pub fn checked_neg(self) -> Option<Self> {
2838                 let (a, b) = self.overflowing_neg();
2839                 if b {None} else {Some(a)}
2840             }
2841         }
2842
2843         doc_comment! {
2844             concat!("Checked shift left. Computes `self << rhs`, returning `None`
2845 if `rhs` is larger than or equal to the number of bits in `self`.
2846
2847 # Examples
2848
2849 Basic usage:
2850
2851 ```
2852 ", $Feature, "assert_eq!(0x1", stringify!($SelfT), ".checked_shl(4), Some(0x10));
2853 assert_eq!(0x10", stringify!($SelfT), ".checked_shl(129), None);", $EndFeature, "
2854 ```"),
2855             #[stable(feature = "wrapping", since = "1.7.0")]
2856             #[must_use = "this returns the result of the operation, \
2857                           without modifying the original"]
2858             #[inline]
2859             pub fn checked_shl(self, rhs: u32) -> Option<Self> {
2860                 let (a, b) = self.overflowing_shl(rhs);
2861                 if b {None} else {Some(a)}
2862             }
2863         }
2864
2865         doc_comment! {
2866             concat!("Checked shift right. Computes `self >> rhs`, returning `None`
2867 if `rhs` is larger than or equal to the number of bits in `self`.
2868
2869 # Examples
2870
2871 Basic usage:
2872
2873 ```
2874 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".checked_shr(4), Some(0x1));
2875 assert_eq!(0x10", stringify!($SelfT), ".checked_shr(129), None);", $EndFeature, "
2876 ```"),
2877             #[stable(feature = "wrapping", since = "1.7.0")]
2878             #[must_use = "this returns the result of the operation, \
2879                           without modifying the original"]
2880             #[inline]
2881             pub fn checked_shr(self, rhs: u32) -> Option<Self> {
2882                 let (a, b) = self.overflowing_shr(rhs);
2883                 if b {None} else {Some(a)}
2884             }
2885         }
2886
2887         doc_comment! {
2888             concat!("Checked exponentiation. Computes `self.pow(exp)`, returning `None` if
2889 overflow occurred.
2890
2891 # Examples
2892
2893 Basic usage:
2894
2895 ```
2896 ", $Feature, "assert_eq!(2", stringify!($SelfT), ".checked_pow(5), Some(32));
2897 assert_eq!(", stringify!($SelfT), "::max_value().checked_pow(2), None);", $EndFeature, "
2898 ```"),
2899             #[stable(feature = "no_panic_pow", since = "1.34.0")]
2900             #[must_use = "this returns the result of the operation, \
2901                           without modifying the original"]
2902             #[inline]
2903             pub fn checked_pow(self, mut exp: u32) -> Option<Self> {
2904                 let mut base = self;
2905                 let mut acc: Self = 1;
2906
2907                 while exp > 1 {
2908                     if (exp & 1) == 1 {
2909                         acc = acc.checked_mul(base)?;
2910                     }
2911                     exp /= 2;
2912                     base = base.checked_mul(base)?;
2913                 }
2914
2915                 // Deal with the final bit of the exponent separately, since
2916                 // squaring the base afterwards is not necessary and may cause a
2917                 // needless overflow.
2918                 if exp == 1 {
2919                     acc = acc.checked_mul(base)?;
2920                 }
2921
2922                 Some(acc)
2923             }
2924         }
2925
2926         doc_comment! {
2927             concat!("Saturating integer addition. Computes `self + rhs`, saturating at
2928 the numeric bounds instead of overflowing.
2929
2930 # Examples
2931
2932 Basic usage:
2933
2934 ```
2935 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_add(1), 101);
2936 assert_eq!(200u8.saturating_add(127), 255);", $EndFeature, "
2937 ```"),
2938
2939             #[stable(feature = "rust1", since = "1.0.0")]
2940             #[must_use = "this returns the result of the operation, \
2941                           without modifying the original"]
2942             #[rustc_const_unstable(feature = "const_saturating_int_methods")]
2943             #[inline]
2944             pub const fn saturating_add(self, rhs: Self) -> Self {
2945                 intrinsics::saturating_add(self, rhs)
2946             }
2947         }
2948
2949         doc_comment! {
2950             concat!("Saturating integer subtraction. Computes `self - rhs`, saturating
2951 at the numeric bounds instead of overflowing.
2952
2953 # Examples
2954
2955 Basic usage:
2956
2957 ```
2958 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_sub(27), 73);
2959 assert_eq!(13", stringify!($SelfT), ".saturating_sub(127), 0);", $EndFeature, "
2960 ```"),
2961             #[stable(feature = "rust1", since = "1.0.0")]
2962             #[must_use = "this returns the result of the operation, \
2963                           without modifying the original"]
2964             #[rustc_const_unstable(feature = "const_saturating_int_methods")]
2965             #[inline]
2966             pub const fn saturating_sub(self, rhs: Self) -> Self {
2967                 intrinsics::saturating_sub(self, rhs)
2968             }
2969         }
2970
2971         doc_comment! {
2972             concat!("Saturating integer multiplication. Computes `self * rhs`,
2973 saturating at the numeric bounds instead of overflowing.
2974
2975 # Examples
2976
2977 Basic usage:
2978
2979 ```
2980 ", $Feature, "use std::", stringify!($SelfT), ";
2981
2982 assert_eq!(2", stringify!($SelfT), ".saturating_mul(10), 20);
2983 assert_eq!((", stringify!($SelfT), "::MAX).saturating_mul(10), ", stringify!($SelfT),
2984 "::MAX);", $EndFeature, "
2985 ```"),
2986             #[stable(feature = "wrapping", since = "1.7.0")]
2987             #[must_use = "this returns the result of the operation, \
2988                           without modifying the original"]
2989             #[inline]
2990             pub fn saturating_mul(self, rhs: Self) -> Self {
2991                 self.checked_mul(rhs).unwrap_or(Self::max_value())
2992             }
2993         }
2994
2995         doc_comment! {
2996             concat!("Saturating integer exponentiation. Computes `self.pow(exp)`,
2997 saturating at the numeric bounds instead of overflowing.
2998
2999 # Examples
3000
3001 Basic usage:
3002
3003 ```
3004 ", $Feature, "use std::", stringify!($SelfT), ";
3005
3006 assert_eq!(4", stringify!($SelfT), ".saturating_pow(3), 64);
3007 assert_eq!(", stringify!($SelfT), "::MAX.saturating_pow(2), ", stringify!($SelfT), "::MAX);",
3008 $EndFeature, "
3009 ```"),
3010             #[stable(feature = "no_panic_pow", since = "1.34.0")]
3011             #[must_use = "this returns the result of the operation, \
3012                           without modifying the original"]
3013             #[inline]
3014             pub fn saturating_pow(self, exp: u32) -> Self {
3015                 match self.checked_pow(exp) {
3016                     Some(x) => x,
3017                     None => Self::max_value(),
3018                 }
3019             }
3020         }
3021
3022         doc_comment! {
3023             concat!("Wrapping (modular) addition. Computes `self + rhs`,
3024 wrapping around at the boundary of the type.
3025
3026 # Examples
3027
3028 Basic usage:
3029
3030 ```
3031 ", $Feature, "assert_eq!(200", stringify!($SelfT), ".wrapping_add(55), 255);
3032 assert_eq!(200", stringify!($SelfT), ".wrapping_add(", stringify!($SelfT), "::max_value()), 199);",
3033 $EndFeature, "
3034 ```"),
3035             #[stable(feature = "rust1", since = "1.0.0")]
3036             #[must_use = "this returns the result of the operation, \
3037                           without modifying the original"]
3038             #[inline]
3039             pub const fn wrapping_add(self, rhs: Self) -> Self {
3040                 #[cfg(boostrap_stdarch_ignore_this)] {
3041                     intrinsics::overflowing_add(self, rhs)
3042                 }
3043
3044                 #[cfg(not(boostrap_stdarch_ignore_this))] {
3045                     intrinsics::wrapping_add(self, rhs)
3046                 }
3047             }
3048         }
3049
3050         doc_comment! {
3051             concat!("Wrapping (modular) subtraction. Computes `self - rhs`,
3052 wrapping around at the boundary of the type.
3053
3054 # Examples
3055
3056 Basic usage:
3057
3058 ```
3059 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_sub(100), 0);
3060 assert_eq!(100", stringify!($SelfT), ".wrapping_sub(", stringify!($SelfT), "::max_value()), 101);",
3061 $EndFeature, "
3062 ```"),
3063             #[stable(feature = "rust1", since = "1.0.0")]
3064             #[must_use = "this returns the result of the operation, \
3065                           without modifying the original"]
3066             #[inline]
3067             pub const fn wrapping_sub(self, rhs: Self) -> Self {
3068                 #[cfg(boostrap_stdarch_ignore_this)] {
3069                     intrinsics::overflowing_sub(self, rhs)
3070                 }
3071
3072                 #[cfg(not(boostrap_stdarch_ignore_this))] {
3073                     intrinsics::wrapping_sub(self, rhs)
3074                 }
3075             }
3076         }
3077
3078         /// Wrapping (modular) multiplication. Computes `self *
3079         /// rhs`, wrapping around at the boundary of the type.
3080         ///
3081         /// # Examples
3082         ///
3083         /// Basic usage:
3084         ///
3085         /// Please note that this example is shared between integer types.
3086         /// Which explains why `u8` is used here.
3087         ///
3088         /// ```
3089         /// assert_eq!(10u8.wrapping_mul(12), 120);
3090         /// assert_eq!(25u8.wrapping_mul(12), 44);
3091         /// ```
3092         #[stable(feature = "rust1", since = "1.0.0")]
3093         #[must_use = "this returns the result of the operation, \
3094                           without modifying the original"]
3095         #[inline]
3096         pub const fn wrapping_mul(self, rhs: Self) -> Self {
3097             #[cfg(boostrap_stdarch_ignore_this)] {
3098                 intrinsics::overflowing_mul(self, rhs)
3099             }
3100
3101             #[cfg(not(boostrap_stdarch_ignore_this))] {
3102                 intrinsics::wrapping_mul(self, rhs)
3103             }
3104         }
3105
3106         doc_comment! {
3107             concat!("Wrapping (modular) division. Computes `self / rhs`.
3108 Wrapped division on unsigned types is just normal division.
3109 There's no way wrapping could ever happen.
3110 This function exists, so that all operations
3111 are accounted for in the wrapping operations.
3112
3113 # Examples
3114
3115 Basic usage:
3116
3117 ```
3118 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_div(10), 10);", $EndFeature, "
3119 ```"),
3120             #[stable(feature = "num_wrapping", since = "1.2.0")]
3121             #[must_use = "this returns the result of the operation, \
3122                           without modifying the original"]
3123             #[inline]
3124             pub fn wrapping_div(self, rhs: Self) -> Self {
3125                 self / rhs
3126             }
3127         }
3128
3129         doc_comment! {
3130             concat!("Wrapping Euclidean division. Computes `self.div_euclid(rhs)`.
3131 Wrapped division on unsigned types is just normal division.
3132 There's no way wrapping could ever happen.
3133 This function exists, so that all operations
3134 are accounted for in the wrapping operations.
3135 Since, for the positive integers, all common
3136 definitions of division are equal, this
3137 is exactly equal to `self.wrapping_div(rhs)`.
3138
3139 # Examples
3140
3141 Basic usage:
3142
3143 ```
3144 assert_eq!(100", stringify!($SelfT), ".wrapping_div_euclid(10), 10);
3145 ```"),
3146             #[stable(feature = "euclidean_division", since = "1.38.0")]
3147             #[must_use = "this returns the result of the operation, \
3148                           without modifying the original"]
3149             #[inline]
3150             pub fn wrapping_div_euclid(self, rhs: Self) -> Self {
3151                 self / rhs
3152             }
3153         }
3154
3155         doc_comment! {
3156             concat!("Wrapping (modular) remainder. Computes `self % rhs`.
3157 Wrapped remainder calculation on unsigned types is
3158 just the regular remainder calculation.
3159 There's no way wrapping could ever happen.
3160 This function exists, so that all operations
3161 are accounted for in the wrapping operations.
3162
3163 # Examples
3164
3165 Basic usage:
3166
3167 ```
3168 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_rem(10), 0);", $EndFeature, "
3169 ```"),
3170             #[stable(feature = "num_wrapping", since = "1.2.0")]
3171             #[must_use = "this returns the result of the operation, \
3172                           without modifying the original"]
3173             #[inline]
3174             pub fn wrapping_rem(self, rhs: Self) -> Self {
3175                 self % rhs
3176             }
3177         }
3178
3179         doc_comment! {
3180             concat!("Wrapping Euclidean modulo. Computes `self.rem_euclid(rhs)`.
3181 Wrapped modulo calculation on unsigned types is
3182 just the regular remainder calculation.
3183 There's no way wrapping could ever happen.
3184 This function exists, so that all operations
3185 are accounted for in the wrapping operations.
3186 Since, for the positive integers, all common
3187 definitions of division are equal, this
3188 is exactly equal to `self.wrapping_rem(rhs)`.
3189
3190 # Examples
3191
3192 Basic usage:
3193
3194 ```
3195 assert_eq!(100", stringify!($SelfT), ".wrapping_rem_euclid(10), 0);
3196 ```"),
3197             #[stable(feature = "euclidean_division", since = "1.38.0")]
3198             #[must_use = "this returns the result of the operation, \
3199                           without modifying the original"]
3200             #[inline]
3201             pub fn wrapping_rem_euclid(self, rhs: Self) -> Self {
3202                 self % rhs
3203             }
3204         }
3205
3206         /// Wrapping (modular) negation. Computes `-self`,
3207         /// wrapping around at the boundary of the type.
3208         ///
3209         /// Since unsigned types do not have negative equivalents
3210         /// all applications of this function will wrap (except for `-0`).
3211         /// For values smaller than the corresponding signed type's maximum
3212         /// the result is the same as casting the corresponding signed value.
3213         /// Any larger values are equivalent to `MAX + 1 - (val - MAX - 1)` where
3214         /// `MAX` is the corresponding signed type's maximum.
3215         ///
3216         /// # Examples
3217         ///
3218         /// Basic usage:
3219         ///
3220         /// Please note that this example is shared between integer types.
3221         /// Which explains why `i8` is used here.
3222         ///
3223         /// ```
3224         /// assert_eq!(100i8.wrapping_neg(), -100);
3225         /// assert_eq!((-128i8).wrapping_neg(), -128);
3226         /// ```
3227         #[stable(feature = "num_wrapping", since = "1.2.0")]
3228         #[inline]
3229         pub const fn wrapping_neg(self) -> Self {
3230             self.overflowing_neg().0
3231         }
3232
3233         doc_comment! {
3234             concat!("Panic-free bitwise shift-left; yields `self << mask(rhs)`,
3235 where `mask` removes any high-order bits of `rhs` that
3236 would cause the shift to exceed the bitwidth of the type.
3237
3238 Note that this is *not* the same as a rotate-left; the
3239 RHS of a wrapping shift-left is restricted to the range
3240 of the type, rather than the bits shifted out of the LHS
3241 being returned to the other end. The primitive integer
3242 types all implement a `rotate_left` function, which may
3243 be what you want instead.
3244
3245 # Examples
3246
3247 Basic usage:
3248
3249 ```
3250 ", $Feature, "assert_eq!(1", stringify!($SelfT), ".wrapping_shl(7), 128);
3251 assert_eq!(1", stringify!($SelfT), ".wrapping_shl(128), 1);", $EndFeature, "
3252 ```"),
3253             #[stable(feature = "num_wrapping", since = "1.2.0")]
3254             #[must_use = "this returns the result of the operation, \
3255                           without modifying the original"]
3256             #[inline]
3257             pub const fn wrapping_shl(self, rhs: u32) -> Self {
3258                 unsafe {
3259                     intrinsics::unchecked_shl(self, (rhs & ($BITS - 1)) as $SelfT)
3260                 }
3261             }
3262         }
3263
3264         doc_comment! {
3265             concat!("Panic-free bitwise shift-right; yields `self >> mask(rhs)`,
3266 where `mask` removes any high-order bits of `rhs` that
3267 would cause the shift to exceed the bitwidth of the type.
3268
3269 Note that this is *not* the same as a rotate-right; the
3270 RHS of a wrapping shift-right is restricted to the range
3271 of the type, rather than the bits shifted out of the LHS
3272 being returned to the other end. The primitive integer
3273 types all implement a `rotate_right` function, which may
3274 be what you want instead.
3275
3276 # Examples
3277
3278 Basic usage:
3279
3280 ```
3281 ", $Feature, "assert_eq!(128", stringify!($SelfT), ".wrapping_shr(7), 1);
3282 assert_eq!(128", stringify!($SelfT), ".wrapping_shr(128), 128);", $EndFeature, "
3283 ```"),
3284             #[stable(feature = "num_wrapping", since = "1.2.0")]
3285             #[must_use = "this returns the result of the operation, \
3286                           without modifying the original"]
3287             #[inline]
3288             pub const fn wrapping_shr(self, rhs: u32) -> Self {
3289                 unsafe {
3290                     intrinsics::unchecked_shr(self, (rhs & ($BITS - 1)) as $SelfT)
3291                 }
3292             }
3293         }
3294
3295         doc_comment! {
3296             concat!("Wrapping (modular) exponentiation. Computes `self.pow(exp)`,
3297 wrapping around at the boundary of the type.
3298
3299 # Examples
3300
3301 Basic usage:
3302
3303 ```
3304 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".wrapping_pow(5), 243);
3305 assert_eq!(3u8.wrapping_pow(6), 217);", $EndFeature, "
3306 ```"),
3307             #[stable(feature = "no_panic_pow", since = "1.34.0")]
3308             #[must_use = "this returns the result of the operation, \
3309                           without modifying the original"]
3310             #[inline]
3311             pub fn wrapping_pow(self, mut exp: u32) -> Self {
3312                 let mut base = self;
3313                 let mut acc: Self = 1;
3314
3315                 while exp > 1 {
3316                     if (exp & 1) == 1 {
3317                         acc = acc.wrapping_mul(base);
3318                     }
3319                     exp /= 2;
3320                     base = base.wrapping_mul(base);
3321                 }
3322
3323                 // Deal with the final bit of the exponent separately, since
3324                 // squaring the base afterwards is not necessary and may cause a
3325                 // needless overflow.
3326                 if exp == 1 {
3327                     acc = acc.wrapping_mul(base);
3328                 }
3329
3330                 acc
3331             }
3332         }
3333
3334         doc_comment! {
3335             concat!("Calculates `self` + `rhs`
3336
3337 Returns a tuple of the addition along with a boolean indicating
3338 whether an arithmetic overflow would occur. If an overflow would
3339 have occurred then the wrapped value is returned.
3340
3341 # Examples
3342
3343 Basic usage
3344
3345 ```
3346 ", $Feature, "use std::", stringify!($SelfT), ";
3347
3348 assert_eq!(5", stringify!($SelfT), ".overflowing_add(2), (7, false));
3349 assert_eq!(", stringify!($SelfT), "::MAX.overflowing_add(1), (0, true));", $EndFeature, "
3350 ```"),
3351             #[stable(feature = "wrapping", since = "1.7.0")]
3352             #[must_use = "this returns the result of the operation, \
3353                           without modifying the original"]
3354             #[inline]
3355             pub const fn overflowing_add(self, rhs: Self) -> (Self, bool) {
3356                 let (a, b) = intrinsics::add_with_overflow(self as $ActualT, rhs as $ActualT);
3357                 (a as Self, b)
3358             }
3359         }
3360
3361         doc_comment! {
3362             concat!("Calculates `self` - `rhs`
3363
3364 Returns a tuple of the subtraction along with a boolean indicating
3365 whether an arithmetic overflow would occur. If an overflow would
3366 have occurred then the wrapped value is returned.
3367
3368 # Examples
3369
3370 Basic usage
3371
3372 ```
3373 ", $Feature, "use std::", stringify!($SelfT), ";
3374
3375 assert_eq!(5", stringify!($SelfT), ".overflowing_sub(2), (3, false));
3376 assert_eq!(0", stringify!($SelfT), ".overflowing_sub(1), (", stringify!($SelfT), "::MAX, true));",
3377 $EndFeature, "
3378 ```"),
3379             #[stable(feature = "wrapping", since = "1.7.0")]
3380             #[must_use = "this returns the result of the operation, \
3381                           without modifying the original"]
3382             #[inline]
3383             pub const fn overflowing_sub(self, rhs: Self) -> (Self, bool) {
3384                 let (a, b) = intrinsics::sub_with_overflow(self as $ActualT, rhs as $ActualT);
3385                 (a as Self, b)
3386             }
3387         }
3388
3389         /// Calculates the multiplication of `self` and `rhs`.
3390         ///
3391         /// Returns a tuple of the multiplication along with a boolean
3392         /// indicating whether an arithmetic overflow would occur. If an
3393         /// overflow would have occurred then the wrapped value is returned.
3394         ///
3395         /// # Examples
3396         ///
3397         /// Basic usage:
3398         ///
3399         /// Please note that this example is shared between integer types.
3400         /// Which explains why `u32` is used here.
3401         ///
3402         /// ```
3403         /// assert_eq!(5u32.overflowing_mul(2), (10, false));
3404         /// assert_eq!(1_000_000_000u32.overflowing_mul(10), (1410065408, true));
3405         /// ```
3406         #[stable(feature = "wrapping", since = "1.7.0")]
3407         #[must_use = "this returns the result of the operation, \
3408                           without modifying the original"]
3409         #[inline]
3410         pub const fn overflowing_mul(self, rhs: Self) -> (Self, bool) {
3411             let (a, b) = intrinsics::mul_with_overflow(self as $ActualT, rhs as $ActualT);
3412             (a as Self, b)
3413         }
3414
3415         doc_comment! {
3416             concat!("Calculates the divisor when `self` is divided by `rhs`.
3417
3418 Returns a tuple of the divisor along with a boolean indicating
3419 whether an arithmetic overflow would occur. Note that for unsigned
3420 integers overflow never occurs, so the second value is always
3421 `false`.
3422
3423 # Panics
3424
3425 This function will panic if `rhs` is 0.
3426
3427 # Examples
3428
3429 Basic usage
3430
3431 ```
3432 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".overflowing_div(2), (2, false));", $EndFeature, "
3433 ```"),
3434             #[inline]
3435             #[stable(feature = "wrapping", since = "1.7.0")]
3436             #[must_use = "this returns the result of the operation, \
3437                           without modifying the original"]
3438             pub fn overflowing_div(self, rhs: Self) -> (Self, bool) {
3439                 (self / rhs, false)
3440             }
3441         }
3442
3443         doc_comment! {
3444             concat!("Calculates the quotient of Euclidean division `self.div_euclid(rhs)`.
3445
3446 Returns a tuple of the divisor along with a boolean indicating
3447 whether an arithmetic overflow would occur. Note that for unsigned
3448 integers overflow never occurs, so the second value is always
3449 `false`.
3450 Since, for the positive integers, all common
3451 definitions of division are equal, this
3452 is exactly equal to `self.overflowing_div(rhs)`.
3453
3454 # Panics
3455
3456 This function will panic if `rhs` is 0.
3457
3458 # Examples
3459
3460 Basic usage
3461
3462 ```
3463 assert_eq!(5", stringify!($SelfT), ".overflowing_div_euclid(2), (2, false));
3464 ```"),
3465             #[inline]
3466             #[stable(feature = "euclidean_division", since = "1.38.0")]
3467             #[must_use = "this returns the result of the operation, \
3468                           without modifying the original"]
3469             pub fn overflowing_div_euclid(self, rhs: Self) -> (Self, bool) {
3470                 (self / rhs, false)
3471             }
3472         }
3473
3474         doc_comment! {
3475             concat!("Calculates the remainder when `self` is divided by `rhs`.
3476
3477 Returns a tuple of the remainder after dividing along with a boolean
3478 indicating whether an arithmetic overflow would occur. Note that for
3479 unsigned integers overflow never occurs, so the second value is
3480 always `false`.
3481
3482 # Panics
3483
3484 This function will panic if `rhs` is 0.
3485
3486 # Examples
3487
3488 Basic usage
3489
3490 ```
3491 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".overflowing_rem(2), (1, false));", $EndFeature, "
3492 ```"),
3493             #[inline]
3494             #[stable(feature = "wrapping", since = "1.7.0")]
3495             #[must_use = "this returns the result of the operation, \
3496                           without modifying the original"]
3497             pub fn overflowing_rem(self, rhs: Self) -> (Self, bool) {
3498                 (self % rhs, false)
3499             }
3500         }
3501
3502         doc_comment! {
3503             concat!("Calculates the remainder `self.rem_euclid(rhs)` as if by Euclidean division.
3504
3505 Returns a tuple of the modulo after dividing along with a boolean
3506 indicating whether an arithmetic overflow would occur. Note that for
3507 unsigned integers overflow never occurs, so the second value is
3508 always `false`.
3509 Since, for the positive integers, all common
3510 definitions of division are equal, this operation
3511 is exactly equal to `self.overflowing_rem(rhs)`.
3512
3513 # Panics
3514
3515 This function will panic if `rhs` is 0.
3516
3517 # Examples
3518
3519 Basic usage
3520
3521 ```
3522 assert_eq!(5", stringify!($SelfT), ".overflowing_rem_euclid(2), (1, false));
3523 ```"),
3524             #[inline]
3525             #[stable(feature = "euclidean_division", since = "1.38.0")]
3526             #[must_use = "this returns the result of the operation, \
3527                           without modifying the original"]
3528             pub fn overflowing_rem_euclid(self, rhs: Self) -> (Self, bool) {
3529                 (self % rhs, false)
3530             }
3531         }
3532
3533         doc_comment! {
3534             concat!("Negates self in an overflowing fashion.
3535
3536 Returns `!self + 1` using wrapping operations to return the value
3537 that represents the negation of this unsigned value. Note that for
3538 positive unsigned values overflow always occurs, but negating 0 does
3539 not overflow.
3540
3541 # Examples
3542
3543 Basic usage
3544
3545 ```
3546 ", $Feature, "assert_eq!(0", stringify!($SelfT), ".overflowing_neg(), (0, false));
3547 assert_eq!(2", stringify!($SelfT), ".overflowing_neg(), (-2i32 as ", stringify!($SelfT),
3548 ", true));", $EndFeature, "
3549 ```"),
3550             #[inline]
3551             #[stable(feature = "wrapping", since = "1.7.0")]
3552             pub const fn overflowing_neg(self) -> (Self, bool) {
3553                 ((!self).wrapping_add(1), self != 0)
3554             }
3555         }
3556
3557         doc_comment! {
3558             concat!("Shifts self left by `rhs` bits.
3559
3560 Returns a tuple of the shifted version of self along with a boolean
3561 indicating whether the shift value was larger than or equal to the
3562 number of bits. If the shift value is too large, then value is
3563 masked (N-1) where N is the number of bits, and this value is then
3564 used to perform the shift.
3565
3566 # Examples
3567
3568 Basic usage
3569
3570 ```
3571 ", $Feature, "assert_eq!(0x1", stringify!($SelfT), ".overflowing_shl(4), (0x10, false));
3572 assert_eq!(0x1", stringify!($SelfT), ".overflowing_shl(132), (0x10, true));", $EndFeature, "
3573 ```"),
3574             #[stable(feature = "wrapping", since = "1.7.0")]
3575             #[must_use = "this returns the result of the operation, \
3576                           without modifying the original"]
3577             #[inline]
3578             pub const fn overflowing_shl(self, rhs: u32) -> (Self, bool) {
3579                 (self.wrapping_shl(rhs), (rhs > ($BITS - 1)))
3580             }
3581         }
3582
3583         doc_comment! {
3584             concat!("Shifts self right by `rhs` bits.
3585
3586 Returns a tuple of the shifted version of self along with a boolean
3587 indicating whether the shift value was larger than or equal to the
3588 number of bits. If the shift value is too large, then value is
3589 masked (N-1) where N is the number of bits, and this value is then
3590 used to perform the shift.
3591
3592 # Examples
3593
3594 Basic usage
3595
3596 ```
3597 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".overflowing_shr(4), (0x1, false));
3598 assert_eq!(0x10", stringify!($SelfT), ".overflowing_shr(132), (0x1, true));", $EndFeature, "
3599 ```"),
3600             #[stable(feature = "wrapping", since = "1.7.0")]
3601             #[must_use = "this returns the result of the operation, \
3602                           without modifying the original"]
3603             #[inline]
3604             pub const fn overflowing_shr(self, rhs: u32) -> (Self, bool) {
3605                 (self.wrapping_shr(rhs), (rhs > ($BITS - 1)))
3606             }
3607         }
3608
3609         doc_comment! {
3610             concat!("Raises self to the power of `exp`, using exponentiation by squaring.
3611
3612 Returns a tuple of the exponentiation along with a bool indicating
3613 whether an overflow happened.
3614
3615 # Examples
3616
3617 Basic usage:
3618
3619 ```
3620 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".overflowing_pow(5), (243, false));
3621 assert_eq!(3u8.overflowing_pow(6), (217, true));", $EndFeature, "
3622 ```"),
3623             #[stable(feature = "no_panic_pow", since = "1.34.0")]
3624             #[must_use = "this returns the result of the operation, \
3625                           without modifying the original"]
3626             #[inline]
3627             pub fn overflowing_pow(self, mut exp: u32) -> (Self, bool) {
3628                 let mut base = self;
3629                 let mut acc: Self = 1;
3630                 let mut overflown = false;
3631                 // Scratch space for storing results of overflowing_mul.
3632                 let mut r;
3633
3634                 while exp > 1 {
3635                     if (exp & 1) == 1 {
3636                         r = acc.overflowing_mul(base);
3637                         acc = r.0;
3638                         overflown |= r.1;
3639                     }
3640                     exp /= 2;
3641                     r = base.overflowing_mul(base);
3642                     base = r.0;
3643                     overflown |= r.1;
3644                 }
3645
3646                 // Deal with the final bit of the exponent separately, since
3647                 // squaring the base afterwards is not necessary and may cause a
3648                 // needless overflow.
3649                 if exp == 1 {
3650                     r = acc.overflowing_mul(base);
3651                     acc = r.0;
3652                     overflown |= r.1;
3653                 }
3654
3655                 (acc, overflown)
3656             }
3657         }
3658
3659         doc_comment! {
3660             concat!("Raises self to the power of `exp`, using exponentiation by squaring.
3661
3662 # Examples
3663
3664 Basic usage:
3665
3666 ```
3667 ", $Feature, "assert_eq!(2", stringify!($SelfT), ".pow(5), 32);", $EndFeature, "
3668 ```"),
3669         #[stable(feature = "rust1", since = "1.0.0")]
3670         #[must_use = "this returns the result of the operation, \
3671                           without modifying the original"]
3672         #[inline]
3673         #[rustc_inherit_overflow_checks]
3674         pub fn pow(self, mut exp: u32) -> Self {
3675             let mut base = self;
3676             let mut acc = 1;
3677
3678             while exp > 1 {
3679                 if (exp & 1) == 1 {
3680                     acc = acc * base;
3681                 }
3682                 exp /= 2;
3683                 base = base * base;
3684             }
3685
3686             // Deal with the final bit of the exponent separately, since
3687             // squaring the base afterwards is not necessary and may cause a
3688             // needless overflow.
3689             if exp == 1 {
3690                 acc = acc * base;
3691             }
3692
3693             acc
3694         }
3695     }
3696
3697             doc_comment! {
3698             concat!("Performs Euclidean division.
3699
3700 Since, for the positive integers, all common
3701 definitions of division are equal, this
3702 is exactly equal to `self / rhs`.
3703
3704 # Examples
3705
3706 Basic usage:
3707
3708 ```
3709 assert_eq!(7", stringify!($SelfT), ".div_euclid(4), 1); // or any other integer type
3710 ```"),
3711             #[stable(feature = "euclidean_division", since = "1.38.0")]
3712             #[must_use = "this returns the result of the operation, \
3713                           without modifying the original"]
3714             #[inline]
3715             #[rustc_inherit_overflow_checks]
3716             pub fn div_euclid(self, rhs: Self) -> Self {
3717                 self / rhs
3718             }
3719         }
3720
3721
3722         doc_comment! {
3723             concat!("Calculates the least remainder of `self (mod rhs)`.
3724
3725 Since, for the positive integers, all common
3726 definitions of division are equal, this
3727 is exactly equal to `self % rhs`.
3728
3729 # Examples
3730
3731 Basic usage:
3732
3733 ```
3734 assert_eq!(7", stringify!($SelfT), ".rem_euclid(4), 3); // or any other integer type
3735 ```"),
3736             #[stable(feature = "euclidean_division", since = "1.38.0")]
3737             #[must_use = "this returns the result of the operation, \
3738                           without modifying the original"]
3739             #[inline]
3740             #[rustc_inherit_overflow_checks]
3741             pub fn rem_euclid(self, rhs: Self) -> Self {
3742                 self % rhs
3743             }
3744         }
3745
3746         doc_comment! {
3747             concat!("Returns `true` if and only if `self == 2^k` for some `k`.
3748
3749 # Examples
3750
3751 Basic usage:
3752
3753 ```
3754 ", $Feature, "assert!(16", stringify!($SelfT), ".is_power_of_two());
3755 assert!(!10", stringify!($SelfT), ".is_power_of_two());", $EndFeature, "
3756 ```"),
3757             #[stable(feature = "rust1", since = "1.0.0")]
3758             #[inline]
3759             pub fn is_power_of_two(self) -> bool {
3760                 (self.wrapping_sub(1)) & self == 0 && !(self == 0)
3761             }
3762         }
3763
3764         // Returns one less than next power of two.
3765         // (For 8u8 next power of two is 8u8 and for 6u8 it is 8u8)
3766         //
3767         // 8u8.one_less_than_next_power_of_two() == 7
3768         // 6u8.one_less_than_next_power_of_two() == 7
3769         //
3770         // This method cannot overflow, as in the `next_power_of_two`
3771         // overflow cases it instead ends up returning the maximum value
3772         // of the type, and can return 0 for 0.
3773         #[inline]
3774         fn one_less_than_next_power_of_two(self) -> Self {
3775             if self <= 1 { return 0; }
3776
3777             // Because `p > 0`, it cannot consist entirely of leading zeros.
3778             // That means the shift is always in-bounds, and some processors
3779             // (such as intel pre-haswell) have more efficient ctlz
3780             // intrinsics when the argument is non-zero.
3781             let p = self - 1;
3782             let z = unsafe { intrinsics::ctlz_nonzero(p) };
3783             <$SelfT>::max_value() >> z
3784         }
3785
3786         doc_comment! {
3787             concat!("Returns the smallest power of two greater than or equal to `self`.
3788
3789 When return value overflows (i.e., `self > (1 << (N-1))` for type
3790 `uN`), it panics in debug mode and return value is wrapped to 0 in
3791 release mode (the only situation in which method can return 0).
3792
3793 # Examples
3794
3795 Basic usage:
3796
3797 ```
3798 ", $Feature, "assert_eq!(2", stringify!($SelfT), ".next_power_of_two(), 2);
3799 assert_eq!(3", stringify!($SelfT), ".next_power_of_two(), 4);", $EndFeature, "
3800 ```"),
3801             #[stable(feature = "rust1", since = "1.0.0")]
3802             #[inline]
3803             pub fn next_power_of_two(self) -> Self {
3804                 // Call the trait to get overflow checks
3805                 ops::Add::add(self.one_less_than_next_power_of_two(), 1)
3806             }
3807         }
3808
3809         doc_comment! {
3810             concat!("Returns the smallest power of two greater than or equal to `n`. If
3811 the next power of two is greater than the type's maximum value,
3812 `None` is returned, otherwise the power of two is wrapped in `Some`.
3813
3814 # Examples
3815
3816 Basic usage:
3817
3818 ```
3819 ", $Feature, "assert_eq!(2", stringify!($SelfT),
3820 ".checked_next_power_of_two(), Some(2));
3821 assert_eq!(3", stringify!($SelfT), ".checked_next_power_of_two(), Some(4));
3822 assert_eq!(", stringify!($SelfT), "::max_value().checked_next_power_of_two(), None);",
3823 $EndFeature, "
3824 ```"),
3825             #[inline]
3826             #[stable(feature = "rust1", since = "1.0.0")]
3827             pub fn checked_next_power_of_two(self) -> Option<Self> {
3828                 self.one_less_than_next_power_of_two().checked_add(1)
3829             }
3830         }
3831
3832         doc_comment! {
3833             concat!("Returns the smallest power of two greater than or equal to `n`. If
3834 the next power of two is greater than the type's maximum value,
3835 the return value is wrapped to `0`.
3836
3837 # Examples
3838
3839 Basic usage:
3840
3841 ```
3842 #![feature(wrapping_next_power_of_two)]
3843 ", $Feature, "
3844 assert_eq!(2", stringify!($SelfT), ".wrapping_next_power_of_two(), 2);
3845 assert_eq!(3", stringify!($SelfT), ".wrapping_next_power_of_two(), 4);
3846 assert_eq!(", stringify!($SelfT), "::max_value().wrapping_next_power_of_two(), 0);",
3847 $EndFeature, "
3848 ```"),
3849             #[unstable(feature = "wrapping_next_power_of_two", issue = "32463",
3850                        reason = "needs decision on wrapping behaviour")]
3851             pub fn wrapping_next_power_of_two(self) -> Self {
3852                 self.one_less_than_next_power_of_two().wrapping_add(1)
3853             }
3854         }
3855
3856         doc_comment! {
3857             concat!("Return the memory representation of this integer as a byte array in
3858 big-endian (network) byte order.
3859 ",
3860 $to_xe_bytes_doc,
3861 "
3862 # Examples
3863
3864 ```
3865 let bytes = ", $swap_op, stringify!($SelfT), ".to_be_bytes();
3866 assert_eq!(bytes, ", $be_bytes, ");
3867 ```"),
3868             #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3869             #[rustc_const_unstable(feature = "const_int_conversion")]
3870             #[inline]
3871             pub const fn to_be_bytes(self) -> [u8; mem::size_of::<Self>()] {
3872                 self.to_be().to_ne_bytes()
3873             }
3874         }
3875
3876         doc_comment! {
3877             concat!("Return the memory representation of this integer as a byte array in
3878 little-endian byte order.
3879 ",
3880 $to_xe_bytes_doc,
3881 "
3882 # Examples
3883
3884 ```
3885 let bytes = ", $swap_op, stringify!($SelfT), ".to_le_bytes();
3886 assert_eq!(bytes, ", $le_bytes, ");
3887 ```"),
3888             #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3889             #[rustc_const_unstable(feature = "const_int_conversion")]
3890             #[inline]
3891             pub const fn to_le_bytes(self) -> [u8; mem::size_of::<Self>()] {
3892                 self.to_le().to_ne_bytes()
3893             }
3894         }
3895
3896         doc_comment! {
3897             concat!("
3898 Return the memory representation of this integer as a byte array in
3899 native byte order.
3900
3901 As the target platform's native endianness is used, portable code
3902 should use [`to_be_bytes`] or [`to_le_bytes`], as appropriate,
3903 instead.
3904 ",
3905 $to_xe_bytes_doc,
3906 "
3907 [`to_be_bytes`]: #method.to_be_bytes
3908 [`to_le_bytes`]: #method.to_le_bytes
3909
3910 # Examples
3911
3912 ```
3913 let bytes = ", $swap_op, stringify!($SelfT), ".to_ne_bytes();
3914 assert_eq!(bytes, if cfg!(target_endian = \"big\") {
3915         ", $be_bytes, "
3916     } else {
3917         ", $le_bytes, "
3918     });
3919 ```"),
3920             #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3921             #[rustc_const_unstable(feature = "const_int_conversion")]
3922             #[inline]
3923             pub const fn to_ne_bytes(self) -> [u8; mem::size_of::<Self>()] {
3924                 unsafe { mem::transmute(self) }
3925             }
3926         }
3927
3928         doc_comment! {
3929             concat!("Create an integer value from its representation as a byte array in
3930 big endian.
3931 ",
3932 $from_xe_bytes_doc,
3933 "
3934 # Examples
3935
3936 ```
3937 let value = ", stringify!($SelfT), "::from_be_bytes(", $be_bytes, ");
3938 assert_eq!(value, ", $swap_op, ");
3939 ```
3940
3941 When starting from a slice rather than an array, fallible conversion APIs can be used:
3942
3943 ```
3944 use std::convert::TryInto;
3945
3946 fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
3947     let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
3948     *input = rest;
3949     ", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
3950 }
3951 ```"),
3952             #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3953             #[rustc_const_unstable(feature = "const_int_conversion")]
3954             #[inline]
3955             pub const fn from_be_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
3956                 Self::from_be(Self::from_ne_bytes(bytes))
3957             }
3958         }
3959
3960         doc_comment! {
3961             concat!("
3962 Create an integer value from its representation as a byte array in
3963 little endian.
3964 ",
3965 $from_xe_bytes_doc,
3966 "
3967 # Examples
3968
3969 ```
3970 let value = ", stringify!($SelfT), "::from_le_bytes(", $le_bytes, ");
3971 assert_eq!(value, ", $swap_op, ");
3972 ```
3973
3974 When starting from a slice rather than an array, fallible conversion APIs can be used:
3975
3976 ```
3977 use std::convert::TryInto;
3978
3979 fn read_le_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
3980     let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
3981     *input = rest;
3982     ", stringify!($SelfT), "::from_le_bytes(int_bytes.try_into().unwrap())
3983 }
3984 ```"),
3985             #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3986             #[rustc_const_unstable(feature = "const_int_conversion")]
3987             #[inline]
3988             pub const fn from_le_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
3989                 Self::from_le(Self::from_ne_bytes(bytes))
3990             }
3991         }
3992
3993         doc_comment! {
3994             concat!("Create an integer value from its memory representation as a byte
3995 array in native endianness.
3996
3997 As the target platform's native endianness is used, portable code
3998 likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as
3999 appropriate instead.
4000
4001 [`from_be_bytes`]: #method.from_be_bytes
4002 [`from_le_bytes`]: #method.from_le_bytes
4003 ",
4004 $from_xe_bytes_doc,
4005 "
4006 # Examples
4007
4008 ```
4009 let value = ", stringify!($SelfT), "::from_ne_bytes(if cfg!(target_endian = \"big\") {
4010         ", $be_bytes, "
4011     } else {
4012         ", $le_bytes, "
4013     });
4014 assert_eq!(value, ", $swap_op, ");
4015 ```
4016
4017 When starting from a slice rather than an array, fallible conversion APIs can be used:
4018
4019 ```
4020 use std::convert::TryInto;
4021
4022 fn read_ne_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
4023     let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
4024     *input = rest;
4025     ", stringify!($SelfT), "::from_ne_bytes(int_bytes.try_into().unwrap())
4026 }
4027 ```"),
4028             #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
4029             #[rustc_const_unstable(feature = "const_int_conversion")]
4030             #[inline]
4031             pub const fn from_ne_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
4032                 unsafe { mem::transmute(bytes) }
4033             }
4034         }
4035     }
4036 }
4037
4038 #[lang = "u8"]
4039 impl u8 {
4040     uint_impl! { u8, u8, 8, 255, "", "", 2, "0x82", "0xa", "0x12", "0x12", "0x48", "[0x12]",
4041         "[0x12]", "", "" }
4042
4043
4044     /// Checks if the value is within the ASCII range.
4045     ///
4046     /// # Examples
4047     ///
4048     /// ```
4049     /// let ascii = 97u8;
4050     /// let non_ascii = 150u8;
4051     ///
4052     /// assert!(ascii.is_ascii());
4053     /// assert!(!non_ascii.is_ascii());
4054     /// ```
4055     #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4056     #[inline]
4057     pub fn is_ascii(&self) -> bool {
4058         *self & 128 == 0
4059     }
4060
4061     /// Makes a copy of the value in its ASCII upper case equivalent.
4062     ///
4063     /// ASCII letters 'a' to 'z' are mapped to 'A' to 'Z',
4064     /// but non-ASCII letters are unchanged.
4065     ///
4066     /// To uppercase the value in-place, use [`make_ascii_uppercase`].
4067     ///
4068     /// # Examples
4069     ///
4070     /// ```
4071     /// let lowercase_a = 97u8;
4072     ///
4073     /// assert_eq!(65, lowercase_a.to_ascii_uppercase());
4074     /// ```
4075     ///
4076     /// [`make_ascii_uppercase`]: #method.make_ascii_uppercase
4077     #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4078     #[inline]
4079     pub fn to_ascii_uppercase(&self) -> u8 {
4080         // Unset the fith bit if this is a lowercase letter
4081         *self & !((self.is_ascii_lowercase() as u8) << 5)
4082     }
4083
4084     /// Makes a copy of the value in its ASCII lower case equivalent.
4085     ///
4086     /// ASCII letters 'A' to 'Z' are mapped to 'a' to 'z',
4087     /// but non-ASCII letters are unchanged.
4088     ///
4089     /// To lowercase the value in-place, use [`make_ascii_lowercase`].
4090     ///
4091     /// # Examples
4092     ///
4093     /// ```
4094     /// let uppercase_a = 65u8;
4095     ///
4096     /// assert_eq!(97, uppercase_a.to_ascii_lowercase());
4097     /// ```
4098     ///
4099     /// [`make_ascii_lowercase`]: #method.make_ascii_lowercase
4100     #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4101     #[inline]
4102     pub fn to_ascii_lowercase(&self) -> u8 {
4103         // Set the fith bit if this is an uppercase letter
4104         *self | ((self.is_ascii_uppercase() as u8) << 5)
4105     }
4106
4107     /// Checks that two values are an ASCII case-insensitive match.
4108     ///
4109     /// This is equivalent to `to_ascii_lowercase(a) == to_ascii_lowercase(b)`.
4110     ///
4111     /// # Examples
4112     ///
4113     /// ```
4114     /// let lowercase_a = 97u8;
4115     /// let uppercase_a = 65u8;
4116     ///
4117     /// assert!(lowercase_a.eq_ignore_ascii_case(&uppercase_a));
4118     /// ```
4119     #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4120     #[inline]
4121     pub fn eq_ignore_ascii_case(&self, other: &u8) -> bool {
4122         self.to_ascii_lowercase() == other.to_ascii_lowercase()
4123     }
4124
4125     /// Converts this value to its ASCII upper case equivalent in-place.
4126     ///
4127     /// ASCII letters 'a' to 'z' are mapped to 'A' to 'Z',
4128     /// but non-ASCII letters are unchanged.
4129     ///
4130     /// To return a new uppercased value without modifying the existing one, use
4131     /// [`to_ascii_uppercase`].
4132     ///
4133     /// # Examples
4134     ///
4135     /// ```
4136     /// let mut byte = b'a';
4137     ///
4138     /// byte.make_ascii_uppercase();
4139     ///
4140     /// assert_eq!(b'A', byte);
4141     /// ```
4142     ///
4143     /// [`to_ascii_uppercase`]: #method.to_ascii_uppercase
4144     #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4145     #[inline]
4146     pub fn make_ascii_uppercase(&mut self) {
4147         *self = self.to_ascii_uppercase();
4148     }
4149
4150     /// Converts this value to its ASCII lower case equivalent in-place.
4151     ///
4152     /// ASCII letters 'A' to 'Z' are mapped to 'a' to 'z',
4153     /// but non-ASCII letters are unchanged.
4154     ///
4155     /// To return a new lowercased value without modifying the existing one, use
4156     /// [`to_ascii_lowercase`].
4157     ///
4158     /// # Examples
4159     ///
4160     /// ```
4161     /// let mut byte = b'A';
4162     ///
4163     /// byte.make_ascii_lowercase();
4164     ///
4165     /// assert_eq!(b'a', byte);
4166     /// ```
4167     ///
4168     /// [`to_ascii_lowercase`]: #method.to_ascii_lowercase
4169     #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4170     #[inline]
4171     pub fn make_ascii_lowercase(&mut self) {
4172         *self = self.to_ascii_lowercase();
4173     }
4174
4175     /// Checks if the value is an ASCII alphabetic character:
4176     ///
4177     /// - U+0041 'A' ..= U+005A 'Z', or
4178     /// - U+0061 'a' ..= U+007A 'z'.
4179     ///
4180     /// # Examples
4181     ///
4182     /// ```
4183     /// let uppercase_a = b'A';
4184     /// let uppercase_g = b'G';
4185     /// let a = b'a';
4186     /// let g = b'g';
4187     /// let zero = b'0';
4188     /// let percent = b'%';
4189     /// let space = b' ';
4190     /// let lf = b'\n';
4191     /// let esc = 0x1b_u8;
4192     ///
4193     /// assert!(uppercase_a.is_ascii_alphabetic());
4194     /// assert!(uppercase_g.is_ascii_alphabetic());
4195     /// assert!(a.is_ascii_alphabetic());
4196     /// assert!(g.is_ascii_alphabetic());
4197     /// assert!(!zero.is_ascii_alphabetic());
4198     /// assert!(!percent.is_ascii_alphabetic());
4199     /// assert!(!space.is_ascii_alphabetic());
4200     /// assert!(!lf.is_ascii_alphabetic());
4201     /// assert!(!esc.is_ascii_alphabetic());
4202     /// ```
4203     #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4204     #[inline]
4205     pub fn is_ascii_alphabetic(&self) -> bool {
4206         match *self {
4207             b'A'..=b'Z' | b'a'..=b'z' => true,
4208             _ => false
4209         }
4210     }
4211
4212     /// Checks if the value is an ASCII uppercase character:
4213     /// U+0041 'A' ..= U+005A 'Z'.
4214     ///
4215     /// # Examples
4216     ///
4217     /// ```
4218     /// let uppercase_a = b'A';
4219     /// let uppercase_g = b'G';
4220     /// let a = b'a';
4221     /// let g = b'g';
4222     /// let zero = b'0';
4223     /// let percent = b'%';
4224     /// let space = b' ';
4225     /// let lf = b'\n';
4226     /// let esc = 0x1b_u8;
4227     ///
4228     /// assert!(uppercase_a.is_ascii_uppercase());
4229     /// assert!(uppercase_g.is_ascii_uppercase());
4230     /// assert!(!a.is_ascii_uppercase());
4231     /// assert!(!g.is_ascii_uppercase());
4232     /// assert!(!zero.is_ascii_uppercase());
4233     /// assert!(!percent.is_ascii_uppercase());
4234     /// assert!(!space.is_ascii_uppercase());
4235     /// assert!(!lf.is_ascii_uppercase());
4236     /// assert!(!esc.is_ascii_uppercase());
4237     /// ```
4238     #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4239     #[inline]
4240     pub fn is_ascii_uppercase(&self) -> bool {
4241         match *self {
4242             b'A'..=b'Z' => true,
4243             _ => false
4244         }
4245     }
4246
4247     /// Checks if the value is an ASCII lowercase character:
4248     /// U+0061 'a' ..= U+007A 'z'.
4249     ///
4250     /// # Examples
4251     ///
4252     /// ```
4253     /// let uppercase_a = b'A';
4254     /// let uppercase_g = b'G';
4255     /// let a = b'a';
4256     /// let g = b'g';
4257     /// let zero = b'0';
4258     /// let percent = b'%';
4259     /// let space = b' ';
4260     /// let lf = b'\n';
4261     /// let esc = 0x1b_u8;
4262     ///
4263     /// assert!(!uppercase_a.is_ascii_lowercase());
4264     /// assert!(!uppercase_g.is_ascii_lowercase());
4265     /// assert!(a.is_ascii_lowercase());
4266     /// assert!(g.is_ascii_lowercase());
4267     /// assert!(!zero.is_ascii_lowercase());
4268     /// assert!(!percent.is_ascii_lowercase());
4269     /// assert!(!space.is_ascii_lowercase());
4270     /// assert!(!lf.is_ascii_lowercase());
4271     /// assert!(!esc.is_ascii_lowercase());
4272     /// ```
4273     #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4274     #[inline]
4275     pub fn is_ascii_lowercase(&self) -> bool {
4276         match *self {
4277             b'a'..=b'z' => true,
4278             _ => false
4279         }
4280     }
4281
4282     /// Checks if the value is an ASCII alphanumeric character:
4283     ///
4284     /// - U+0041 'A' ..= U+005A 'Z', or
4285     /// - U+0061 'a' ..= U+007A 'z', or
4286     /// - U+0030 '0' ..= U+0039 '9'.
4287     ///
4288     /// # Examples
4289     ///
4290     /// ```
4291     /// let uppercase_a = b'A';
4292     /// let uppercase_g = b'G';
4293     /// let a = b'a';
4294     /// let g = b'g';
4295     /// let zero = b'0';
4296     /// let percent = b'%';
4297     /// let space = b' ';
4298     /// let lf = b'\n';
4299     /// let esc = 0x1b_u8;
4300     ///
4301     /// assert!(uppercase_a.is_ascii_alphanumeric());
4302     /// assert!(uppercase_g.is_ascii_alphanumeric());
4303     /// assert!(a.is_ascii_alphanumeric());
4304     /// assert!(g.is_ascii_alphanumeric());
4305     /// assert!(zero.is_ascii_alphanumeric());
4306     /// assert!(!percent.is_ascii_alphanumeric());
4307     /// assert!(!space.is_ascii_alphanumeric());
4308     /// assert!(!lf.is_ascii_alphanumeric());
4309     /// assert!(!esc.is_ascii_alphanumeric());
4310     /// ```
4311     #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4312     #[inline]
4313     pub fn is_ascii_alphanumeric(&self) -> bool {
4314         match *self {
4315             b'0'..=b'9' | b'A'..=b'Z' | b'a'..=b'z' => true,
4316             _ => false
4317         }
4318     }
4319
4320     /// Checks if the value is an ASCII decimal digit:
4321     /// U+0030 '0' ..= U+0039 '9'.
4322     ///
4323     /// # Examples
4324     ///
4325     /// ```
4326     /// let uppercase_a = b'A';
4327     /// let uppercase_g = b'G';
4328     /// let a = b'a';
4329     /// let g = b'g';
4330     /// let zero = b'0';
4331     /// let percent = b'%';
4332     /// let space = b' ';
4333     /// let lf = b'\n';
4334     /// let esc = 0x1b_u8;
4335     ///
4336     /// assert!(!uppercase_a.is_ascii_digit());
4337     /// assert!(!uppercase_g.is_ascii_digit());
4338     /// assert!(!a.is_ascii_digit());
4339     /// assert!(!g.is_ascii_digit());
4340     /// assert!(zero.is_ascii_digit());
4341     /// assert!(!percent.is_ascii_digit());
4342     /// assert!(!space.is_ascii_digit());
4343     /// assert!(!lf.is_ascii_digit());
4344     /// assert!(!esc.is_ascii_digit());
4345     /// ```
4346     #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4347     #[inline]
4348     pub fn is_ascii_digit(&self) -> bool {
4349         match *self {
4350             b'0'..=b'9' => true,
4351             _ => false
4352         }
4353     }
4354
4355     /// Checks if the value is an ASCII hexadecimal digit:
4356     ///
4357     /// - U+0030 '0' ..= U+0039 '9', or
4358     /// - U+0041 'A' ..= U+0046 'F', or
4359     /// - U+0061 'a' ..= U+0066 'f'.
4360     ///
4361     /// # Examples
4362     ///
4363     /// ```
4364     /// let uppercase_a = b'A';
4365     /// let uppercase_g = b'G';
4366     /// let a = b'a';
4367     /// let g = b'g';
4368     /// let zero = b'0';
4369     /// let percent = b'%';
4370     /// let space = b' ';
4371     /// let lf = b'\n';
4372     /// let esc = 0x1b_u8;
4373     ///
4374     /// assert!(uppercase_a.is_ascii_hexdigit());
4375     /// assert!(!uppercase_g.is_ascii_hexdigit());
4376     /// assert!(a.is_ascii_hexdigit());
4377     /// assert!(!g.is_ascii_hexdigit());
4378     /// assert!(zero.is_ascii_hexdigit());
4379     /// assert!(!percent.is_ascii_hexdigit());
4380     /// assert!(!space.is_ascii_hexdigit());
4381     /// assert!(!lf.is_ascii_hexdigit());
4382     /// assert!(!esc.is_ascii_hexdigit());
4383     /// ```
4384     #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4385     #[inline]
4386     pub fn is_ascii_hexdigit(&self) -> bool {
4387         match *self {
4388             b'0'..=b'9' | b'A'..=b'F' | b'a'..=b'f' => true,
4389             _ => false
4390         }
4391     }
4392
4393     /// Checks if the value is an ASCII punctuation character:
4394     ///
4395     /// - U+0021 ..= U+002F `! " # $ % & ' ( ) * + , - . /`, or
4396     /// - U+003A ..= U+0040 `: ; < = > ? @`, or
4397     /// - U+005B ..= U+0060 ``[ \ ] ^ _ ` ``, or
4398     /// - U+007B ..= U+007E `{ | } ~`
4399     ///
4400     /// # Examples
4401     ///
4402     /// ```
4403     /// let uppercase_a = b'A';
4404     /// let uppercase_g = b'G';
4405     /// let a = b'a';
4406     /// let g = b'g';
4407     /// let zero = b'0';
4408     /// let percent = b'%';
4409     /// let space = b' ';
4410     /// let lf = b'\n';
4411     /// let esc = 0x1b_u8;
4412     ///
4413     /// assert!(!uppercase_a.is_ascii_punctuation());
4414     /// assert!(!uppercase_g.is_ascii_punctuation());
4415     /// assert!(!a.is_ascii_punctuation());
4416     /// assert!(!g.is_ascii_punctuation());
4417     /// assert!(!zero.is_ascii_punctuation());
4418     /// assert!(percent.is_ascii_punctuation());
4419     /// assert!(!space.is_ascii_punctuation());
4420     /// assert!(!lf.is_ascii_punctuation());
4421     /// assert!(!esc.is_ascii_punctuation());
4422     /// ```
4423     #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4424     #[inline]
4425     pub fn is_ascii_punctuation(&self) -> bool {
4426         match *self {
4427             b'!'..=b'/' | b':'..=b'@' | b'['..=b'`' | b'{'..=b'~' => true,
4428             _ => false
4429         }
4430     }
4431
4432     /// Checks if the value is an ASCII graphic character:
4433     /// U+0021 '!' ..= U+007E '~'.
4434     ///
4435     /// # Examples
4436     ///
4437     /// ```
4438     /// let uppercase_a = b'A';
4439     /// let uppercase_g = b'G';
4440     /// let a = b'a';
4441     /// let g = b'g';
4442     /// let zero = b'0';
4443     /// let percent = b'%';
4444     /// let space = b' ';
4445     /// let lf = b'\n';
4446     /// let esc = 0x1b_u8;
4447     ///
4448     /// assert!(uppercase_a.is_ascii_graphic());
4449     /// assert!(uppercase_g.is_ascii_graphic());
4450     /// assert!(a.is_ascii_graphic());
4451     /// assert!(g.is_ascii_graphic());
4452     /// assert!(zero.is_ascii_graphic());
4453     /// assert!(percent.is_ascii_graphic());
4454     /// assert!(!space.is_ascii_graphic());
4455     /// assert!(!lf.is_ascii_graphic());
4456     /// assert!(!esc.is_ascii_graphic());
4457     /// ```
4458     #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4459     #[inline]
4460     pub fn is_ascii_graphic(&self) -> bool {
4461         match *self {
4462             b'!'..=b'~' => true,
4463             _ => false
4464         }
4465     }
4466
4467     /// Checks if the value is an ASCII whitespace character:
4468     /// U+0020 SPACE, U+0009 HORIZONTAL TAB, U+000A LINE FEED,
4469     /// U+000C FORM FEED, or U+000D CARRIAGE RETURN.
4470     ///
4471     /// Rust uses the WhatWG Infra Standard's [definition of ASCII
4472     /// whitespace][infra-aw]. There are several other definitions in
4473     /// wide use. For instance, [the POSIX locale][pct] includes
4474     /// U+000B VERTICAL TAB as well as all the above characters,
4475     /// but—from the very same specification—[the default rule for
4476     /// "field splitting" in the Bourne shell][bfs] considers *only*
4477     /// SPACE, HORIZONTAL TAB, and LINE FEED as whitespace.
4478     ///
4479     /// If you are writing a program that will process an existing
4480     /// file format, check what that format's definition of whitespace is
4481     /// before using this function.
4482     ///
4483     /// [infra-aw]: https://infra.spec.whatwg.org/#ascii-whitespace
4484     /// [pct]: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_01
4485     /// [bfs]: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05
4486     ///
4487     /// # Examples
4488     ///
4489     /// ```
4490     /// let uppercase_a = b'A';
4491     /// let uppercase_g = b'G';
4492     /// let a = b'a';
4493     /// let g = b'g';
4494     /// let zero = b'0';
4495     /// let percent = b'%';
4496     /// let space = b' ';
4497     /// let lf = b'\n';
4498     /// let esc = 0x1b_u8;
4499     ///
4500     /// assert!(!uppercase_a.is_ascii_whitespace());
4501     /// assert!(!uppercase_g.is_ascii_whitespace());
4502     /// assert!(!a.is_ascii_whitespace());
4503     /// assert!(!g.is_ascii_whitespace());
4504     /// assert!(!zero.is_ascii_whitespace());
4505     /// assert!(!percent.is_ascii_whitespace());
4506     /// assert!(space.is_ascii_whitespace());
4507     /// assert!(lf.is_ascii_whitespace());
4508     /// assert!(!esc.is_ascii_whitespace());
4509     /// ```
4510     #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4511     #[inline]
4512     pub fn is_ascii_whitespace(&self) -> bool {
4513         match *self {
4514             b'\t' | b'\n' | b'\x0C' | b'\r' | b' ' => true,
4515             _ => false
4516         }
4517     }
4518
4519     /// Checks if the value is an ASCII control character:
4520     /// U+0000 NUL ..= U+001F UNIT SEPARATOR, or U+007F DELETE.
4521     /// Note that most ASCII whitespace characters are control
4522     /// characters, but SPACE is not.
4523     ///
4524     /// # Examples
4525     ///
4526     /// ```
4527     /// let uppercase_a = b'A';
4528     /// let uppercase_g = b'G';
4529     /// let a = b'a';
4530     /// let g = b'g';
4531     /// let zero = b'0';
4532     /// let percent = b'%';
4533     /// let space = b' ';
4534     /// let lf = b'\n';
4535     /// let esc = 0x1b_u8;
4536     ///
4537     /// assert!(!uppercase_a.is_ascii_control());
4538     /// assert!(!uppercase_g.is_ascii_control());
4539     /// assert!(!a.is_ascii_control());
4540     /// assert!(!g.is_ascii_control());
4541     /// assert!(!zero.is_ascii_control());
4542     /// assert!(!percent.is_ascii_control());
4543     /// assert!(!space.is_ascii_control());
4544     /// assert!(lf.is_ascii_control());
4545     /// assert!(esc.is_ascii_control());
4546     /// ```
4547     #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4548     #[inline]
4549     pub fn is_ascii_control(&self) -> bool {
4550         match *self {
4551             b'\0'..=b'\x1F' | b'\x7F' => true,
4552             _ => false
4553         }
4554     }
4555 }
4556
4557 #[lang = "u16"]
4558 impl u16 {
4559     uint_impl! { u16, u16, 16, 65535, "", "", 4, "0xa003", "0x3a", "0x1234", "0x3412", "0x2c48",
4560         "[0x34, 0x12]", "[0x12, 0x34]", "", "" }
4561 }
4562
4563 #[lang = "u32"]
4564 impl u32 {
4565     uint_impl! { u32, u32, 32, 4294967295, "", "", 8, "0x10000b3", "0xb301", "0x12345678",
4566         "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]", "[0x12, 0x34, 0x56, 0x78]", "", "" }
4567 }
4568
4569 #[lang = "u64"]
4570 impl u64 {
4571     uint_impl! { u64, u64, 64, 18446744073709551615, "", "", 12, "0xaa00000000006e1", "0x6e10aa",
4572         "0x1234567890123456", "0x5634129078563412", "0x6a2c48091e6a2c48",
4573         "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
4574         "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]",
4575         "", ""}
4576 }
4577
4578 #[lang = "u128"]
4579 impl u128 {
4580     uint_impl! { u128, u128, 128, 340282366920938463463374607431768211455, "", "", 16,
4581         "0x13f40000000000000000000000004f76", "0x4f7613f4", "0x12345678901234567890123456789012",
4582         "0x12907856341290785634129078563412", "0x48091e6a2c48091e6a2c48091e6a2c48",
4583         "[0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, \
4584           0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
4585         "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, \
4586           0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12]",
4587          "", ""}
4588 }
4589
4590 #[cfg(target_pointer_width = "16")]
4591 #[lang = "usize"]
4592 impl usize {
4593     uint_impl! { usize, u16, 16, 65535, "", "", 4, "0xa003", "0x3a", "0x1234", "0x3412", "0x2c48",
4594         "[0x34, 0x12]", "[0x12, 0x34]",
4595         usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
4596 }
4597 #[cfg(target_pointer_width = "32")]
4598 #[lang = "usize"]
4599 impl usize {
4600     uint_impl! { usize, u32, 32, 4294967295, "", "", 8, "0x10000b3", "0xb301", "0x12345678",
4601         "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]", "[0x12, 0x34, 0x56, 0x78]",
4602         usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
4603 }
4604
4605 #[cfg(target_pointer_width = "64")]
4606 #[lang = "usize"]
4607 impl usize {
4608     uint_impl! { usize, u64, 64, 18446744073709551615, "", "", 12, "0xaa00000000006e1", "0x6e10aa",
4609         "0x1234567890123456", "0x5634129078563412", "0x6a2c48091e6a2c48",
4610         "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
4611          "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]",
4612         usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
4613 }
4614
4615 /// A classification of floating point numbers.
4616 ///
4617 /// This `enum` is used as the return type for [`f32::classify`] and [`f64::classify`]. See
4618 /// their documentation for more.
4619 ///
4620 /// [`f32::classify`]: ../../std/primitive.f32.html#method.classify
4621 /// [`f64::classify`]: ../../std/primitive.f64.html#method.classify
4622 ///
4623 /// # Examples
4624 ///
4625 /// ```
4626 /// use std::num::FpCategory;
4627 /// use std::f32;
4628 ///
4629 /// let num = 12.4_f32;
4630 /// let inf = f32::INFINITY;
4631 /// let zero = 0f32;
4632 /// let sub: f32 = 1.1754942e-38;
4633 /// let nan = f32::NAN;
4634 ///
4635 /// assert_eq!(num.classify(), FpCategory::Normal);
4636 /// assert_eq!(inf.classify(), FpCategory::Infinite);
4637 /// assert_eq!(zero.classify(), FpCategory::Zero);
4638 /// assert_eq!(nan.classify(), FpCategory::Nan);
4639 /// assert_eq!(sub.classify(), FpCategory::Subnormal);
4640 /// ```
4641 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
4642 #[stable(feature = "rust1", since = "1.0.0")]
4643 pub enum FpCategory {
4644     /// "Not a Number", often obtained by dividing by zero.
4645     #[stable(feature = "rust1", since = "1.0.0")]
4646     Nan,
4647
4648     /// Positive or negative infinity.
4649     #[stable(feature = "rust1", since = "1.0.0")]
4650     Infinite,
4651
4652     /// Positive or negative zero.
4653     #[stable(feature = "rust1", since = "1.0.0")]
4654     Zero,
4655
4656     /// De-normalized floating point representation (less precise than `Normal`).
4657     #[stable(feature = "rust1", since = "1.0.0")]
4658     Subnormal,
4659
4660     /// A regular floating point number.
4661     #[stable(feature = "rust1", since = "1.0.0")]
4662     Normal,
4663 }
4664
4665 macro_rules! from_str_radix_int_impl {
4666     ($($t:ty)*) => {$(
4667         #[stable(feature = "rust1", since = "1.0.0")]
4668         impl FromStr for $t {
4669             type Err = ParseIntError;
4670             fn from_str(src: &str) -> Result<Self, ParseIntError> {
4671                 from_str_radix(src, 10)
4672             }
4673         }
4674     )*}
4675 }
4676 from_str_radix_int_impl! { isize i8 i16 i32 i64 i128 usize u8 u16 u32 u64 u128 }
4677
4678 /// The error type returned when a checked integral type conversion fails.
4679 #[stable(feature = "try_from", since = "1.34.0")]
4680 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
4681 pub struct TryFromIntError(());
4682
4683 impl TryFromIntError {
4684     #[unstable(feature = "int_error_internals",
4685                reason = "available through Error trait and this method should \
4686                          not be exposed publicly",
4687                issue = "0")]
4688     #[doc(hidden)]
4689     pub fn __description(&self) -> &str {
4690         "out of range integral type conversion attempted"
4691     }
4692 }
4693
4694 #[stable(feature = "try_from", since = "1.34.0")]
4695 impl fmt::Display for TryFromIntError {
4696     fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
4697         self.__description().fmt(fmt)
4698     }
4699 }
4700
4701 #[stable(feature = "try_from", since = "1.34.0")]
4702 impl From<Infallible> for TryFromIntError {
4703     fn from(x: Infallible) -> TryFromIntError {
4704         match x {}
4705     }
4706 }
4707
4708 #[unstable(feature = "never_type", issue = "35121")]
4709 impl From<!> for TryFromIntError {
4710     fn from(never: !) -> TryFromIntError {
4711         // Match rather than coerce to make sure that code like
4712         // `From<Infallible> for TryFromIntError` above will keep working
4713         // when `Infallible` becomes an alias to `!`.
4714         match never {}
4715     }
4716 }
4717
4718 // no possible bounds violation
4719 macro_rules! try_from_unbounded {
4720     ($source:ty, $($target:ty),*) => {$(
4721         #[stable(feature = "try_from", since = "1.34.0")]
4722         impl TryFrom<$source> for $target {
4723             type Error = TryFromIntError;
4724
4725             /// Try to create the target number type from a source
4726             /// number type. This returns an error if the source value
4727             /// is outside of the range of the target type.
4728             #[inline]
4729             fn try_from(value: $source) -> Result<Self, Self::Error> {
4730                 Ok(value as $target)
4731             }
4732         }
4733     )*}
4734 }
4735
4736 // only negative bounds
4737 macro_rules! try_from_lower_bounded {
4738     ($source:ty, $($target:ty),*) => {$(
4739         #[stable(feature = "try_from", since = "1.34.0")]
4740         impl TryFrom<$source> for $target {
4741             type Error = TryFromIntError;
4742
4743             /// Try to create the target number type from a source
4744             /// number type. This returns an error if the source value
4745             /// is outside of the range of the target type.
4746             #[inline]
4747             fn try_from(u: $source) -> Result<$target, TryFromIntError> {
4748                 if u >= 0 {
4749                     Ok(u as $target)
4750                 } else {
4751                     Err(TryFromIntError(()))
4752                 }
4753             }
4754         }
4755     )*}
4756 }
4757
4758 // unsigned to signed (only positive bound)
4759 macro_rules! try_from_upper_bounded {
4760     ($source:ty, $($target:ty),*) => {$(
4761         #[stable(feature = "try_from", since = "1.34.0")]
4762         impl TryFrom<$source> for $target {
4763             type Error = TryFromIntError;
4764
4765             /// Try to create the target number type from a source
4766             /// number type. This returns an error if the source value
4767             /// is outside of the range of the target type.
4768             #[inline]
4769             fn try_from(u: $source) -> Result<$target, TryFromIntError> {
4770                 if u > (<$target>::max_value() as $source) {
4771                     Err(TryFromIntError(()))
4772                 } else {
4773                     Ok(u as $target)
4774                 }
4775             }
4776         }
4777     )*}
4778 }
4779
4780 // all other cases
4781 macro_rules! try_from_both_bounded {
4782     ($source:ty, $($target:ty),*) => {$(
4783         #[stable(feature = "try_from", since = "1.34.0")]
4784         impl TryFrom<$source> for $target {
4785             type Error = TryFromIntError;
4786
4787             /// Try to create the target number type from a source
4788             /// number type. This returns an error if the source value
4789             /// is outside of the range of the target type.
4790             #[inline]
4791             fn try_from(u: $source) -> Result<$target, TryFromIntError> {
4792                 let min = <$target>::min_value() as $source;
4793                 let max = <$target>::max_value() as $source;
4794                 if u < min || u > max {
4795                     Err(TryFromIntError(()))
4796                 } else {
4797                     Ok(u as $target)
4798                 }
4799             }
4800         }
4801     )*}
4802 }
4803
4804 macro_rules! rev {
4805     ($mac:ident, $source:ty, $($target:ty),*) => {$(
4806         $mac!($target, $source);
4807     )*}
4808 }
4809
4810 // intra-sign conversions
4811 try_from_upper_bounded!(u16, u8);
4812 try_from_upper_bounded!(u32, u16, u8);
4813 try_from_upper_bounded!(u64, u32, u16, u8);
4814 try_from_upper_bounded!(u128, u64, u32, u16, u8);
4815
4816 try_from_both_bounded!(i16, i8);
4817 try_from_both_bounded!(i32, i16, i8);
4818 try_from_both_bounded!(i64, i32, i16, i8);
4819 try_from_both_bounded!(i128, i64, i32, i16, i8);
4820
4821 // unsigned-to-signed
4822 try_from_upper_bounded!(u8, i8);
4823 try_from_upper_bounded!(u16, i8, i16);
4824 try_from_upper_bounded!(u32, i8, i16, i32);
4825 try_from_upper_bounded!(u64, i8, i16, i32, i64);
4826 try_from_upper_bounded!(u128, i8, i16, i32, i64, i128);
4827
4828 // signed-to-unsigned
4829 try_from_lower_bounded!(i8, u8, u16, u32, u64, u128);
4830 try_from_lower_bounded!(i16, u16, u32, u64, u128);
4831 try_from_lower_bounded!(i32, u32, u64, u128);
4832 try_from_lower_bounded!(i64, u64, u128);
4833 try_from_lower_bounded!(i128, u128);
4834 try_from_both_bounded!(i16, u8);
4835 try_from_both_bounded!(i32, u16, u8);
4836 try_from_both_bounded!(i64, u32, u16, u8);
4837 try_from_both_bounded!(i128, u64, u32, u16, u8);
4838
4839 // usize/isize
4840 try_from_upper_bounded!(usize, isize);
4841 try_from_lower_bounded!(isize, usize);
4842
4843 #[cfg(target_pointer_width = "16")]
4844 mod ptr_try_from_impls {
4845     use super::TryFromIntError;
4846     use crate::convert::TryFrom;
4847
4848     try_from_upper_bounded!(usize, u8);
4849     try_from_unbounded!(usize, u16, u32, u64, u128);
4850     try_from_upper_bounded!(usize, i8, i16);
4851     try_from_unbounded!(usize, i32, i64, i128);
4852
4853     try_from_both_bounded!(isize, u8);
4854     try_from_lower_bounded!(isize, u16, u32, u64, u128);
4855     try_from_both_bounded!(isize, i8);
4856     try_from_unbounded!(isize, i16, i32, i64, i128);
4857
4858     rev!(try_from_upper_bounded, usize, u32, u64, u128);
4859     rev!(try_from_lower_bounded, usize, i8, i16);
4860     rev!(try_from_both_bounded, usize, i32, i64, i128);
4861
4862     rev!(try_from_upper_bounded, isize, u16, u32, u64, u128);
4863     rev!(try_from_both_bounded, isize, i32, i64, i128);
4864 }
4865
4866 #[cfg(target_pointer_width = "32")]
4867 mod ptr_try_from_impls {
4868     use super::TryFromIntError;
4869     use crate::convert::TryFrom;
4870
4871     try_from_upper_bounded!(usize, u8, u16);
4872     try_from_unbounded!(usize, u32, u64, u128);
4873     try_from_upper_bounded!(usize, i8, i16, i32);
4874     try_from_unbounded!(usize, i64, i128);
4875
4876     try_from_both_bounded!(isize, u8, u16);
4877     try_from_lower_bounded!(isize, u32, u64, u128);
4878     try_from_both_bounded!(isize, i8, i16);
4879     try_from_unbounded!(isize, i32, i64, i128);
4880
4881     rev!(try_from_unbounded, usize, u32);
4882     rev!(try_from_upper_bounded, usize, u64, u128);
4883     rev!(try_from_lower_bounded, usize, i8, i16, i32);
4884     rev!(try_from_both_bounded, usize, i64, i128);
4885
4886     rev!(try_from_unbounded, isize, u16);
4887     rev!(try_from_upper_bounded, isize, u32, u64, u128);
4888     rev!(try_from_unbounded, isize, i32);
4889     rev!(try_from_both_bounded, isize, i64, i128);
4890 }
4891
4892 #[cfg(target_pointer_width = "64")]
4893 mod ptr_try_from_impls {
4894     use super::TryFromIntError;
4895     use crate::convert::TryFrom;
4896
4897     try_from_upper_bounded!(usize, u8, u16, u32);
4898     try_from_unbounded!(usize, u64, u128);
4899     try_from_upper_bounded!(usize, i8, i16, i32, i64);
4900     try_from_unbounded!(usize, i128);
4901
4902     try_from_both_bounded!(isize, u8, u16, u32);
4903     try_from_lower_bounded!(isize, u64, u128);
4904     try_from_both_bounded!(isize, i8, i16, i32);
4905     try_from_unbounded!(isize, i64, i128);
4906
4907     rev!(try_from_unbounded, usize, u32, u64);
4908     rev!(try_from_upper_bounded, usize, u128);
4909     rev!(try_from_lower_bounded, usize, i8, i16, i32, i64);
4910     rev!(try_from_both_bounded, usize, i128);
4911
4912     rev!(try_from_unbounded, isize, u16, u32);
4913     rev!(try_from_upper_bounded, isize, u64, u128);
4914     rev!(try_from_unbounded, isize, i32, i64);
4915     rev!(try_from_both_bounded, isize, i128);
4916 }
4917
4918 #[doc(hidden)]
4919 trait FromStrRadixHelper: PartialOrd + Copy {
4920     fn min_value() -> Self;
4921     fn max_value() -> Self;
4922     fn from_u32(u: u32) -> Self;
4923     fn checked_mul(&self, other: u32) -> Option<Self>;
4924     fn checked_sub(&self, other: u32) -> Option<Self>;
4925     fn checked_add(&self, other: u32) -> Option<Self>;
4926 }
4927
4928 macro_rules! doit {
4929     ($($t:ty)*) => ($(impl FromStrRadixHelper for $t {
4930         #[inline]
4931         fn min_value() -> Self { Self::min_value() }
4932         #[inline]
4933         fn max_value() -> Self { Self::max_value() }
4934         #[inline]
4935         fn from_u32(u: u32) -> Self { u as Self }
4936         #[inline]
4937         fn checked_mul(&self, other: u32) -> Option<Self> {
4938             Self::checked_mul(*self, other as Self)
4939         }
4940         #[inline]
4941         fn checked_sub(&self, other: u32) -> Option<Self> {
4942             Self::checked_sub(*self, other as Self)
4943         }
4944         #[inline]
4945         fn checked_add(&self, other: u32) -> Option<Self> {
4946             Self::checked_add(*self, other as Self)
4947         }
4948     })*)
4949 }
4950 doit! { i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize }
4951
4952 fn from_str_radix<T: FromStrRadixHelper>(src: &str, radix: u32) -> Result<T, ParseIntError> {
4953     use self::IntErrorKind::*;
4954     use self::ParseIntError as PIE;
4955
4956     assert!(radix >= 2 && radix <= 36,
4957            "from_str_radix_int: must lie in the range `[2, 36]` - found {}",
4958            radix);
4959
4960     if src.is_empty() {
4961         return Err(PIE { kind: Empty });
4962     }
4963
4964     let is_signed_ty = T::from_u32(0) > T::min_value();
4965
4966     // all valid digits are ascii, so we will just iterate over the utf8 bytes
4967     // and cast them to chars. .to_digit() will safely return None for anything
4968     // other than a valid ascii digit for the given radix, including the first-byte
4969     // of multi-byte sequences
4970     let src = src.as_bytes();
4971
4972     let (is_positive, digits) = match src[0] {
4973         b'+' => (true, &src[1..]),
4974         b'-' if is_signed_ty => (false, &src[1..]),
4975         _ => (true, src),
4976     };
4977
4978     if digits.is_empty() {
4979         return Err(PIE { kind: Empty });
4980     }
4981
4982     let mut result = T::from_u32(0);
4983     if is_positive {
4984         // The number is positive
4985         for &c in digits {
4986             let x = match (c as char).to_digit(radix) {
4987                 Some(x) => x,
4988                 None => return Err(PIE { kind: InvalidDigit }),
4989             };
4990             result = match result.checked_mul(radix) {
4991                 Some(result) => result,
4992                 None => return Err(PIE { kind: Overflow }),
4993             };
4994             result = match result.checked_add(x) {
4995                 Some(result) => result,
4996                 None => return Err(PIE { kind: Overflow }),
4997             };
4998         }
4999     } else {
5000         // The number is negative
5001         for &c in digits {
5002             let x = match (c as char).to_digit(radix) {
5003                 Some(x) => x,
5004                 None => return Err(PIE { kind: InvalidDigit }),
5005             };
5006             result = match result.checked_mul(radix) {
5007                 Some(result) => result,
5008                 None => return Err(PIE { kind: Underflow }),
5009             };
5010             result = match result.checked_sub(x) {
5011                 Some(result) => result,
5012                 None => return Err(PIE { kind: Underflow }),
5013             };
5014         }
5015     }
5016     Ok(result)
5017 }
5018
5019 /// An error which can be returned when parsing an integer.
5020 ///
5021 /// This error is used as the error type for the `from_str_radix()` functions
5022 /// on the primitive integer types, such as [`i8::from_str_radix`].
5023 ///
5024 /// # Potential causes
5025 ///
5026 /// Among other causes, `ParseIntError` can be thrown because of leading or trailing whitespace
5027 /// in the string e.g., when it is obtained from the standard input.
5028 /// Using the [`str.trim()`] method ensures that no whitespace remains before parsing.
5029 ///
5030 /// [`str.trim()`]: ../../std/primitive.str.html#method.trim
5031 /// [`i8::from_str_radix`]: ../../std/primitive.i8.html#method.from_str_radix
5032 #[derive(Debug, Clone, PartialEq, Eq)]
5033 #[stable(feature = "rust1", since = "1.0.0")]
5034 pub struct ParseIntError {
5035     kind: IntErrorKind,
5036 }
5037
5038 /// Enum to store the various types of errors that can cause parsing an integer to fail.
5039 #[unstable(feature = "int_error_matching",
5040            reason = "it can be useful to match errors when making error messages \
5041                      for integer parsing",
5042            issue = "22639")]
5043 #[derive(Debug, Clone, PartialEq, Eq)]
5044 #[non_exhaustive]
5045 pub enum IntErrorKind {
5046     /// Value being parsed is empty.
5047     ///
5048     /// Among other causes, this variant will be constructed when parsing an empty string.
5049     Empty,
5050     /// Contains an invalid digit.
5051     ///
5052     /// Among other causes, this variant will be constructed when parsing a string that
5053     /// contains a letter.
5054     InvalidDigit,
5055     /// Integer is too large to store in target integer type.
5056     Overflow,
5057     /// Integer is too small to store in target integer type.
5058     Underflow,
5059     /// Value was Zero
5060     ///
5061     /// This variant will be emitted when the parsing string has a value of zero, which
5062     /// would be illegal for non-zero types.
5063     Zero,
5064 }
5065
5066 impl ParseIntError {
5067     /// Outputs the detailed cause of parsing an integer failing.
5068     #[unstable(feature = "int_error_matching",
5069                reason = "it can be useful to match errors when making error messages \
5070                          for integer parsing",
5071                issue = "22639")]
5072     pub fn kind(&self) -> &IntErrorKind {
5073         &self.kind
5074     }
5075     #[unstable(feature = "int_error_internals",
5076                reason = "available through Error trait and this method should \
5077                          not be exposed publicly",
5078                issue = "0")]
5079     #[doc(hidden)]
5080     pub fn __description(&self) -> &str {
5081         match self.kind {
5082             IntErrorKind::Empty => "cannot parse integer from empty string",
5083             IntErrorKind::InvalidDigit => "invalid digit found in string",
5084             IntErrorKind::Overflow => "number too large to fit in target type",
5085             IntErrorKind::Underflow => "number too small to fit in target type",
5086             IntErrorKind::Zero => "number would be zero for non-zero type",
5087         }
5088     }
5089 }
5090
5091 #[stable(feature = "rust1", since = "1.0.0")]
5092 impl fmt::Display for ParseIntError {
5093     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
5094         self.__description().fmt(f)
5095     }
5096 }
5097
5098 #[stable(feature = "rust1", since = "1.0.0")]
5099 pub use crate::num::dec2flt::ParseFloatError;
5100
5101 // Conversion traits for primitive integer and float types
5102 // Conversions T -> T are covered by a blanket impl and therefore excluded
5103 // Some conversions from and to usize/isize are not implemented due to portability concerns
5104 macro_rules! impl_from {
5105     ($Small: ty, $Large: ty, #[$attr:meta], $doc: expr) => {
5106         #[$attr]
5107         #[doc = $doc]
5108         impl From<$Small> for $Large {
5109             #[inline]
5110             fn from(small: $Small) -> $Large {
5111                 small as $Large
5112             }
5113         }
5114     };
5115     ($Small: ty, $Large: ty, #[$attr:meta]) => {
5116         impl_from!($Small,
5117                    $Large,
5118                    #[$attr],
5119                    concat!("Converts `",
5120                            stringify!($Small),
5121                            "` to `",
5122                            stringify!($Large),
5123                            "` losslessly."));
5124     }
5125 }
5126
5127 macro_rules! impl_from_bool {
5128     ($target: ty, #[$attr:meta]) => {
5129         impl_from!(bool, $target, #[$attr], concat!("Converts a `bool` to a `",
5130             stringify!($target), "`. The resulting value is `0` for `false` and `1` for `true`
5131 values.
5132
5133 # Examples
5134
5135 ```
5136 assert_eq!(", stringify!($target), "::from(true), 1);
5137 assert_eq!(", stringify!($target), "::from(false), 0);
5138 ```"));
5139     };
5140 }
5141
5142 // Bool -> Any
5143 impl_from_bool! { u8, #[stable(feature = "from_bool", since = "1.28.0")] }
5144 impl_from_bool! { u16, #[stable(feature = "from_bool", since = "1.28.0")] }
5145 impl_from_bool! { u32, #[stable(feature = "from_bool", since = "1.28.0")] }
5146 impl_from_bool! { u64, #[stable(feature = "from_bool", since = "1.28.0")] }
5147 impl_from_bool! { u128, #[stable(feature = "from_bool", since = "1.28.0")] }
5148 impl_from_bool! { usize, #[stable(feature = "from_bool", since = "1.28.0")] }
5149 impl_from_bool! { i8, #[stable(feature = "from_bool", since = "1.28.0")] }
5150 impl_from_bool! { i16, #[stable(feature = "from_bool", since = "1.28.0")] }
5151 impl_from_bool! { i32, #[stable(feature = "from_bool", since = "1.28.0")] }
5152 impl_from_bool! { i64, #[stable(feature = "from_bool", since = "1.28.0")] }
5153 impl_from_bool! { i128, #[stable(feature = "from_bool", since = "1.28.0")] }
5154 impl_from_bool! { isize, #[stable(feature = "from_bool", since = "1.28.0")] }
5155
5156 // Unsigned -> Unsigned
5157 impl_from! { u8, u16, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5158 impl_from! { u8, u32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5159 impl_from! { u8, u64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5160 impl_from! { u8, u128, #[stable(feature = "i128", since = "1.26.0")] }
5161 impl_from! { u8, usize, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5162 impl_from! { u16, u32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5163 impl_from! { u16, u64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5164 impl_from! { u16, u128, #[stable(feature = "i128", since = "1.26.0")] }
5165 impl_from! { u32, u64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5166 impl_from! { u32, u128, #[stable(feature = "i128", since = "1.26.0")] }
5167 impl_from! { u64, u128, #[stable(feature = "i128", since = "1.26.0")] }
5168
5169 // Signed -> Signed
5170 impl_from! { i8, i16, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5171 impl_from! { i8, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5172 impl_from! { i8, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5173 impl_from! { i8, i128, #[stable(feature = "i128", since = "1.26.0")] }
5174 impl_from! { i8, isize, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5175 impl_from! { i16, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5176 impl_from! { i16, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5177 impl_from! { i16, i128, #[stable(feature = "i128", since = "1.26.0")] }
5178 impl_from! { i32, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5179 impl_from! { i32, i128, #[stable(feature = "i128", since = "1.26.0")] }
5180 impl_from! { i64, i128, #[stable(feature = "i128", since = "1.26.0")] }
5181
5182 // Unsigned -> Signed
5183 impl_from! { u8, i16, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5184 impl_from! { u8, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5185 impl_from! { u8, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5186 impl_from! { u8, i128, #[stable(feature = "i128", since = "1.26.0")] }
5187 impl_from! { u16, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5188 impl_from! { u16, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5189 impl_from! { u16, i128, #[stable(feature = "i128", since = "1.26.0")] }
5190 impl_from! { u32, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5191 impl_from! { u32, i128, #[stable(feature = "i128", since = "1.26.0")] }
5192 impl_from! { u64, i128, #[stable(feature = "i128", since = "1.26.0")] }
5193
5194 // The C99 standard defines bounds on INTPTR_MIN, INTPTR_MAX, and UINTPTR_MAX
5195 // which imply that pointer-sized integers must be at least 16 bits:
5196 // https://port70.net/~nsz/c/c99/n1256.html#7.18.2.4
5197 impl_from! { u16, usize, #[stable(feature = "lossless_iusize_conv", since = "1.26.0")] }
5198 impl_from! { u8, isize, #[stable(feature = "lossless_iusize_conv", since = "1.26.0")] }
5199 impl_from! { i16, isize, #[stable(feature = "lossless_iusize_conv", since = "1.26.0")] }
5200
5201 // RISC-V defines the possibility of a 128-bit address space (RV128).
5202
5203 // CHERI proposes 256-bit “capabilities”. Unclear if this would be relevant to usize/isize.
5204 // https://www.cl.cam.ac.uk/research/security/ctsrd/pdfs/20171017a-cheri-poster.pdf
5205 // http://www.csl.sri.com/users/neumann/2012resolve-cheri.pdf
5206
5207
5208 // Note: integers can only be represented with full precision in a float if
5209 // they fit in the significand, which is 24 bits in f32 and 53 bits in f64.
5210 // Lossy float conversions are not implemented at this time.
5211
5212 // Signed -> Float
5213 impl_from! { i8, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5214 impl_from! { i8, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5215 impl_from! { i16, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5216 impl_from! { i16, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5217 impl_from! { i32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5218
5219 // Unsigned -> Float
5220 impl_from! { u8, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5221 impl_from! { u8, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5222 impl_from! { u16, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5223 impl_from! { u16, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5224 impl_from! { u32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5225
5226 // Float -> Float
5227 impl_from! { f32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }