1 // Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 //! Numeric traits and functions for the built-in numeric types.
13 #![stable(feature = "rust1", since = "1.0.0")]
23 macro_rules! impl_nonzero_fmt {
24 ( ( $( $Trait: ident ),+ ) for $Ty: ident ) => {
26 #[stable(feature = "nonzero", since = "1.28.0")]
27 impl fmt::$Trait for $Ty {
29 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
37 macro_rules! doc_comment {
38 ($x:expr, $($tt:tt)*) => {
44 macro_rules! nonzero_integers {
45 ( $( $Ty: ident($Int: ty); )+ ) => {
48 concat!("An integer that is known not to equal zero.
50 This enables some memory layout optimization.
51 For example, `Option<", stringify!($Ty), ">` is the same size as `", stringify!($Int), "`:
54 use std::mem::size_of;
55 assert_eq!(size_of::<Option<std::num::", stringify!($Ty), ">>(), size_of::<", stringify!($Int),
58 #[stable(feature = "nonzero", since = "1.28.0")]
59 #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
61 pub struct $Ty(NonZero<$Int>);
65 /// Create a non-zero without checking the value.
69 /// The value must not be zero.
70 #[stable(feature = "nonzero", since = "1.28.0")]
72 pub const unsafe fn new_unchecked(n: $Int) -> Self {
73 $Ty(unsafe { NonZero(n) })
76 /// Create a non-zero if the given value is not zero.
77 #[stable(feature = "nonzero", since = "1.28.0")]
79 pub fn new(n: $Int) -> Option<Self> {
81 Some($Ty(unsafe { NonZero(n) }))
87 /// Returns the value as a primitive type.
88 #[stable(feature = "nonzero", since = "1.28.0")]
90 pub fn get(self) -> $Int {
96 #[stable(feature = "from_nonzero", since = "1.31.0")]
97 impl From<$Ty> for $Int {
98 fn from(nonzero: $Ty) -> Self {
104 (Debug, Display, Binary, Octal, LowerHex, UpperHex) for $Ty
119 /// Provides intentionally-wrapped arithmetic on `T`.
121 /// Operations like `+` on `u32` values is intended to never overflow,
122 /// and in some debug configurations overflow is detected and results
123 /// in a panic. While most arithmetic falls into this category, some
124 /// code explicitly expects and relies upon modular arithmetic (e.g.,
127 /// Wrapping arithmetic can be achieved either through methods like
128 /// `wrapping_add`, or through the `Wrapping<T>` type, which says that
129 /// all standard arithmetic operations on the underlying value are
130 /// intended to have wrapping semantics.
132 /// The underlying value can be retrieved through the `.0` index of the
133 /// `Wrapping` tuple.
138 /// use std::num::Wrapping;
140 /// let zero = Wrapping(0u32);
141 /// let one = Wrapping(1u32);
143 /// assert_eq!(std::u32::MAX, (zero - one).0);
145 #[stable(feature = "rust1", since = "1.0.0")]
146 #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default, Hash)]
148 pub struct Wrapping<T>(#[stable(feature = "rust1", since = "1.0.0")]
151 #[stable(feature = "rust1", since = "1.0.0")]
152 impl<T: fmt::Debug> fmt::Debug for Wrapping<T> {
153 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
158 #[stable(feature = "wrapping_display", since = "1.10.0")]
159 impl<T: fmt::Display> fmt::Display for Wrapping<T> {
160 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
165 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
166 impl<T: fmt::Binary> fmt::Binary for Wrapping<T> {
167 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
172 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
173 impl<T: fmt::Octal> fmt::Octal for Wrapping<T> {
174 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
179 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
180 impl<T: fmt::LowerHex> fmt::LowerHex for Wrapping<T> {
181 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
186 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
187 impl<T: fmt::UpperHex> fmt::UpperHex for Wrapping<T> {
188 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
193 // All these modules are technically private and only exposed for coretests:
201 // `Int` + `SignedInt` implemented for signed integers
202 macro_rules! int_impl {
203 ($SelfT:ty, $ActualT:ident, $UnsignedT:ty, $BITS:expr, $Min:expr, $Max:expr, $Feature:expr,
204 $EndFeature:expr, $rot:expr, $rot_op:expr, $rot_result:expr, $swap_op:expr, $swapped:expr,
205 $reversed:expr, $le_bytes:expr, $be_bytes:expr) => {
207 concat!("Returns the smallest value that can be represented by this integer type.
214 ", $Feature, "assert_eq!(", stringify!($SelfT), "::min_value(), ", stringify!($Min), ");",
217 #[stable(feature = "rust1", since = "1.0.0")]
220 pub const fn min_value() -> Self {
221 !0 ^ ((!0 as $UnsignedT) >> 1) as Self
226 concat!("Returns the largest value that can be represented by this integer type.
233 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value(), ", stringify!($Max), ");",
236 #[stable(feature = "rust1", since = "1.0.0")]
239 pub const fn max_value() -> Self {
245 concat!("Converts a string slice in a given base to an integer.
247 The string is expected to be an optional `+` or `-` sign followed by digits.
248 Leading and trailing whitespace represent an error. Digits are a subset of these characters,
249 depending on `radix`:
257 This function panics if `radix` is not in the range from 2 to 36.
264 ", $Feature, "assert_eq!(", stringify!($SelfT), "::from_str_radix(\"A\", 16), Ok(10));",
267 #[stable(feature = "rust1", since = "1.0.0")]
268 pub fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError> {
269 from_str_radix(src, radix)
274 concat!("Returns the number of ones in the binary representation of `self`.
281 ", $Feature, "let n = 0b100_0000", stringify!($SelfT), ";
283 assert_eq!(n.count_ones(), 1);",
287 #[stable(feature = "rust1", since = "1.0.0")]
288 #[rustc_const_unstable(feature = "const_int_ops")]
290 pub const fn count_ones(self) -> u32 { (self as $UnsignedT).count_ones() }
294 concat!("Returns the number of zeros in the binary representation of `self`.
301 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value().count_zeros(), 1);", $EndFeature, "
303 #[stable(feature = "rust1", since = "1.0.0")]
304 #[rustc_const_unstable(feature = "const_int_ops")]
306 pub const fn count_zeros(self) -> u32 {
312 concat!("Returns the number of leading zeros in the binary representation of `self`.
319 ", $Feature, "let n = -1", stringify!($SelfT), ";
321 assert_eq!(n.leading_zeros(), 0);",
324 #[stable(feature = "rust1", since = "1.0.0")]
325 #[rustc_const_unstable(feature = "const_int_ops")]
327 pub const fn leading_zeros(self) -> u32 {
328 (self as $UnsignedT).leading_zeros()
333 concat!("Returns the number of trailing zeros in the binary representation of `self`.
340 ", $Feature, "let n = -4", stringify!($SelfT), ";
342 assert_eq!(n.trailing_zeros(), 2);",
345 #[stable(feature = "rust1", since = "1.0.0")]
346 #[rustc_const_unstable(feature = "const_int_ops")]
348 pub const fn trailing_zeros(self) -> u32 {
349 (self as $UnsignedT).trailing_zeros()
354 concat!("Shifts the bits to the left by a specified amount, `n`,
355 wrapping the truncated bits to the end of the resulting integer.
357 Please note this isn't the same operation as `<<`!
364 let n = ", $rot_op, stringify!($SelfT), ";
365 let m = ", $rot_result, ";
367 assert_eq!(n.rotate_left(", $rot, "), m);
369 #[stable(feature = "rust1", since = "1.0.0")]
370 #[rustc_const_unstable(feature = "const_int_rotate")]
372 pub const fn rotate_left(self, n: u32) -> Self {
373 (self as $UnsignedT).rotate_left(n) as Self
378 concat!("Shifts the bits to the right by a specified amount, `n`,
379 wrapping the truncated bits to the beginning of the resulting
382 Please note this isn't the same operation as `>>`!
389 let n = ", $rot_result, stringify!($SelfT), ";
390 let m = ", $rot_op, ";
392 assert_eq!(n.rotate_right(", $rot, "), m);
394 #[stable(feature = "rust1", since = "1.0.0")]
395 #[rustc_const_unstable(feature = "const_int_rotate")]
397 pub const fn rotate_right(self, n: u32) -> Self {
398 (self as $UnsignedT).rotate_right(n) as Self
403 concat!("Reverses the byte order of the integer.
410 let n = ", $swap_op, stringify!($SelfT), ";
412 let m = n.swap_bytes();
414 assert_eq!(m, ", $swapped, ");
416 #[stable(feature = "rust1", since = "1.0.0")]
417 #[rustc_const_unstable(feature = "const_int_ops")]
419 pub const fn swap_bytes(self) -> Self {
420 (self as $UnsignedT).swap_bytes() as Self
425 concat!("Reverses the bit pattern of the integer.
432 #![feature(reverse_bits)]
434 let n = ", $swap_op, stringify!($SelfT), ";
435 let m = n.reverse_bits();
437 assert_eq!(m, ", $reversed, ");
439 #[unstable(feature = "reverse_bits", issue = "48763")]
440 #[rustc_const_unstable(feature = "const_int_conversion")]
442 pub const fn reverse_bits(self) -> Self {
443 (self as $UnsignedT).reverse_bits() as Self
448 concat!("Converts an integer from big endian to the target's endianness.
450 On big endian this is a no-op. On little endian the bytes are swapped.
457 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
459 if cfg!(target_endian = \"big\") {
460 assert_eq!(", stringify!($SelfT), "::from_be(n), n)
462 assert_eq!(", stringify!($SelfT), "::from_be(n), n.swap_bytes())
466 #[stable(feature = "rust1", since = "1.0.0")]
467 #[rustc_const_unstable(feature = "const_int_ops")]
469 pub const fn from_be(x: Self) -> Self {
470 #[cfg(target_endian = "big")]
474 #[cfg(not(target_endian = "big"))]
482 concat!("Converts an integer from little endian to the target's endianness.
484 On little endian this is a no-op. On big endian the bytes are swapped.
491 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
493 if cfg!(target_endian = \"little\") {
494 assert_eq!(", stringify!($SelfT), "::from_le(n), n)
496 assert_eq!(", stringify!($SelfT), "::from_le(n), n.swap_bytes())
500 #[stable(feature = "rust1", since = "1.0.0")]
501 #[rustc_const_unstable(feature = "const_int_ops")]
503 pub const fn from_le(x: Self) -> Self {
504 #[cfg(target_endian = "little")]
508 #[cfg(not(target_endian = "little"))]
516 concat!("Converts `self` to big endian from the target's endianness.
518 On big endian this is a no-op. On little endian the bytes are swapped.
525 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
527 if cfg!(target_endian = \"big\") {
528 assert_eq!(n.to_be(), n)
530 assert_eq!(n.to_be(), n.swap_bytes())
534 #[stable(feature = "rust1", since = "1.0.0")]
535 #[rustc_const_unstable(feature = "const_int_ops")]
537 pub const fn to_be(self) -> Self { // or not to be?
538 #[cfg(target_endian = "big")]
542 #[cfg(not(target_endian = "big"))]
550 concat!("Converts `self` to little endian from the target's endianness.
552 On little endian this is a no-op. On big endian the bytes are swapped.
559 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
561 if cfg!(target_endian = \"little\") {
562 assert_eq!(n.to_le(), n)
564 assert_eq!(n.to_le(), n.swap_bytes())
568 #[stable(feature = "rust1", since = "1.0.0")]
569 #[rustc_const_unstable(feature = "const_int_ops")]
571 pub const fn to_le(self) -> Self {
572 #[cfg(target_endian = "little")]
576 #[cfg(not(target_endian = "little"))]
584 concat!("Checked integer addition. Computes `self + rhs`, returning `None`
585 if overflow occurred.
592 ", $Feature, "assert_eq!((", stringify!($SelfT),
593 "::max_value() - 2).checked_add(1), Some(", stringify!($SelfT), "::max_value() - 1));
594 assert_eq!((", stringify!($SelfT), "::max_value() - 2).checked_add(3), None);",
597 #[stable(feature = "rust1", since = "1.0.0")]
599 pub fn checked_add(self, rhs: Self) -> Option<Self> {
600 let (a, b) = self.overflowing_add(rhs);
601 if b {None} else {Some(a)}
606 concat!("Checked integer subtraction. Computes `self - rhs`, returning `None` if
614 ", $Feature, "assert_eq!((", stringify!($SelfT),
615 "::min_value() + 2).checked_sub(1), Some(", stringify!($SelfT), "::min_value() + 1));
616 assert_eq!((", stringify!($SelfT), "::min_value() + 2).checked_sub(3), None);",
619 #[stable(feature = "rust1", since = "1.0.0")]
621 pub fn checked_sub(self, rhs: Self) -> Option<Self> {
622 let (a, b) = self.overflowing_sub(rhs);
623 if b {None} else {Some(a)}
628 concat!("Checked integer multiplication. Computes `self * rhs`, returning `None` if
636 ", $Feature, "assert_eq!(", stringify!($SelfT),
637 "::max_value().checked_mul(1), Some(", stringify!($SelfT), "::max_value()));
638 assert_eq!(", stringify!($SelfT), "::max_value().checked_mul(2), None);",
641 #[stable(feature = "rust1", since = "1.0.0")]
643 pub fn checked_mul(self, rhs: Self) -> Option<Self> {
644 let (a, b) = self.overflowing_mul(rhs);
645 if b {None} else {Some(a)}
650 concat!("Checked integer division. Computes `self / rhs`, returning `None` if `rhs == 0`
651 or the division results in overflow.
658 ", $Feature, "assert_eq!((", stringify!($SelfT),
659 "::min_value() + 1).checked_div(-1), Some(", stringify!($Max), "));
660 assert_eq!(", stringify!($SelfT), "::min_value().checked_div(-1), None);
661 assert_eq!((1", stringify!($SelfT), ").checked_div(0), None);",
664 #[stable(feature = "rust1", since = "1.0.0")]
666 pub fn checked_div(self, rhs: Self) -> Option<Self> {
667 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
670 Some(unsafe { intrinsics::unchecked_div(self, rhs) })
676 concat!("Checked Euclidean division. Computes `self.div_euc(rhs)`,
677 returning `None` if `rhs == 0` or the division results in overflow.
684 #![feature(euclidean_division)]
685 assert_eq!((", stringify!($SelfT),
686 "::min_value() + 1).checked_div_euc(-1), Some(", stringify!($Max), "));
687 assert_eq!(", stringify!($SelfT), "::min_value().checked_div_euc(-1), None);
688 assert_eq!((1", stringify!($SelfT), ").checked_div_euc(0), None);
690 #[unstable(feature = "euclidean_division", issue = "49048")]
692 pub fn checked_div_euc(self, rhs: Self) -> Option<Self> {
693 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
696 Some(self.div_euc(rhs))
702 concat!("Checked integer remainder. Computes `self % rhs`, returning `None` if
703 `rhs == 0` or the division results in overflow.
710 ", $Feature, "use std::", stringify!($SelfT), ";
712 assert_eq!(5", stringify!($SelfT), ".checked_rem(2), Some(1));
713 assert_eq!(5", stringify!($SelfT), ".checked_rem(0), None);
714 assert_eq!(", stringify!($SelfT), "::MIN.checked_rem(-1), None);",
717 #[stable(feature = "wrapping", since = "1.7.0")]
719 pub fn checked_rem(self, rhs: Self) -> Option<Self> {
720 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
723 Some(unsafe { intrinsics::unchecked_rem(self, rhs) })
729 concat!("Checked Euclidean modulo. Computes `self.mod_euc(rhs)`, returning `None` if
730 `rhs == 0` or the division results in overflow.
737 #![feature(euclidean_division)]
738 use std::", stringify!($SelfT), ";
740 assert_eq!(5", stringify!($SelfT), ".checked_mod_euc(2), Some(1));
741 assert_eq!(5", stringify!($SelfT), ".checked_mod_euc(0), None);
742 assert_eq!(", stringify!($SelfT), "::MIN.checked_mod_euc(-1), None);
744 #[unstable(feature = "euclidean_division", issue = "49048")]
746 pub fn checked_mod_euc(self, rhs: Self) -> Option<Self> {
747 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
750 Some(self.mod_euc(rhs))
756 concat!("Checked negation. Computes `-self`, returning `None` if `self == MIN`.
763 ", $Feature, "use std::", stringify!($SelfT), ";
765 assert_eq!(5", stringify!($SelfT), ".checked_neg(), Some(-5));
766 assert_eq!(", stringify!($SelfT), "::MIN.checked_neg(), None);",
769 #[stable(feature = "wrapping", since = "1.7.0")]
771 pub fn checked_neg(self) -> Option<Self> {
772 let (a, b) = self.overflowing_neg();
773 if b {None} else {Some(a)}
778 concat!("Checked shift left. Computes `self << rhs`, returning `None` if `rhs` is larger
779 than or equal to the number of bits in `self`.
786 ", $Feature, "assert_eq!(0x1", stringify!($SelfT), ".checked_shl(4), Some(0x10));
787 assert_eq!(0x1", stringify!($SelfT), ".checked_shl(129), None);",
790 #[stable(feature = "wrapping", since = "1.7.0")]
792 pub fn checked_shl(self, rhs: u32) -> Option<Self> {
793 let (a, b) = self.overflowing_shl(rhs);
794 if b {None} else {Some(a)}
799 concat!("Checked shift right. Computes `self >> rhs`, returning `None` if `rhs` is
800 larger than or equal to the number of bits in `self`.
807 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".checked_shr(4), Some(0x1));
808 assert_eq!(0x10", stringify!($SelfT), ".checked_shr(128), None);",
811 #[stable(feature = "wrapping", since = "1.7.0")]
813 pub fn checked_shr(self, rhs: u32) -> Option<Self> {
814 let (a, b) = self.overflowing_shr(rhs);
815 if b {None} else {Some(a)}
820 concat!("Checked absolute value. Computes `self.abs()`, returning `None` if
828 ", $Feature, "use std::", stringify!($SelfT), ";
830 assert_eq!((-5", stringify!($SelfT), ").checked_abs(), Some(5));
831 assert_eq!(", stringify!($SelfT), "::MIN.checked_abs(), None);",
834 #[stable(feature = "no_panic_abs", since = "1.13.0")]
836 pub fn checked_abs(self) -> Option<Self> {
837 if self.is_negative() {
846 concat!("Checked exponentiation. Computes `self.pow(exp)`, returning `None` if
854 #![feature(no_panic_pow)]
855 ", $Feature, "assert_eq!(8", stringify!($SelfT), ".checked_pow(2), Some(64));
856 assert_eq!(", stringify!($SelfT), "::max_value().checked_pow(2), None);",
860 #[unstable(feature = "no_panic_pow", issue = "48320")]
862 pub fn checked_pow(self, mut exp: u32) -> Option<Self> {
864 let mut acc: Self = 1;
868 acc = acc.checked_mul(base)?;
871 base = base.checked_mul(base)?;
874 // Deal with the final bit of the exponent separately, since
875 // squaring the base afterwards is not necessary and may cause a
876 // needless overflow.
878 acc = acc.checked_mul(base)?;
886 concat!("Saturating integer addition. Computes `self + rhs`, saturating at the numeric
887 bounds instead of overflowing.
894 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_add(1), 101);
895 assert_eq!(", stringify!($SelfT), "::max_value().saturating_add(100), ", stringify!($SelfT),
899 #[stable(feature = "rust1", since = "1.0.0")]
901 pub fn saturating_add(self, rhs: Self) -> Self {
902 match self.checked_add(rhs) {
904 None if rhs >= 0 => Self::max_value(),
905 None => Self::min_value(),
911 concat!("Saturating integer subtraction. Computes `self - rhs`, saturating at the
912 numeric bounds instead of overflowing.
919 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_sub(127), -27);
920 assert_eq!(", stringify!($SelfT), "::min_value().saturating_sub(100), ", stringify!($SelfT),
924 #[stable(feature = "rust1", since = "1.0.0")]
926 pub fn saturating_sub(self, rhs: Self) -> Self {
927 match self.checked_sub(rhs) {
929 None if rhs >= 0 => Self::min_value(),
930 None => Self::max_value(),
936 concat!("Saturating integer multiplication. Computes `self * rhs`, saturating at the
937 numeric bounds instead of overflowing.
944 ", $Feature, "use std::", stringify!($SelfT), ";
946 assert_eq!(10", stringify!($SelfT), ".saturating_mul(12), 120);
947 assert_eq!(", stringify!($SelfT), "::MAX.saturating_mul(10), ", stringify!($SelfT), "::MAX);
948 assert_eq!(", stringify!($SelfT), "::MIN.saturating_mul(10), ", stringify!($SelfT), "::MIN);",
951 #[stable(feature = "wrapping", since = "1.7.0")]
953 pub fn saturating_mul(self, rhs: Self) -> Self {
954 self.checked_mul(rhs).unwrap_or_else(|| {
955 if (self < 0 && rhs < 0) || (self > 0 && rhs > 0) {
965 concat!("Saturating integer exponentiation. Computes `self.pow(exp)`,
966 saturating at the numeric bounds instead of overflowing.
973 #![feature(no_panic_pow)]
974 ", $Feature, "use std::", stringify!($SelfT), ";
976 assert_eq!((-4", stringify!($SelfT), ").saturating_pow(3), -64);
977 assert_eq!(", stringify!($SelfT), "::MIN.saturating_pow(2), ", stringify!($SelfT), "::MAX);
978 assert_eq!(", stringify!($SelfT), "::MIN.saturating_pow(3), ", stringify!($SelfT), "::MIN);",
981 #[unstable(feature = "no_panic_pow", issue = "48320")]
983 pub fn saturating_pow(self, exp: u32) -> Self {
984 match self.checked_pow(exp) {
986 None if self < 0 && exp % 2 == 1 => Self::min_value(),
987 None => Self::max_value(),
993 concat!("Wrapping (modular) addition. Computes `self + rhs`, wrapping around at the
994 boundary of the type.
1001 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_add(27), 127);
1002 assert_eq!(", stringify!($SelfT), "::max_value().wrapping_add(2), ", stringify!($SelfT),
1003 "::min_value() + 1);",
1006 #[stable(feature = "rust1", since = "1.0.0")]
1007 #[rustc_const_unstable(feature = "const_int_wrapping")]
1009 pub const fn wrapping_add(self, rhs: Self) -> Self {
1011 intrinsics::overflowing_add(self, rhs)
1017 concat!("Wrapping (modular) subtraction. Computes `self - rhs`, wrapping around at the
1018 boundary of the type.
1025 ", $Feature, "assert_eq!(0", stringify!($SelfT), ".wrapping_sub(127), -127);
1026 assert_eq!((-2", stringify!($SelfT), ").wrapping_sub(", stringify!($SelfT), "::max_value()), ",
1027 stringify!($SelfT), "::max_value());",
1030 #[stable(feature = "rust1", since = "1.0.0")]
1031 #[rustc_const_unstable(feature = "const_int_wrapping")]
1033 pub const fn wrapping_sub(self, rhs: Self) -> Self {
1035 intrinsics::overflowing_sub(self, rhs)
1041 concat!("Wrapping (modular) multiplication. Computes `self * rhs`, wrapping around at
1042 the boundary of the type.
1049 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".wrapping_mul(12), 120);
1050 assert_eq!(11i8.wrapping_mul(12), -124);",
1053 #[stable(feature = "rust1", since = "1.0.0")]
1054 #[rustc_const_unstable(feature = "const_int_wrapping")]
1056 pub const fn wrapping_mul(self, rhs: Self) -> Self {
1058 intrinsics::overflowing_mul(self, rhs)
1064 concat!("Wrapping (modular) division. Computes `self / rhs`, wrapping around at the
1065 boundary of the type.
1067 The only case where such wrapping can occur is when one divides `MIN / -1` on a signed type (where
1068 `MIN` is the negative minimal value for the type); this is equivalent to `-MIN`, a positive value
1069 that is too large to represent in the type. In such a case, this function returns `MIN` itself.
1073 This function will panic if `rhs` is 0.
1080 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_div(10), 10);
1081 assert_eq!((-128i8).wrapping_div(-1), -128);",
1084 #[stable(feature = "num_wrapping", since = "1.2.0")]
1086 pub fn wrapping_div(self, rhs: Self) -> Self {
1087 self.overflowing_div(rhs).0
1092 concat!("Wrapping Euclidean division. Computes `self.div_euc(rhs)`,
1093 wrapping around at the boundary of the type.
1095 Wrapping will only occur in `MIN / -1` on a signed type (where `MIN` is the negative minimal value
1096 for the type). This is equivalent to `-MIN`, a positive value that is too large to represent in the
1097 type. In this case, this method returns `MIN` itself.
1101 This function will panic if `rhs` is 0.
1108 #![feature(euclidean_division)]
1109 assert_eq!(100", stringify!($SelfT), ".wrapping_div_euc(10), 10);
1110 assert_eq!((-128i8).wrapping_div_euc(-1), -128);
1112 #[unstable(feature = "euclidean_division", issue = "49048")]
1114 pub fn wrapping_div_euc(self, rhs: Self) -> Self {
1115 self.overflowing_div_euc(rhs).0
1120 concat!("Wrapping (modular) remainder. Computes `self % rhs`, wrapping around at the
1121 boundary of the type.
1123 Such wrap-around never actually occurs mathematically; implementation artifacts make `x % y`
1124 invalid for `MIN / -1` on a signed type (where `MIN` is the negative minimal value). In such a case,
1125 this function returns `0`.
1129 This function will panic if `rhs` is 0.
1136 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_rem(10), 0);
1137 assert_eq!((-128i8).wrapping_rem(-1), 0);",
1140 #[stable(feature = "num_wrapping", since = "1.2.0")]
1142 pub fn wrapping_rem(self, rhs: Self) -> Self {
1143 self.overflowing_rem(rhs).0
1148 concat!("Wrapping Euclidean modulo. Computes `self.mod_euc(rhs)`, wrapping around at the
1149 boundary of the type.
1151 Wrapping will only occur in `MIN % -1` on a signed type (where `MIN` is the negative minimal value
1152 for the type). In this case, this method returns 0.
1156 This function will panic if `rhs` is 0.
1163 #![feature(euclidean_division)]
1164 assert_eq!(100", stringify!($SelfT), ".wrapping_mod_euc(10), 0);
1165 assert_eq!((-128i8).wrapping_mod_euc(-1), 0);
1167 #[unstable(feature = "euclidean_division", issue = "49048")]
1169 pub fn wrapping_mod_euc(self, rhs: Self) -> Self {
1170 self.overflowing_mod_euc(rhs).0
1175 concat!("Wrapping (modular) negation. Computes `-self`, wrapping around at the boundary
1178 The only case where such wrapping can occur is when one negates `MIN` on a signed type (where `MIN`
1179 is the negative minimal value for the type); this is a positive value that is too large to represent
1180 in the type. In such a case, this function returns `MIN` itself.
1187 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_neg(), -100);
1188 assert_eq!(", stringify!($SelfT), "::min_value().wrapping_neg(), ", stringify!($SelfT),
1192 #[stable(feature = "num_wrapping", since = "1.2.0")]
1194 pub fn wrapping_neg(self) -> Self {
1195 self.overflowing_neg().0
1200 concat!("Panic-free bitwise shift-left; yields `self << mask(rhs)`, where `mask` removes
1201 any high-order bits of `rhs` that would cause the shift to exceed the bitwidth of the type.
1203 Note that this is *not* the same as a rotate-left; the RHS of a wrapping shift-left is restricted to
1204 the range of the type, rather than the bits shifted out of the LHS being returned to the other end.
1205 The primitive integer types all implement a `rotate_left` function, which may be what you want
1213 ", $Feature, "assert_eq!((-1", stringify!($SelfT), ").wrapping_shl(7), -128);
1214 assert_eq!((-1", stringify!($SelfT), ").wrapping_shl(128), -1);",
1217 #[stable(feature = "num_wrapping", since = "1.2.0")]
1218 #[rustc_const_unstable(feature = "const_int_wrapping")]
1220 pub const fn wrapping_shl(self, rhs: u32) -> Self {
1222 intrinsics::unchecked_shl(self, (rhs & ($BITS - 1)) as $SelfT)
1228 concat!("Panic-free bitwise shift-right; yields `self >> mask(rhs)`, where `mask`
1229 removes any high-order bits of `rhs` that would cause the shift to exceed the bitwidth of the type.
1231 Note that this is *not* the same as a rotate-right; the RHS of a wrapping shift-right is restricted
1232 to the range of the type, rather than the bits shifted out of the LHS being returned to the other
1233 end. The primitive integer types all implement a `rotate_right` function, which may be what you want
1241 ", $Feature, "assert_eq!((-128", stringify!($SelfT), ").wrapping_shr(7), -1);
1242 assert_eq!((-128i16).wrapping_shr(64), -128);",
1245 #[stable(feature = "num_wrapping", since = "1.2.0")]
1246 #[rustc_const_unstable(feature = "const_int_wrapping")]
1248 pub const fn wrapping_shr(self, rhs: u32) -> Self {
1250 intrinsics::unchecked_shr(self, (rhs & ($BITS - 1)) as $SelfT)
1256 concat!("Wrapping (modular) absolute value. Computes `self.abs()`, wrapping around at
1257 the boundary of the type.
1259 The only case where such wrapping can occur is when one takes the absolute value of the negative
1260 minimal value for the type this is a positive value that is too large to represent in the type. In
1261 such a case, this function returns `MIN` itself.
1268 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_abs(), 100);
1269 assert_eq!((-100", stringify!($SelfT), ").wrapping_abs(), 100);
1270 assert_eq!(", stringify!($SelfT), "::min_value().wrapping_abs(), ", stringify!($SelfT),
1272 assert_eq!((-128i8).wrapping_abs() as u8, 128);",
1275 #[stable(feature = "no_panic_abs", since = "1.13.0")]
1277 pub fn wrapping_abs(self) -> Self {
1278 if self.is_negative() {
1287 concat!("Wrapping (modular) exponentiation. Computes `self.pow(exp)`,
1288 wrapping around at the boundary of the type.
1295 #![feature(no_panic_pow)]
1296 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".wrapping_pow(4), 81);
1297 assert_eq!(3i8.wrapping_pow(5), -13);
1298 assert_eq!(3i8.wrapping_pow(6), -39);",
1301 #[unstable(feature = "no_panic_pow", issue = "48320")]
1303 pub fn wrapping_pow(self, mut exp: u32) -> Self {
1304 let mut base = self;
1305 let mut acc: Self = 1;
1309 acc = acc.wrapping_mul(base);
1312 base = base.wrapping_mul(base);
1315 // Deal with the final bit of the exponent separately, since
1316 // squaring the base afterwards is not necessary and may cause a
1317 // needless overflow.
1319 acc = acc.wrapping_mul(base);
1327 concat!("Calculates `self` + `rhs`
1329 Returns a tuple of the addition along with a boolean indicating whether an arithmetic overflow would
1330 occur. If an overflow would have occurred then the wrapped value is returned.
1337 ", $Feature, "use std::", stringify!($SelfT), ";
1339 assert_eq!(5", stringify!($SelfT), ".overflowing_add(2), (7, false));
1340 assert_eq!(", stringify!($SelfT), "::MAX.overflowing_add(1), (", stringify!($SelfT),
1341 "::MIN, true));", $EndFeature, "
1343 #[stable(feature = "wrapping", since = "1.7.0")]
1344 #[rustc_const_unstable(feature = "const_int_overflowing")]
1346 pub const fn overflowing_add(self, rhs: Self) -> (Self, bool) {
1347 let (a, b) = unsafe {
1348 intrinsics::add_with_overflow(self as $ActualT,
1356 concat!("Calculates `self` - `rhs`
1358 Returns a tuple of the subtraction along with a boolean indicating whether an arithmetic overflow
1359 would occur. If an overflow would have occurred then the wrapped value is returned.
1366 ", $Feature, "use std::", stringify!($SelfT), ";
1368 assert_eq!(5", stringify!($SelfT), ".overflowing_sub(2), (3, false));
1369 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_sub(1), (", stringify!($SelfT),
1370 "::MAX, true));", $EndFeature, "
1372 #[stable(feature = "wrapping", since = "1.7.0")]
1373 #[rustc_const_unstable(feature = "const_int_overflowing")]
1375 pub const fn overflowing_sub(self, rhs: Self) -> (Self, bool) {
1376 let (a, b) = unsafe {
1377 intrinsics::sub_with_overflow(self as $ActualT,
1385 concat!("Calculates the multiplication of `self` and `rhs`.
1387 Returns a tuple of the multiplication along with a boolean indicating whether an arithmetic overflow
1388 would occur. If an overflow would have occurred then the wrapped value is returned.
1395 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".overflowing_mul(2), (10, false));
1396 assert_eq!(1_000_000_000i32.overflowing_mul(10), (1410065408, true));",
1399 #[stable(feature = "wrapping", since = "1.7.0")]
1400 #[rustc_const_unstable(feature = "const_int_overflowing")]
1402 pub const fn overflowing_mul(self, rhs: Self) -> (Self, bool) {
1403 let (a, b) = unsafe {
1404 intrinsics::mul_with_overflow(self as $ActualT,
1412 concat!("Calculates the divisor when `self` is divided by `rhs`.
1414 Returns a tuple of the divisor along with a boolean indicating whether an arithmetic overflow would
1415 occur. If an overflow would occur then self is returned.
1419 This function will panic if `rhs` is 0.
1426 ", $Feature, "use std::", stringify!($SelfT), ";
1428 assert_eq!(5", stringify!($SelfT), ".overflowing_div(2), (2, false));
1429 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_div(-1), (", stringify!($SelfT),
1434 #[stable(feature = "wrapping", since = "1.7.0")]
1435 pub fn overflowing_div(self, rhs: Self) -> (Self, bool) {
1436 if self == Self::min_value() && rhs == -1 {
1445 concat!("Calculates the quotient of Euclidean division `self.div_euc(rhs)`.
1447 Returns a tuple of the divisor along with a boolean indicating whether an arithmetic overflow would
1448 occur. If an overflow would occur then `self` is returned.
1452 This function will panic if `rhs` is 0.
1459 #![feature(euclidean_division)]
1460 use std::", stringify!($SelfT), ";
1462 assert_eq!(5", stringify!($SelfT), ".overflowing_div_euc(2), (2, false));
1463 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_div_euc(-1), (", stringify!($SelfT),
1467 #[unstable(feature = "euclidean_division", issue = "49048")]
1468 pub fn overflowing_div_euc(self, rhs: Self) -> (Self, bool) {
1469 if self == Self::min_value() && rhs == -1 {
1472 (self.div_euc(rhs), false)
1478 concat!("Calculates the remainder when `self` is divided by `rhs`.
1480 Returns a tuple of the remainder after dividing along with a boolean indicating whether an
1481 arithmetic overflow would occur. If an overflow would occur then 0 is returned.
1485 This function will panic if `rhs` is 0.
1492 ", $Feature, "use std::", stringify!($SelfT), ";
1494 assert_eq!(5", stringify!($SelfT), ".overflowing_rem(2), (1, false));
1495 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_rem(-1), (0, true));",
1499 #[stable(feature = "wrapping", since = "1.7.0")]
1500 pub fn overflowing_rem(self, rhs: Self) -> (Self, bool) {
1501 if self == Self::min_value() && rhs == -1 {
1511 concat!("Calculates the remainder `self.mod_euc(rhs)` by Euclidean division.
1513 Returns a tuple of the remainder after dividing along with a boolean indicating whether an
1514 arithmetic overflow would occur. If an overflow would occur then 0 is returned.
1518 This function will panic if `rhs` is 0.
1525 #![feature(euclidean_division)]
1526 use std::", stringify!($SelfT), ";
1528 assert_eq!(5", stringify!($SelfT), ".overflowing_mod_euc(2), (1, false));
1529 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_mod_euc(-1), (0, true));
1531 #[unstable(feature = "euclidean_division", issue = "49048")]
1533 pub fn overflowing_mod_euc(self, rhs: Self) -> (Self, bool) {
1534 if self == Self::min_value() && rhs == -1 {
1537 (self.mod_euc(rhs), false)
1544 concat!("Negates self, overflowing if this is equal to the minimum value.
1546 Returns a tuple of the negated version of self along with a boolean indicating whether an overflow
1547 happened. If `self` is the minimum value (e.g. `i32::MIN` for values of type `i32`), then the
1548 minimum value will be returned again and `true` will be returned for an overflow happening.
1555 ", $Feature, "use std::", stringify!($SelfT), ";
1557 assert_eq!(2", stringify!($SelfT), ".overflowing_neg(), (-2, false));
1558 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_neg(), (", stringify!($SelfT),
1559 "::MIN, true));", $EndFeature, "
1562 #[stable(feature = "wrapping", since = "1.7.0")]
1563 pub fn overflowing_neg(self) -> (Self, bool) {
1564 if self == Self::min_value() {
1565 (Self::min_value(), true)
1573 concat!("Shifts self left by `rhs` bits.
1575 Returns a tuple of the shifted version of self along with a boolean indicating whether the shift
1576 value was larger than or equal to the number of bits. If the shift value is too large, then value is
1577 masked (N-1) where N is the number of bits, and this value is then used to perform the shift.
1584 ", $Feature, "assert_eq!(0x1", stringify!($SelfT),".overflowing_shl(4), (0x10, false));
1585 assert_eq!(0x1i32.overflowing_shl(36), (0x10, true));",
1588 #[stable(feature = "wrapping", since = "1.7.0")]
1589 #[rustc_const_unstable(feature = "const_int_overflowing")]
1591 pub const fn overflowing_shl(self, rhs: u32) -> (Self, bool) {
1592 (self.wrapping_shl(rhs), (rhs > ($BITS - 1)))
1597 concat!("Shifts self right by `rhs` bits.
1599 Returns a tuple of the shifted version of self along with a boolean indicating whether the shift
1600 value was larger than or equal to the number of bits. If the shift value is too large, then value is
1601 masked (N-1) where N is the number of bits, and this value is then used to perform the shift.
1608 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".overflowing_shr(4), (0x1, false));
1609 assert_eq!(0x10i32.overflowing_shr(36), (0x1, true));",
1612 #[stable(feature = "wrapping", since = "1.7.0")]
1613 #[rustc_const_unstable(feature = "const_int_overflowing")]
1615 pub const fn overflowing_shr(self, rhs: u32) -> (Self, bool) {
1616 (self.wrapping_shr(rhs), (rhs > ($BITS - 1)))
1621 concat!("Computes the absolute value of `self`.
1623 Returns a tuple of the absolute version of self along with a boolean indicating whether an overflow
1624 happened. If self is the minimum value (e.g. ", stringify!($SelfT), "::MIN for values of type
1625 ", stringify!($SelfT), "), then the minimum value will be returned again and true will be returned
1626 for an overflow happening.
1633 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".overflowing_abs(), (10, false));
1634 assert_eq!((-10", stringify!($SelfT), ").overflowing_abs(), (10, false));
1635 assert_eq!((", stringify!($SelfT), "::min_value()).overflowing_abs(), (", stringify!($SelfT),
1636 "::min_value(), true));",
1639 #[stable(feature = "no_panic_abs", since = "1.13.0")]
1641 pub fn overflowing_abs(self) -> (Self, bool) {
1642 if self.is_negative() {
1643 self.overflowing_neg()
1651 concat!("Raises self to the power of `exp`, using exponentiation by squaring.
1653 Returns a tuple of the exponentiation along with a bool indicating
1654 whether an overflow happened.
1661 #![feature(no_panic_pow)]
1662 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".overflowing_pow(4), (81, false));
1663 assert_eq!(3i8.overflowing_pow(5), (-13, true));",
1666 #[unstable(feature = "no_panic_pow", issue = "48320")]
1668 pub fn overflowing_pow(self, mut exp: u32) -> (Self, bool) {
1669 let mut base = self;
1670 let mut acc: Self = 1;
1671 let mut overflown = false;
1672 // Scratch space for storing results of overflowing_mul.
1677 r = acc.overflowing_mul(base);
1682 r = base.overflowing_mul(base);
1687 // Deal with the final bit of the exponent separately, since
1688 // squaring the base afterwards is not necessary and may cause a
1689 // needless overflow.
1691 r = acc.overflowing_mul(base);
1701 concat!("Raises self to the power of `exp`, using exponentiation by squaring.
1708 ", $Feature, "let x: ", stringify!($SelfT), " = 2; // or any other integer type
1710 assert_eq!(x.pow(5), 32);",
1713 #[stable(feature = "rust1", since = "1.0.0")]
1715 #[rustc_inherit_overflow_checks]
1716 pub fn pow(self, mut exp: u32) -> Self {
1717 let mut base = self;
1728 // Deal with the final bit of the exponent separately, since
1729 // squaring the base afterwards is not necessary and may cause a
1730 // needless overflow.
1740 concat!("Calculates the quotient of Euclidean division of `self` by `rhs`.
1742 This computes the integer `n` such that `self = n * rhs + self.mod_euc(rhs)`.
1743 In other words, the result is `self / rhs` rounded to the integer `n`
1744 such that `self >= n * rhs`.
1748 This function will panic if `rhs` is 0.
1755 #![feature(euclidean_division)]
1756 let a: ", stringify!($SelfT), " = 7; // or any other integer type
1759 assert_eq!(a.div_euc(b), 1); // 7 >= 4 * 1
1760 assert_eq!(a.div_euc(-b), -1); // 7 >= -4 * -1
1761 assert_eq!((-a).div_euc(b), -2); // -7 >= 4 * -2
1762 assert_eq!((-a).div_euc(-b), 2); // -7 >= -4 * 2
1764 #[unstable(feature = "euclidean_division", issue = "49048")]
1766 #[rustc_inherit_overflow_checks]
1767 pub fn div_euc(self, rhs: Self) -> Self {
1770 return if rhs > 0 { q - 1 } else { q + 1 }
1778 concat!("Calculates the remainder `self mod rhs` by Euclidean division.
1780 In particular, the result `n` satisfies `0 <= n < rhs.abs()`.
1784 This function will panic if `rhs` is 0.
1791 #![feature(euclidean_division)]
1792 let a: ", stringify!($SelfT), " = 7; // or any other integer type
1795 assert_eq!(a.mod_euc(b), 3);
1796 assert_eq!((-a).mod_euc(b), 1);
1797 assert_eq!(a.mod_euc(-b), 3);
1798 assert_eq!((-a).mod_euc(-b), 1);
1800 #[unstable(feature = "euclidean_division", issue = "49048")]
1802 #[rustc_inherit_overflow_checks]
1803 pub fn mod_euc(self, rhs: Self) -> Self {
1818 concat!("Computes the absolute value of `self`.
1822 The absolute value of `", stringify!($SelfT), "::min_value()` cannot be represented as an
1823 `", stringify!($SelfT), "`, and attempting to calculate it will cause an overflow. This means that
1824 code in debug mode will trigger a panic on this case and optimized code will return `",
1825 stringify!($SelfT), "::min_value()` without a panic.
1832 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".abs(), 10);
1833 assert_eq!((-10", stringify!($SelfT), ").abs(), 10);",
1836 #[stable(feature = "rust1", since = "1.0.0")]
1838 #[rustc_inherit_overflow_checks]
1839 pub fn abs(self) -> Self {
1840 if self.is_negative() {
1841 // Note that the #[inline] above means that the overflow
1842 // semantics of this negation depend on the crate we're being
1852 concat!("Returns a number representing sign of `self`.
1854 - `0` if the number is zero
1855 - `1` if the number is positive
1856 - `-1` if the number is negative
1863 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".signum(), 1);
1864 assert_eq!(0", stringify!($SelfT), ".signum(), 0);
1865 assert_eq!((-10", stringify!($SelfT), ").signum(), -1);",
1868 #[stable(feature = "rust1", since = "1.0.0")]
1870 pub fn signum(self) -> Self {
1880 concat!("Returns `true` if `self` is positive and `false` if the number is zero or
1888 ", $Feature, "assert!(10", stringify!($SelfT), ".is_positive());
1889 assert!(!(-10", stringify!($SelfT), ").is_positive());",
1892 #[stable(feature = "rust1", since = "1.0.0")]
1893 #[rustc_const_unstable(feature = "const_int_sign")]
1895 pub const fn is_positive(self) -> bool { self > 0 }
1899 concat!("Returns `true` if `self` is negative and `false` if the number is zero or
1907 ", $Feature, "assert!((-10", stringify!($SelfT), ").is_negative());
1908 assert!(!10", stringify!($SelfT), ".is_negative());",
1911 #[stable(feature = "rust1", since = "1.0.0")]
1912 #[rustc_const_unstable(feature = "const_int_sign")]
1914 pub const fn is_negative(self) -> bool { self < 0 }
1918 concat!("Return the memory representation of this integer as a byte array in
1919 big-endian (network) byte order.
1924 let bytes = ", $swap_op, stringify!($SelfT), ".to_be_bytes();
1925 assert_eq!(bytes, ", $be_bytes, ");
1927 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
1928 #[rustc_const_unstable(feature = "const_int_conversion")]
1930 pub const fn to_be_bytes(self) -> [u8; mem::size_of::<Self>()] {
1931 self.to_be().to_ne_bytes()
1936 concat!("Return the memory representation of this integer as a byte array in
1937 little-endian byte order.
1942 let bytes = ", $swap_op, stringify!($SelfT), ".to_le_bytes();
1943 assert_eq!(bytes, ", $le_bytes, ");
1945 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
1946 #[rustc_const_unstable(feature = "const_int_conversion")]
1948 pub const fn to_le_bytes(self) -> [u8; mem::size_of::<Self>()] {
1949 self.to_le().to_ne_bytes()
1955 Return the memory representation of this integer as a byte array in
1958 As the target platform's native endianness is used, portable code
1959 should use [`to_be_bytes`] or [`to_le_bytes`], as appropriate,
1962 [`to_be_bytes`]: #method.to_be_bytes
1963 [`to_le_bytes`]: #method.to_le_bytes
1968 let bytes = ", $swap_op, stringify!($SelfT), ".to_ne_bytes();
1969 assert_eq!(bytes, if cfg!(target_endian = \"big\") {
1975 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
1976 #[rustc_const_unstable(feature = "const_int_conversion")]
1978 pub const fn to_ne_bytes(self) -> [u8; mem::size_of::<Self>()] {
1979 unsafe { mem::transmute(self) }
1984 concat!("Create an integer value from its representation as a byte array in
1990 let value = ", stringify!($SelfT), "::from_be_bytes(", $be_bytes, ");
1991 assert_eq!(value, ", $swap_op, ");
1994 When starting from a slice rather than an array, fallible conversion APIs can be used:
1997 #![feature(try_from)]
1998 use std::convert::TryInto;
2000 fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
2001 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
2003 ", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
2006 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2007 #[rustc_const_unstable(feature = "const_int_conversion")]
2009 pub const fn from_be_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
2010 Self::from_be(Self::from_ne_bytes(bytes))
2016 Create an integer value from its representation as a byte array in
2022 let value = ", stringify!($SelfT), "::from_le_bytes(", $le_bytes, ");
2023 assert_eq!(value, ", $swap_op, ");
2026 When starting from a slice rather than an array, fallible conversion APIs can be used:
2029 #![feature(try_from)]
2030 use std::convert::TryInto;
2032 fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
2033 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
2035 ", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
2038 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2039 #[rustc_const_unstable(feature = "const_int_conversion")]
2041 pub const fn from_le_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
2042 Self::from_le(Self::from_ne_bytes(bytes))
2047 concat!("Create an integer value from its memory representation as a byte
2048 array in native endianness.
2050 As the target platform's native endianness is used, portable code
2051 likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as
2052 appropriate instead.
2054 [`from_be_bytes`]: #method.from_be_bytes
2055 [`from_le_bytes`]: #method.from_le_bytes
2060 let value = ", stringify!($SelfT), "::from_ne_bytes(if cfg!(target_endian = \"big\") {
2065 assert_eq!(value, ", $swap_op, ");
2068 When starting from a slice rather than an array, fallible conversion APIs can be used:
2071 #![feature(try_from)]
2072 use std::convert::TryInto;
2074 fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
2075 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
2077 ", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
2080 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2081 #[rustc_const_unstable(feature = "const_int_conversion")]
2083 pub const fn from_ne_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
2084 unsafe { mem::transmute(bytes) }
2092 int_impl! { i8, i8, u8, 8, -128, 127, "", "", 2, "-0x7e", "0xa", "0x12", "0x12", "0x48",
2093 "[0x12]", "[0x12]" }
2098 int_impl! { i16, i16, u16, 16, -32768, 32767, "", "", 4, "-0x5ffd", "0x3a", "0x1234", "0x3412",
2099 "0x2c48", "[0x34, 0x12]", "[0x12, 0x34]" }
2104 int_impl! { i32, i32, u32, 32, -2147483648, 2147483647, "", "", 8, "0x10000b3", "0xb301",
2105 "0x12345678", "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]",
2106 "[0x12, 0x34, 0x56, 0x78]" }
2111 int_impl! { i64, i64, u64, 64, -9223372036854775808, 9223372036854775807, "", "", 12,
2112 "0xaa00000000006e1", "0x6e10aa", "0x1234567890123456", "0x5634129078563412",
2113 "0x6a2c48091e6a2c48", "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
2114 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]" }
2119 int_impl! { i128, i128, u128, 128, -170141183460469231731687303715884105728,
2120 170141183460469231731687303715884105727, "", "", 16,
2121 "0x13f40000000000000000000000004f76", "0x4f7613f4", "0x12345678901234567890123456789012",
2122 "0x12907856341290785634129078563412", "0x48091e6a2c48091e6a2c48091e6a2c48",
2123 "[0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, \
2124 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
2125 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, \
2126 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12]" }
2129 #[cfg(target_pointer_width = "16")]
2132 int_impl! { isize, i16, u16, 16, -32768, 32767, "", "", 4, "-0x5ffd", "0x3a", "0x1234",
2133 "0x3412", "0x2c48", "[0x34, 0x12]", "[0x12, 0x34]" }
2136 #[cfg(target_pointer_width = "32")]
2139 int_impl! { isize, i32, u32, 32, -2147483648, 2147483647, "", "", 8, "0x10000b3", "0xb301",
2140 "0x12345678", "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]",
2141 "[0x12, 0x34, 0x56, 0x78]" }
2144 #[cfg(target_pointer_width = "64")]
2147 int_impl! { isize, i64, u64, 64, -9223372036854775808, 9223372036854775807, "", "",
2148 12, "0xaa00000000006e1", "0x6e10aa", "0x1234567890123456", "0x5634129078563412",
2149 "0x6a2c48091e6a2c48", "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
2150 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]" }
2153 // Emits the correct `cttz` call, depending on the size of the type.
2154 macro_rules! uint_cttz_call {
2155 // As of LLVM 3.6 the codegen for the zero-safe cttz8 intrinsic
2156 // emits two conditional moves on x86_64. By promoting the value to
2157 // u16 and setting bit 8, we get better code without any conditional
2159 // FIXME: There's a LLVM patch (http://reviews.llvm.org/D9284)
2160 // pending, remove this workaround once LLVM generates better code
2162 ($value:expr, 8) => { intrinsics::cttz($value as u16 | 0x100) };
2163 ($value:expr, $_BITS:expr) => { intrinsics::cttz($value) }
2166 // `Int` + `UnsignedInt` implemented for unsigned integers
2167 macro_rules! uint_impl {
2168 ($SelfT:ty, $ActualT:ty, $BITS:expr, $MaxV:expr, $Feature:expr, $EndFeature:expr,
2169 $rot:expr, $rot_op:expr, $rot_result:expr, $swap_op:expr, $swapped:expr,
2170 $reversed:expr, $le_bytes:expr, $be_bytes:expr) => {
2172 concat!("Returns the smallest value that can be represented by this integer type.
2179 ", $Feature, "assert_eq!(", stringify!($SelfT), "::min_value(), 0);", $EndFeature, "
2181 #[stable(feature = "rust1", since = "1.0.0")]
2184 pub const fn min_value() -> Self { 0 }
2188 concat!("Returns the largest value that can be represented by this integer type.
2195 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value(), ",
2196 stringify!($MaxV), ");", $EndFeature, "
2198 #[stable(feature = "rust1", since = "1.0.0")]
2201 pub const fn max_value() -> Self { !0 }
2205 concat!("Converts a string slice in a given base to an integer.
2207 The string is expected to be an optional `+` sign
2209 Leading and trailing whitespace represent an error.
2210 Digits are a subset of these characters, depending on `radix`:
2218 This function panics if `radix` is not in the range from 2 to 36.
2225 ", $Feature, "assert_eq!(", stringify!($SelfT), "::from_str_radix(\"A\", 16), Ok(10));",
2228 #[stable(feature = "rust1", since = "1.0.0")]
2229 pub fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError> {
2230 from_str_radix(src, radix)
2235 concat!("Returns the number of ones in the binary representation of `self`.
2242 ", $Feature, "let n = 0b01001100", stringify!($SelfT), ";
2244 assert_eq!(n.count_ones(), 3);", $EndFeature, "
2246 #[stable(feature = "rust1", since = "1.0.0")]
2247 #[rustc_const_unstable(feature = "const_int_ops")]
2249 pub const fn count_ones(self) -> u32 {
2250 unsafe { intrinsics::ctpop(self as $ActualT) as u32 }
2255 concat!("Returns the number of zeros in the binary representation of `self`.
2262 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value().count_zeros(), 0);", $EndFeature, "
2264 #[stable(feature = "rust1", since = "1.0.0")]
2265 #[rustc_const_unstable(feature = "const_int_ops")]
2267 pub const fn count_zeros(self) -> u32 {
2268 (!self).count_ones()
2273 concat!("Returns the number of leading zeros in the binary representation of `self`.
2280 ", $Feature, "let n = ", stringify!($SelfT), "::max_value() >> 2;
2282 assert_eq!(n.leading_zeros(), 2);", $EndFeature, "
2284 #[stable(feature = "rust1", since = "1.0.0")]
2285 #[rustc_const_unstable(feature = "const_int_ops")]
2287 pub const fn leading_zeros(self) -> u32 {
2288 unsafe { intrinsics::ctlz(self as $ActualT) as u32 }
2293 concat!("Returns the number of trailing zeros in the binary representation
2301 ", $Feature, "let n = 0b0101000", stringify!($SelfT), ";
2303 assert_eq!(n.trailing_zeros(), 3);", $EndFeature, "
2305 #[stable(feature = "rust1", since = "1.0.0")]
2306 #[rustc_const_unstable(feature = "const_int_ops")]
2308 pub const fn trailing_zeros(self) -> u32 {
2309 unsafe { uint_cttz_call!(self, $BITS) as u32 }
2314 concat!("Shifts the bits to the left by a specified amount, `n`,
2315 wrapping the truncated bits to the end of the resulting integer.
2317 Please note this isn't the same operation as `<<`!
2324 let n = ", $rot_op, stringify!($SelfT), ";
2325 let m = ", $rot_result, ";
2327 assert_eq!(n.rotate_left(", $rot, "), m);
2329 #[stable(feature = "rust1", since = "1.0.0")]
2330 #[rustc_const_unstable(feature = "const_int_rotate")]
2332 pub const fn rotate_left(self, n: u32) -> Self {
2333 #[cfg(not(stage0))] {
2334 unsafe { intrinsics::rotate_left(self, n as $SelfT) }
2337 (self << (n % $BITS)) | (self >> (($BITS - (n % $BITS)) % $BITS))
2343 concat!("Shifts the bits to the right by a specified amount, `n`,
2344 wrapping the truncated bits to the beginning of the resulting
2347 Please note this isn't the same operation as `>>`!
2354 let n = ", $rot_result, stringify!($SelfT), ";
2355 let m = ", $rot_op, ";
2357 assert_eq!(n.rotate_right(", $rot, "), m);
2359 #[stable(feature = "rust1", since = "1.0.0")]
2360 #[rustc_const_unstable(feature = "const_int_rotate")]
2362 pub const fn rotate_right(self, n: u32) -> Self {
2363 #[cfg(not(stage0))] {
2364 unsafe { intrinsics::rotate_right(self, n as $SelfT) }
2367 (self >> (n % $BITS)) | (self << (($BITS - (n % $BITS)) % $BITS))
2374 Reverses the byte order of the integer.
2381 let n = ", $swap_op, stringify!($SelfT), ";
2382 let m = n.swap_bytes();
2384 assert_eq!(m, ", $swapped, ");
2386 #[stable(feature = "rust1", since = "1.0.0")]
2387 #[rustc_const_unstable(feature = "const_int_ops")]
2389 pub const fn swap_bytes(self) -> Self {
2390 unsafe { intrinsics::bswap(self as $ActualT) as Self }
2395 concat!("Reverses the bit pattern of the integer.
2402 #![feature(reverse_bits)]
2404 let n = ", $swap_op, stringify!($SelfT), ";
2405 let m = n.reverse_bits();
2407 assert_eq!(m, ", $reversed, ");
2409 #[unstable(feature = "reverse_bits", issue = "48763")]
2410 #[rustc_const_unstable(feature = "const_int_conversion")]
2412 pub const fn reverse_bits(self) -> Self {
2413 unsafe { intrinsics::bitreverse(self as $ActualT) as Self }
2418 concat!("Converts an integer from big endian to the target's endianness.
2420 On big endian this is a no-op. On little endian the bytes are
2428 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2430 if cfg!(target_endian = \"big\") {
2431 assert_eq!(", stringify!($SelfT), "::from_be(n), n)
2433 assert_eq!(", stringify!($SelfT), "::from_be(n), n.swap_bytes())
2436 #[stable(feature = "rust1", since = "1.0.0")]
2437 #[rustc_const_unstable(feature = "const_int_ops")]
2439 pub const fn from_be(x: Self) -> Self {
2440 #[cfg(target_endian = "big")]
2444 #[cfg(not(target_endian = "big"))]
2452 concat!("Converts an integer from little endian to the target's endianness.
2454 On little endian this is a no-op. On big endian the bytes are
2462 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2464 if cfg!(target_endian = \"little\") {
2465 assert_eq!(", stringify!($SelfT), "::from_le(n), n)
2467 assert_eq!(", stringify!($SelfT), "::from_le(n), n.swap_bytes())
2470 #[stable(feature = "rust1", since = "1.0.0")]
2471 #[rustc_const_unstable(feature = "const_int_ops")]
2473 pub const fn from_le(x: Self) -> Self {
2474 #[cfg(target_endian = "little")]
2478 #[cfg(not(target_endian = "little"))]
2486 concat!("Converts `self` to big endian from the target's endianness.
2488 On big endian this is a no-op. On little endian the bytes are
2496 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2498 if cfg!(target_endian = \"big\") {
2499 assert_eq!(n.to_be(), n)
2501 assert_eq!(n.to_be(), n.swap_bytes())
2504 #[stable(feature = "rust1", since = "1.0.0")]
2505 #[rustc_const_unstable(feature = "const_int_ops")]
2507 pub const fn to_be(self) -> Self { // or not to be?
2508 #[cfg(target_endian = "big")]
2512 #[cfg(not(target_endian = "big"))]
2520 concat!("Converts `self` to little endian from the target's endianness.
2522 On little endian this is a no-op. On big endian the bytes are
2530 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2532 if cfg!(target_endian = \"little\") {
2533 assert_eq!(n.to_le(), n)
2535 assert_eq!(n.to_le(), n.swap_bytes())
2538 #[stable(feature = "rust1", since = "1.0.0")]
2539 #[rustc_const_unstable(feature = "const_int_ops")]
2541 pub const fn to_le(self) -> Self {
2542 #[cfg(target_endian = "little")]
2546 #[cfg(not(target_endian = "little"))]
2554 concat!("Checked integer addition. Computes `self + rhs`, returning `None`
2555 if overflow occurred.
2562 ", $Feature, "assert_eq!((", stringify!($SelfT), "::max_value() - 2).checked_add(1), ",
2563 "Some(", stringify!($SelfT), "::max_value() - 1));
2564 assert_eq!((", stringify!($SelfT), "::max_value() - 2).checked_add(3), None);", $EndFeature, "
2566 #[stable(feature = "rust1", since = "1.0.0")]
2568 pub fn checked_add(self, rhs: Self) -> Option<Self> {
2569 let (a, b) = self.overflowing_add(rhs);
2570 if b {None} else {Some(a)}
2575 concat!("Checked integer subtraction. Computes `self - rhs`, returning
2576 `None` if overflow occurred.
2583 ", $Feature, "assert_eq!(1", stringify!($SelfT), ".checked_sub(1), Some(0));
2584 assert_eq!(0", stringify!($SelfT), ".checked_sub(1), None);", $EndFeature, "
2586 #[stable(feature = "rust1", since = "1.0.0")]
2588 pub fn checked_sub(self, rhs: Self) -> Option<Self> {
2589 let (a, b) = self.overflowing_sub(rhs);
2590 if b {None} else {Some(a)}
2595 concat!("Checked integer multiplication. Computes `self * rhs`, returning
2596 `None` if overflow occurred.
2603 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".checked_mul(1), Some(5));
2604 assert_eq!(", stringify!($SelfT), "::max_value().checked_mul(2), None);", $EndFeature, "
2606 #[stable(feature = "rust1", since = "1.0.0")]
2608 pub fn checked_mul(self, rhs: Self) -> Option<Self> {
2609 let (a, b) = self.overflowing_mul(rhs);
2610 if b {None} else {Some(a)}
2615 concat!("Checked integer division. Computes `self / rhs`, returning `None`
2623 ", $Feature, "assert_eq!(128", stringify!($SelfT), ".checked_div(2), Some(64));
2624 assert_eq!(1", stringify!($SelfT), ".checked_div(0), None);", $EndFeature, "
2626 #[stable(feature = "rust1", since = "1.0.0")]
2628 pub fn checked_div(self, rhs: Self) -> Option<Self> {
2631 rhs => Some(unsafe { intrinsics::unchecked_div(self, rhs) }),
2637 concat!("Checked Euclidean division. Computes `self.div_euc(rhs)`, returning `None`
2645 #![feature(euclidean_division)]
2646 assert_eq!(128", stringify!($SelfT), ".checked_div(2), Some(64));
2647 assert_eq!(1", stringify!($SelfT), ".checked_div_euc(0), None);
2649 #[unstable(feature = "euclidean_division", issue = "49048")]
2651 pub fn checked_div_euc(self, rhs: Self) -> Option<Self> {
2655 Some(self.div_euc(rhs))
2662 concat!("Checked integer remainder. Computes `self % rhs`, returning `None`
2670 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".checked_rem(2), Some(1));
2671 assert_eq!(5", stringify!($SelfT), ".checked_rem(0), None);", $EndFeature, "
2673 #[stable(feature = "wrapping", since = "1.7.0")]
2675 pub fn checked_rem(self, rhs: Self) -> Option<Self> {
2679 Some(unsafe { intrinsics::unchecked_rem(self, rhs) })
2685 concat!("Checked Euclidean modulo. Computes `self.mod_euc(rhs)`, returning `None`
2693 #![feature(euclidean_division)]
2694 assert_eq!(5", stringify!($SelfT), ".checked_mod_euc(2), Some(1));
2695 assert_eq!(5", stringify!($SelfT), ".checked_mod_euc(0), None);
2697 #[unstable(feature = "euclidean_division", issue = "49048")]
2699 pub fn checked_mod_euc(self, rhs: Self) -> Option<Self> {
2703 Some(self.mod_euc(rhs))
2709 concat!("Checked negation. Computes `-self`, returning `None` unless `self ==
2712 Note that negating any positive integer will overflow.
2719 ", $Feature, "assert_eq!(0", stringify!($SelfT), ".checked_neg(), Some(0));
2720 assert_eq!(1", stringify!($SelfT), ".checked_neg(), None);", $EndFeature, "
2722 #[stable(feature = "wrapping", since = "1.7.0")]
2724 pub fn checked_neg(self) -> Option<Self> {
2725 let (a, b) = self.overflowing_neg();
2726 if b {None} else {Some(a)}
2731 concat!("Checked shift left. Computes `self << rhs`, returning `None`
2732 if `rhs` is larger than or equal to the number of bits in `self`.
2739 ", $Feature, "assert_eq!(0x1", stringify!($SelfT), ".checked_shl(4), Some(0x10));
2740 assert_eq!(0x10", stringify!($SelfT), ".checked_shl(129), None);", $EndFeature, "
2742 #[stable(feature = "wrapping", since = "1.7.0")]
2744 pub fn checked_shl(self, rhs: u32) -> Option<Self> {
2745 let (a, b) = self.overflowing_shl(rhs);
2746 if b {None} else {Some(a)}
2751 concat!("Checked shift right. Computes `self >> rhs`, returning `None`
2752 if `rhs` is larger than or equal to the number of bits in `self`.
2759 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".checked_shr(4), Some(0x1));
2760 assert_eq!(0x10", stringify!($SelfT), ".checked_shr(129), None);", $EndFeature, "
2762 #[stable(feature = "wrapping", since = "1.7.0")]
2764 pub fn checked_shr(self, rhs: u32) -> Option<Self> {
2765 let (a, b) = self.overflowing_shr(rhs);
2766 if b {None} else {Some(a)}
2771 concat!("Checked exponentiation. Computes `self.pow(exp)`, returning `None` if
2779 #![feature(no_panic_pow)]
2780 ", $Feature, "assert_eq!(2", stringify!($SelfT), ".checked_pow(5), Some(32));
2781 assert_eq!(", stringify!($SelfT), "::max_value().checked_pow(2), None);", $EndFeature, "
2783 #[unstable(feature = "no_panic_pow", issue = "48320")]
2785 pub fn checked_pow(self, mut exp: u32) -> Option<Self> {
2786 let mut base = self;
2787 let mut acc: Self = 1;
2791 acc = acc.checked_mul(base)?;
2794 base = base.checked_mul(base)?;
2797 // Deal with the final bit of the exponent separately, since
2798 // squaring the base afterwards is not necessary and may cause a
2799 // needless overflow.
2801 acc = acc.checked_mul(base)?;
2809 concat!("Saturating integer addition. Computes `self + rhs`, saturating at
2810 the numeric bounds instead of overflowing.
2817 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_add(1), 101);
2818 assert_eq!(200u8.saturating_add(127), 255);", $EndFeature, "
2820 #[stable(feature = "rust1", since = "1.0.0")]
2822 pub fn saturating_add(self, rhs: Self) -> Self {
2823 match self.checked_add(rhs) {
2825 None => Self::max_value(),
2831 concat!("Saturating integer subtraction. Computes `self - rhs`, saturating
2832 at the numeric bounds instead of overflowing.
2839 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_sub(27), 73);
2840 assert_eq!(13", stringify!($SelfT), ".saturating_sub(127), 0);", $EndFeature, "
2842 #[stable(feature = "rust1", since = "1.0.0")]
2844 pub fn saturating_sub(self, rhs: Self) -> Self {
2845 match self.checked_sub(rhs) {
2847 None => Self::min_value(),
2853 concat!("Saturating integer multiplication. Computes `self * rhs`,
2854 saturating at the numeric bounds instead of overflowing.
2861 ", $Feature, "use std::", stringify!($SelfT), ";
2863 assert_eq!(2", stringify!($SelfT), ".saturating_mul(10), 20);
2864 assert_eq!((", stringify!($SelfT), "::MAX).saturating_mul(10), ", stringify!($SelfT),
2865 "::MAX);", $EndFeature, "
2867 #[stable(feature = "wrapping", since = "1.7.0")]
2869 pub fn saturating_mul(self, rhs: Self) -> Self {
2870 self.checked_mul(rhs).unwrap_or(Self::max_value())
2875 concat!("Saturating integer exponentiation. Computes `self.pow(exp)`,
2876 saturating at the numeric bounds instead of overflowing.
2883 #![feature(no_panic_pow)]
2884 ", $Feature, "use std::", stringify!($SelfT), ";
2886 assert_eq!(4", stringify!($SelfT), ".saturating_pow(3), 64);
2887 assert_eq!(", stringify!($SelfT), "::MAX.saturating_pow(2), ", stringify!($SelfT), "::MAX);",
2890 #[unstable(feature = "no_panic_pow", issue = "48320")]
2892 pub fn saturating_pow(self, exp: u32) -> Self {
2893 match self.checked_pow(exp) {
2895 None => Self::max_value(),
2901 concat!("Wrapping (modular) addition. Computes `self + rhs`,
2902 wrapping around at the boundary of the type.
2909 ", $Feature, "assert_eq!(200", stringify!($SelfT), ".wrapping_add(55), 255);
2910 assert_eq!(200", stringify!($SelfT), ".wrapping_add(", stringify!($SelfT), "::max_value()), 199);",
2913 #[stable(feature = "rust1", since = "1.0.0")]
2914 #[rustc_const_unstable(feature = "const_int_wrapping")]
2916 pub const fn wrapping_add(self, rhs: Self) -> Self {
2918 intrinsics::overflowing_add(self, rhs)
2924 concat!("Wrapping (modular) subtraction. Computes `self - rhs`,
2925 wrapping around at the boundary of the type.
2932 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_sub(100), 0);
2933 assert_eq!(100", stringify!($SelfT), ".wrapping_sub(", stringify!($SelfT), "::max_value()), 101);",
2936 #[stable(feature = "rust1", since = "1.0.0")]
2937 #[rustc_const_unstable(feature = "const_int_wrapping")]
2939 pub const fn wrapping_sub(self, rhs: Self) -> Self {
2941 intrinsics::overflowing_sub(self, rhs)
2946 /// Wrapping (modular) multiplication. Computes `self *
2947 /// rhs`, wrapping around at the boundary of the type.
2953 /// Please note that this example is shared between integer types.
2954 /// Which explains why `u8` is used here.
2957 /// assert_eq!(10u8.wrapping_mul(12), 120);
2958 /// assert_eq!(25u8.wrapping_mul(12), 44);
2960 #[stable(feature = "rust1", since = "1.0.0")]
2961 #[rustc_const_unstable(feature = "const_int_wrapping")]
2963 pub const fn wrapping_mul(self, rhs: Self) -> Self {
2965 intrinsics::overflowing_mul(self, rhs)
2970 concat!("Wrapping (modular) division. Computes `self / rhs`.
2971 Wrapped division on unsigned types is just normal division.
2972 There's no way wrapping could ever happen.
2973 This function exists, so that all operations
2974 are accounted for in the wrapping operations.
2981 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_div(10), 10);", $EndFeature, "
2983 #[stable(feature = "num_wrapping", since = "1.2.0")]
2985 pub fn wrapping_div(self, rhs: Self) -> Self {
2991 concat!("Wrapping Euclidean division. Computes `self.div_euc(rhs)`.
2992 Wrapped division on unsigned types is just normal division.
2993 There's no way wrapping could ever happen.
2994 This function exists, so that all operations
2995 are accounted for in the wrapping operations.
3002 #![feature(euclidean_division)]
3003 assert_eq!(100", stringify!($SelfT), ".wrapping_div_euc(10), 10);
3005 #[unstable(feature = "euclidean_division", issue = "49048")]
3007 pub fn wrapping_div_euc(self, rhs: Self) -> Self {
3013 concat!("Wrapping (modular) remainder. Computes `self % rhs`.
3014 Wrapped remainder calculation on unsigned types is
3015 just the regular remainder calculation.
3016 There's no way wrapping could ever happen.
3017 This function exists, so that all operations
3018 are accounted for in the wrapping operations.
3025 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_rem(10), 0);", $EndFeature, "
3027 #[stable(feature = "num_wrapping", since = "1.2.0")]
3029 pub fn wrapping_rem(self, rhs: Self) -> Self {
3035 concat!("Wrapping Euclidean modulo. Computes `self.mod_euc(rhs)`.
3036 Wrapped modulo calculation on unsigned types is
3037 just the regular remainder calculation.
3038 There's no way wrapping could ever happen.
3039 This function exists, so that all operations
3040 are accounted for in the wrapping operations.
3047 #![feature(euclidean_division)]
3048 assert_eq!(100", stringify!($SelfT), ".wrapping_mod_euc(10), 0);
3050 #[unstable(feature = "euclidean_division", issue = "49048")]
3052 pub fn wrapping_mod_euc(self, rhs: Self) -> Self {
3057 /// Wrapping (modular) negation. Computes `-self`,
3058 /// wrapping around at the boundary of the type.
3060 /// Since unsigned types do not have negative equivalents
3061 /// all applications of this function will wrap (except for `-0`).
3062 /// For values smaller than the corresponding signed type's maximum
3063 /// the result is the same as casting the corresponding signed value.
3064 /// Any larger values are equivalent to `MAX + 1 - (val - MAX - 1)` where
3065 /// `MAX` is the corresponding signed type's maximum.
3071 /// Please note that this example is shared between integer types.
3072 /// Which explains why `i8` is used here.
3075 /// assert_eq!(100i8.wrapping_neg(), -100);
3076 /// assert_eq!((-128i8).wrapping_neg(), -128);
3078 #[stable(feature = "num_wrapping", since = "1.2.0")]
3080 pub fn wrapping_neg(self) -> Self {
3081 self.overflowing_neg().0
3085 concat!("Panic-free bitwise shift-left; yields `self << mask(rhs)`,
3086 where `mask` removes any high-order bits of `rhs` that
3087 would cause the shift to exceed the bitwidth of the type.
3089 Note that this is *not* the same as a rotate-left; the
3090 RHS of a wrapping shift-left is restricted to the range
3091 of the type, rather than the bits shifted out of the LHS
3092 being returned to the other end. The primitive integer
3093 types all implement a `rotate_left` function, which may
3094 be what you want instead.
3101 ", $Feature, "assert_eq!(1", stringify!($SelfT), ".wrapping_shl(7), 128);
3102 assert_eq!(1", stringify!($SelfT), ".wrapping_shl(128), 1);", $EndFeature, "
3104 #[stable(feature = "num_wrapping", since = "1.2.0")]
3105 #[rustc_const_unstable(feature = "const_int_wrapping")]
3107 pub const fn wrapping_shl(self, rhs: u32) -> Self {
3109 intrinsics::unchecked_shl(self, (rhs & ($BITS - 1)) as $SelfT)
3115 concat!("Panic-free bitwise shift-right; yields `self >> mask(rhs)`,
3116 where `mask` removes any high-order bits of `rhs` that
3117 would cause the shift to exceed the bitwidth of the type.
3119 Note that this is *not* the same as a rotate-right; the
3120 RHS of a wrapping shift-right is restricted to the range
3121 of the type, rather than the bits shifted out of the LHS
3122 being returned to the other end. The primitive integer
3123 types all implement a `rotate_right` function, which may
3124 be what you want instead.
3131 ", $Feature, "assert_eq!(128", stringify!($SelfT), ".wrapping_shr(7), 1);
3132 assert_eq!(128", stringify!($SelfT), ".wrapping_shr(128), 128);", $EndFeature, "
3134 #[stable(feature = "num_wrapping", since = "1.2.0")]
3135 #[rustc_const_unstable(feature = "const_int_wrapping")]
3137 pub const fn wrapping_shr(self, rhs: u32) -> Self {
3139 intrinsics::unchecked_shr(self, (rhs & ($BITS - 1)) as $SelfT)
3145 concat!("Wrapping (modular) exponentiation. Computes `self.pow(exp)`,
3146 wrapping around at the boundary of the type.
3153 #![feature(no_panic_pow)]
3154 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".wrapping_pow(5), 243);
3155 assert_eq!(3u8.wrapping_pow(6), 217);", $EndFeature, "
3157 #[unstable(feature = "no_panic_pow", issue = "48320")]
3159 pub fn wrapping_pow(self, mut exp: u32) -> Self {
3160 let mut base = self;
3161 let mut acc: Self = 1;
3165 acc = acc.wrapping_mul(base);
3168 base = base.wrapping_mul(base);
3171 // Deal with the final bit of the exponent separately, since
3172 // squaring the base afterwards is not necessary and may cause a
3173 // needless overflow.
3175 acc = acc.wrapping_mul(base);
3183 concat!("Calculates `self` + `rhs`
3185 Returns a tuple of the addition along with a boolean indicating
3186 whether an arithmetic overflow would occur. If an overflow would
3187 have occurred then the wrapped value is returned.
3194 ", $Feature, "use std::", stringify!($SelfT), ";
3196 assert_eq!(5", stringify!($SelfT), ".overflowing_add(2), (7, false));
3197 assert_eq!(", stringify!($SelfT), "::MAX.overflowing_add(1), (0, true));", $EndFeature, "
3199 #[stable(feature = "wrapping", since = "1.7.0")]
3200 #[rustc_const_unstable(feature = "const_int_overflowing")]
3202 pub const fn overflowing_add(self, rhs: Self) -> (Self, bool) {
3203 let (a, b) = unsafe {
3204 intrinsics::add_with_overflow(self as $ActualT,
3212 concat!("Calculates `self` - `rhs`
3214 Returns a tuple of the subtraction along with a boolean indicating
3215 whether an arithmetic overflow would occur. If an overflow would
3216 have occurred then the wrapped value is returned.
3223 ", $Feature, "use std::", stringify!($SelfT), ";
3225 assert_eq!(5", stringify!($SelfT), ".overflowing_sub(2), (3, false));
3226 assert_eq!(0", stringify!($SelfT), ".overflowing_sub(1), (", stringify!($SelfT), "::MAX, true));",
3229 #[stable(feature = "wrapping", since = "1.7.0")]
3230 #[rustc_const_unstable(feature = "const_int_overflowing")]
3232 pub const fn overflowing_sub(self, rhs: Self) -> (Self, bool) {
3233 let (a, b) = unsafe {
3234 intrinsics::sub_with_overflow(self as $ActualT,
3241 /// Calculates the multiplication of `self` and `rhs`.
3243 /// Returns a tuple of the multiplication along with a boolean
3244 /// indicating whether an arithmetic overflow would occur. If an
3245 /// overflow would have occurred then the wrapped value is returned.
3251 /// Please note that this example is shared between integer types.
3252 /// Which explains why `u32` is used here.
3255 /// assert_eq!(5u32.overflowing_mul(2), (10, false));
3256 /// assert_eq!(1_000_000_000u32.overflowing_mul(10), (1410065408, true));
3258 #[stable(feature = "wrapping", since = "1.7.0")]
3259 #[rustc_const_unstable(feature = "const_int_overflowing")]
3261 pub const fn overflowing_mul(self, rhs: Self) -> (Self, bool) {
3262 let (a, b) = unsafe {
3263 intrinsics::mul_with_overflow(self as $ActualT,
3270 concat!("Calculates the divisor when `self` is divided by `rhs`.
3272 Returns a tuple of the divisor along with a boolean indicating
3273 whether an arithmetic overflow would occur. Note that for unsigned
3274 integers overflow never occurs, so the second value is always
3279 This function will panic if `rhs` is 0.
3286 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".overflowing_div(2), (2, false));", $EndFeature, "
3289 #[stable(feature = "wrapping", since = "1.7.0")]
3290 pub fn overflowing_div(self, rhs: Self) -> (Self, bool) {
3296 concat!("Calculates the quotient of Euclidean division `self.div_euc(rhs)`.
3298 Returns a tuple of the divisor along with a boolean indicating
3299 whether an arithmetic overflow would occur. Note that for unsigned
3300 integers overflow never occurs, so the second value is always
3305 This function will panic if `rhs` is 0.
3312 #![feature(euclidean_division)]
3313 assert_eq!(5", stringify!($SelfT), ".overflowing_div_euc(2), (2, false));
3316 #[unstable(feature = "euclidean_division", issue = "49048")]
3317 pub fn overflowing_div_euc(self, rhs: Self) -> (Self, bool) {
3323 concat!("Calculates the remainder when `self` is divided by `rhs`.
3325 Returns a tuple of the remainder after dividing along with a boolean
3326 indicating whether an arithmetic overflow would occur. Note that for
3327 unsigned integers overflow never occurs, so the second value is
3332 This function will panic if `rhs` is 0.
3339 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".overflowing_rem(2), (1, false));", $EndFeature, "
3342 #[stable(feature = "wrapping", since = "1.7.0")]
3343 pub fn overflowing_rem(self, rhs: Self) -> (Self, bool) {
3349 concat!("Calculates the remainder `self.mod_euc(rhs)` by Euclidean division.
3351 Returns a tuple of the modulo after dividing along with a boolean
3352 indicating whether an arithmetic overflow would occur. Note that for
3353 unsigned integers overflow never occurs, so the second value is
3358 This function will panic if `rhs` is 0.
3365 #![feature(euclidean_division)]
3366 assert_eq!(5", stringify!($SelfT), ".overflowing_mod_euc(2), (1, false));
3369 #[unstable(feature = "euclidean_division", issue = "49048")]
3370 pub fn overflowing_mod_euc(self, rhs: Self) -> (Self, bool) {
3376 concat!("Negates self in an overflowing fashion.
3378 Returns `!self + 1` using wrapping operations to return the value
3379 that represents the negation of this unsigned value. Note that for
3380 positive unsigned values overflow always occurs, but negating 0 does
3388 ", $Feature, "assert_eq!(0", stringify!($SelfT), ".overflowing_neg(), (0, false));
3389 assert_eq!(2", stringify!($SelfT), ".overflowing_neg(), (-2i32 as ", stringify!($SelfT),
3390 ", true));", $EndFeature, "
3393 #[stable(feature = "wrapping", since = "1.7.0")]
3394 pub fn overflowing_neg(self) -> (Self, bool) {
3395 ((!self).wrapping_add(1), self != 0)
3400 concat!("Shifts self left by `rhs` bits.
3402 Returns a tuple of the shifted version of self along with a boolean
3403 indicating whether the shift value was larger than or equal to the
3404 number of bits. If the shift value is too large, then value is
3405 masked (N-1) where N is the number of bits, and this value is then
3406 used to perform the shift.
3413 ", $Feature, "assert_eq!(0x1", stringify!($SelfT), ".overflowing_shl(4), (0x10, false));
3414 assert_eq!(0x1", stringify!($SelfT), ".overflowing_shl(132), (0x10, true));", $EndFeature, "
3416 #[stable(feature = "wrapping", since = "1.7.0")]
3417 #[rustc_const_unstable(feature = "const_int_overflowing")]
3419 pub const fn overflowing_shl(self, rhs: u32) -> (Self, bool) {
3420 (self.wrapping_shl(rhs), (rhs > ($BITS - 1)))
3425 concat!("Shifts self right by `rhs` bits.
3427 Returns a tuple of the shifted version of self along with a boolean
3428 indicating whether the shift value was larger than or equal to the
3429 number of bits. If the shift value is too large, then value is
3430 masked (N-1) where N is the number of bits, and this value is then
3431 used to perform the shift.
3438 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".overflowing_shr(4), (0x1, false));
3439 assert_eq!(0x10", stringify!($SelfT), ".overflowing_shr(132), (0x1, true));", $EndFeature, "
3441 #[stable(feature = "wrapping", since = "1.7.0")]
3442 #[rustc_const_unstable(feature = "const_int_overflowing")]
3444 pub const fn overflowing_shr(self, rhs: u32) -> (Self, bool) {
3445 (self.wrapping_shr(rhs), (rhs > ($BITS - 1)))
3450 concat!("Raises self to the power of `exp`, using exponentiation by squaring.
3452 Returns a tuple of the exponentiation along with a bool indicating
3453 whether an overflow happened.
3460 #![feature(no_panic_pow)]
3461 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".overflowing_pow(5), (243, false));
3462 assert_eq!(3u8.overflowing_pow(6), (217, true));", $EndFeature, "
3464 #[unstable(feature = "no_panic_pow", issue = "48320")]
3466 pub fn overflowing_pow(self, mut exp: u32) -> (Self, bool) {
3467 let mut base = self;
3468 let mut acc: Self = 1;
3469 let mut overflown = false;
3470 // Scratch space for storing results of overflowing_mul.
3475 r = acc.overflowing_mul(base);
3480 r = base.overflowing_mul(base);
3485 // Deal with the final bit of the exponent separately, since
3486 // squaring the base afterwards is not necessary and may cause a
3487 // needless overflow.
3489 r = acc.overflowing_mul(base);
3499 concat!("Raises self to the power of `exp`, using exponentiation by squaring.
3506 ", $Feature, "assert_eq!(2", stringify!($SelfT), ".pow(5), 32);", $EndFeature, "
3508 #[stable(feature = "rust1", since = "1.0.0")]
3510 #[rustc_inherit_overflow_checks]
3511 pub fn pow(self, mut exp: u32) -> Self {
3512 let mut base = self;
3523 // Deal with the final bit of the exponent separately, since
3524 // squaring the base afterwards is not necessary and may cause a
3525 // needless overflow.
3535 concat!("Performs Euclidean division.
3537 For unsigned types, this is just the same as `self / rhs`.
3544 #![feature(euclidean_division)]
3545 assert_eq!(7", stringify!($SelfT), ".div_euc(4), 1); // or any other integer type
3547 #[unstable(feature = "euclidean_division", issue = "49048")]
3549 #[rustc_inherit_overflow_checks]
3550 pub fn div_euc(self, rhs: Self) -> Self {
3557 concat!("Calculates the remainder `self mod rhs` by Euclidean division.
3559 For unsigned types, this is just the same as `self % rhs`.
3566 #![feature(euclidean_division)]
3567 assert_eq!(7", stringify!($SelfT), ".mod_euc(4), 3); // or any other integer type
3569 #[unstable(feature = "euclidean_division", issue = "49048")]
3571 #[rustc_inherit_overflow_checks]
3572 pub fn mod_euc(self, rhs: Self) -> Self {
3578 concat!("Returns `true` if and only if `self == 2^k` for some `k`.
3585 ", $Feature, "assert!(16", stringify!($SelfT), ".is_power_of_two());
3586 assert!(!10", stringify!($SelfT), ".is_power_of_two());", $EndFeature, "
3588 #[stable(feature = "rust1", since = "1.0.0")]
3590 pub fn is_power_of_two(self) -> bool {
3591 (self.wrapping_sub(1)) & self == 0 && !(self == 0)
3595 // Returns one less than next power of two.
3596 // (For 8u8 next power of two is 8u8 and for 6u8 it is 8u8)
3598 // 8u8.one_less_than_next_power_of_two() == 7
3599 // 6u8.one_less_than_next_power_of_two() == 7
3601 // This method cannot overflow, as in the `next_power_of_two`
3602 // overflow cases it instead ends up returning the maximum value
3603 // of the type, and can return 0 for 0.
3605 fn one_less_than_next_power_of_two(self) -> Self {
3606 if self <= 1 { return 0; }
3608 // Because `p > 0`, it cannot consist entirely of leading zeros.
3609 // That means the shift is always in-bounds, and some processors
3610 // (such as intel pre-haswell) have more efficient ctlz
3611 // intrinsics when the argument is non-zero.
3613 let z = unsafe { intrinsics::ctlz_nonzero(p) };
3614 <$SelfT>::max_value() >> z
3618 concat!("Returns the smallest power of two greater than or equal to `self`.
3620 When return value overflows (i.e. `self > (1 << (N-1))` for type
3621 `uN`), it panics in debug mode and return value is wrapped to 0 in
3622 release mode (the only situation in which method can return 0).
3629 ", $Feature, "assert_eq!(2", stringify!($SelfT), ".next_power_of_two(), 2);
3630 assert_eq!(3", stringify!($SelfT), ".next_power_of_two(), 4);", $EndFeature, "
3632 #[stable(feature = "rust1", since = "1.0.0")]
3634 pub fn next_power_of_two(self) -> Self {
3635 // Call the trait to get overflow checks
3636 ops::Add::add(self.one_less_than_next_power_of_two(), 1)
3641 concat!("Returns the smallest power of two greater than or equal to `n`. If
3642 the next power of two is greater than the type's maximum value,
3643 `None` is returned, otherwise the power of two is wrapped in `Some`.
3650 ", $Feature, "assert_eq!(2", stringify!($SelfT),
3651 ".checked_next_power_of_two(), Some(2));
3652 assert_eq!(3", stringify!($SelfT), ".checked_next_power_of_two(), Some(4));
3653 assert_eq!(", stringify!($SelfT), "::max_value().checked_next_power_of_two(), None);",
3657 #[stable(feature = "rust1", since = "1.0.0")]
3658 pub fn checked_next_power_of_two(self) -> Option<Self> {
3659 self.one_less_than_next_power_of_two().checked_add(1)
3664 concat!("Returns the smallest power of two greater than or equal to `n`. If
3665 the next power of two is greater than the type's maximum value,
3666 the return value is wrapped to `0`.
3673 #![feature(wrapping_next_power_of_two)]
3675 assert_eq!(2", stringify!($SelfT), ".wrapping_next_power_of_two(), 2);
3676 assert_eq!(3", stringify!($SelfT), ".wrapping_next_power_of_two(), 4);
3677 assert_eq!(", stringify!($SelfT), "::max_value().wrapping_next_power_of_two(), 0);",
3680 #[unstable(feature = "wrapping_next_power_of_two", issue = "32463",
3681 reason = "needs decision on wrapping behaviour")]
3682 pub fn wrapping_next_power_of_two(self) -> Self {
3683 self.one_less_than_next_power_of_two().wrapping_add(1)
3688 concat!("Return the memory representation of this integer as a byte array in
3689 big-endian (network) byte order.
3694 let bytes = ", $swap_op, stringify!($SelfT), ".to_be_bytes();
3695 assert_eq!(bytes, ", $be_bytes, ");
3697 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3698 #[rustc_const_unstable(feature = "const_int_conversion")]
3700 pub const fn to_be_bytes(self) -> [u8; mem::size_of::<Self>()] {
3701 self.to_be().to_ne_bytes()
3706 concat!("Return the memory representation of this integer as a byte array in
3707 little-endian byte order.
3712 let bytes = ", $swap_op, stringify!($SelfT), ".to_le_bytes();
3713 assert_eq!(bytes, ", $le_bytes, ");
3715 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3716 #[rustc_const_unstable(feature = "const_int_conversion")]
3718 pub const fn to_le_bytes(self) -> [u8; mem::size_of::<Self>()] {
3719 self.to_le().to_ne_bytes()
3725 Return the memory representation of this integer as a byte array in
3728 As the target platform's native endianness is used, portable code
3729 should use [`to_be_bytes`] or [`to_le_bytes`], as appropriate,
3732 [`to_be_bytes`]: #method.to_be_bytes
3733 [`to_le_bytes`]: #method.to_le_bytes
3738 let bytes = ", $swap_op, stringify!($SelfT), ".to_ne_bytes();
3739 assert_eq!(bytes, if cfg!(target_endian = \"big\") {
3745 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3746 #[rustc_const_unstable(feature = "const_int_conversion")]
3748 pub const fn to_ne_bytes(self) -> [u8; mem::size_of::<Self>()] {
3749 unsafe { mem::transmute(self) }
3754 concat!("Create an integer value from its representation as a byte array in
3760 let value = ", stringify!($SelfT), "::from_be_bytes(", $be_bytes, ");
3761 assert_eq!(value, ", $swap_op, ");
3764 When starting from a slice rather than an array, fallible conversion APIs can be used:
3767 #![feature(try_from)]
3768 use std::convert::TryInto;
3770 fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
3771 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
3773 ", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
3776 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3777 #[rustc_const_unstable(feature = "const_int_conversion")]
3779 pub const fn from_be_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
3780 Self::from_be(Self::from_ne_bytes(bytes))
3786 Create an integer value from its representation as a byte array in
3792 let value = ", stringify!($SelfT), "::from_le_bytes(", $le_bytes, ");
3793 assert_eq!(value, ", $swap_op, ");
3796 When starting from a slice rather than an array, fallible conversion APIs can be used:
3799 #![feature(try_from)]
3800 use std::convert::TryInto;
3802 fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
3803 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
3805 ", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
3808 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3809 #[rustc_const_unstable(feature = "const_int_conversion")]
3811 pub const fn from_le_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
3812 Self::from_le(Self::from_ne_bytes(bytes))
3817 concat!("Create an integer value from its memory representation as a byte
3818 array in native endianness.
3820 As the target platform's native endianness is used, portable code
3821 likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as
3822 appropriate instead.
3824 [`from_be_bytes`]: #method.from_be_bytes
3825 [`from_le_bytes`]: #method.from_le_bytes
3830 let value = ", stringify!($SelfT), "::from_ne_bytes(if cfg!(target_endian = \"big\") {
3835 assert_eq!(value, ", $swap_op, ");
3838 When starting from a slice rather than an array, fallible conversion APIs can be used:
3841 #![feature(try_from)]
3842 use std::convert::TryInto;
3844 fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
3845 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
3847 ", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
3850 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3851 #[rustc_const_unstable(feature = "const_int_conversion")]
3853 pub const fn from_ne_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
3854 unsafe { mem::transmute(bytes) }
3862 uint_impl! { u8, u8, 8, 255, "", "", 2, "0x82", "0xa", "0x12", "0x12", "0x48", "[0x12]",
3866 /// Checks if the value is within the ASCII range.
3871 /// let ascii = 97u8;
3872 /// let non_ascii = 150u8;
3874 /// assert!(ascii.is_ascii());
3875 /// assert!(!non_ascii.is_ascii());
3877 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
3879 pub fn is_ascii(&self) -> bool {
3883 /// Makes a copy of the value in its ASCII upper case equivalent.
3885 /// ASCII letters 'a' to 'z' are mapped to 'A' to 'Z',
3886 /// but non-ASCII letters are unchanged.
3888 /// To uppercase the value in-place, use [`make_ascii_uppercase`].
3893 /// let lowercase_a = 97u8;
3895 /// assert_eq!(65, lowercase_a.to_ascii_uppercase());
3898 /// [`make_ascii_uppercase`]: #method.make_ascii_uppercase
3899 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
3901 pub fn to_ascii_uppercase(&self) -> u8 {
3902 ASCII_UPPERCASE_MAP[*self as usize]
3905 /// Makes a copy of the value in its ASCII lower case equivalent.
3907 /// ASCII letters 'A' to 'Z' are mapped to 'a' to 'z',
3908 /// but non-ASCII letters are unchanged.
3910 /// To lowercase the value in-place, use [`make_ascii_lowercase`].
3915 /// let uppercase_a = 65u8;
3917 /// assert_eq!(97, uppercase_a.to_ascii_lowercase());
3920 /// [`make_ascii_lowercase`]: #method.make_ascii_lowercase
3921 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
3923 pub fn to_ascii_lowercase(&self) -> u8 {
3924 ASCII_LOWERCASE_MAP[*self as usize]
3927 /// Checks that two values are an ASCII case-insensitive match.
3929 /// This is equivalent to `to_ascii_lowercase(a) == to_ascii_lowercase(b)`.
3934 /// let lowercase_a = 97u8;
3935 /// let uppercase_a = 65u8;
3937 /// assert!(lowercase_a.eq_ignore_ascii_case(&uppercase_a));
3939 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
3941 pub fn eq_ignore_ascii_case(&self, other: &u8) -> bool {
3942 self.to_ascii_lowercase() == other.to_ascii_lowercase()
3945 /// Converts this value to its ASCII upper case equivalent in-place.
3947 /// ASCII letters 'a' to 'z' are mapped to 'A' to 'Z',
3948 /// but non-ASCII letters are unchanged.
3950 /// To return a new uppercased value without modifying the existing one, use
3951 /// [`to_ascii_uppercase`].
3956 /// let mut byte = b'a';
3958 /// byte.make_ascii_uppercase();
3960 /// assert_eq!(b'A', byte);
3963 /// [`to_ascii_uppercase`]: #method.to_ascii_uppercase
3964 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
3966 pub fn make_ascii_uppercase(&mut self) {
3967 *self = self.to_ascii_uppercase();
3970 /// Converts this value to its ASCII lower case equivalent in-place.
3972 /// ASCII letters 'A' to 'Z' are mapped to 'a' to 'z',
3973 /// but non-ASCII letters are unchanged.
3975 /// To return a new lowercased value without modifying the existing one, use
3976 /// [`to_ascii_lowercase`].
3981 /// let mut byte = b'A';
3983 /// byte.make_ascii_lowercase();
3985 /// assert_eq!(b'a', byte);
3988 /// [`to_ascii_lowercase`]: #method.to_ascii_lowercase
3989 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
3991 pub fn make_ascii_lowercase(&mut self) {
3992 *self = self.to_ascii_lowercase();
3995 /// Checks if the value is an ASCII alphabetic character:
3997 /// - U+0041 'A' ... U+005A 'Z', or
3998 /// - U+0061 'a' ... U+007A 'z'.
4003 /// let uppercase_a = b'A';
4004 /// let uppercase_g = b'G';
4007 /// let zero = b'0';
4008 /// let percent = b'%';
4009 /// let space = b' ';
4011 /// let esc = 0x1b_u8;
4013 /// assert!(uppercase_a.is_ascii_alphabetic());
4014 /// assert!(uppercase_g.is_ascii_alphabetic());
4015 /// assert!(a.is_ascii_alphabetic());
4016 /// assert!(g.is_ascii_alphabetic());
4017 /// assert!(!zero.is_ascii_alphabetic());
4018 /// assert!(!percent.is_ascii_alphabetic());
4019 /// assert!(!space.is_ascii_alphabetic());
4020 /// assert!(!lf.is_ascii_alphabetic());
4021 /// assert!(!esc.is_ascii_alphabetic());
4023 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4025 pub fn is_ascii_alphabetic(&self) -> bool {
4026 if *self >= 0x80 { return false; }
4027 match ASCII_CHARACTER_CLASS[*self as usize] {
4028 L | Lx | U | Ux => true,
4033 /// Checks if the value is an ASCII uppercase character:
4034 /// U+0041 'A' ... U+005A 'Z'.
4039 /// let uppercase_a = b'A';
4040 /// let uppercase_g = b'G';
4043 /// let zero = b'0';
4044 /// let percent = b'%';
4045 /// let space = b' ';
4047 /// let esc = 0x1b_u8;
4049 /// assert!(uppercase_a.is_ascii_uppercase());
4050 /// assert!(uppercase_g.is_ascii_uppercase());
4051 /// assert!(!a.is_ascii_uppercase());
4052 /// assert!(!g.is_ascii_uppercase());
4053 /// assert!(!zero.is_ascii_uppercase());
4054 /// assert!(!percent.is_ascii_uppercase());
4055 /// assert!(!space.is_ascii_uppercase());
4056 /// assert!(!lf.is_ascii_uppercase());
4057 /// assert!(!esc.is_ascii_uppercase());
4059 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4061 pub fn is_ascii_uppercase(&self) -> bool {
4062 if *self >= 0x80 { return false }
4063 match ASCII_CHARACTER_CLASS[*self as usize] {
4069 /// Checks if the value is an ASCII lowercase character:
4070 /// U+0061 'a' ... U+007A 'z'.
4075 /// let uppercase_a = b'A';
4076 /// let uppercase_g = b'G';
4079 /// let zero = b'0';
4080 /// let percent = b'%';
4081 /// let space = b' ';
4083 /// let esc = 0x1b_u8;
4085 /// assert!(!uppercase_a.is_ascii_lowercase());
4086 /// assert!(!uppercase_g.is_ascii_lowercase());
4087 /// assert!(a.is_ascii_lowercase());
4088 /// assert!(g.is_ascii_lowercase());
4089 /// assert!(!zero.is_ascii_lowercase());
4090 /// assert!(!percent.is_ascii_lowercase());
4091 /// assert!(!space.is_ascii_lowercase());
4092 /// assert!(!lf.is_ascii_lowercase());
4093 /// assert!(!esc.is_ascii_lowercase());
4095 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4097 pub fn is_ascii_lowercase(&self) -> bool {
4098 if *self >= 0x80 { return false }
4099 match ASCII_CHARACTER_CLASS[*self as usize] {
4105 /// Checks if the value is an ASCII alphanumeric character:
4107 /// - U+0041 'A' ... U+005A 'Z', or
4108 /// - U+0061 'a' ... U+007A 'z', or
4109 /// - U+0030 '0' ... U+0039 '9'.
4114 /// let uppercase_a = b'A';
4115 /// let uppercase_g = b'G';
4118 /// let zero = b'0';
4119 /// let percent = b'%';
4120 /// let space = b' ';
4122 /// let esc = 0x1b_u8;
4124 /// assert!(uppercase_a.is_ascii_alphanumeric());
4125 /// assert!(uppercase_g.is_ascii_alphanumeric());
4126 /// assert!(a.is_ascii_alphanumeric());
4127 /// assert!(g.is_ascii_alphanumeric());
4128 /// assert!(zero.is_ascii_alphanumeric());
4129 /// assert!(!percent.is_ascii_alphanumeric());
4130 /// assert!(!space.is_ascii_alphanumeric());
4131 /// assert!(!lf.is_ascii_alphanumeric());
4132 /// assert!(!esc.is_ascii_alphanumeric());
4134 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4136 pub fn is_ascii_alphanumeric(&self) -> bool {
4137 if *self >= 0x80 { return false }
4138 match ASCII_CHARACTER_CLASS[*self as usize] {
4139 D | L | Lx | U | Ux => true,
4144 /// Checks if the value is an ASCII decimal digit:
4145 /// U+0030 '0' ... U+0039 '9'.
4150 /// let uppercase_a = b'A';
4151 /// let uppercase_g = b'G';
4154 /// let zero = b'0';
4155 /// let percent = b'%';
4156 /// let space = b' ';
4158 /// let esc = 0x1b_u8;
4160 /// assert!(!uppercase_a.is_ascii_digit());
4161 /// assert!(!uppercase_g.is_ascii_digit());
4162 /// assert!(!a.is_ascii_digit());
4163 /// assert!(!g.is_ascii_digit());
4164 /// assert!(zero.is_ascii_digit());
4165 /// assert!(!percent.is_ascii_digit());
4166 /// assert!(!space.is_ascii_digit());
4167 /// assert!(!lf.is_ascii_digit());
4168 /// assert!(!esc.is_ascii_digit());
4170 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4172 pub fn is_ascii_digit(&self) -> bool {
4173 if *self >= 0x80 { return false }
4174 match ASCII_CHARACTER_CLASS[*self as usize] {
4180 /// Checks if the value is an ASCII hexadecimal digit:
4182 /// - U+0030 '0' ... U+0039 '9', or
4183 /// - U+0041 'A' ... U+0046 'F', or
4184 /// - U+0061 'a' ... U+0066 'f'.
4189 /// let uppercase_a = b'A';
4190 /// let uppercase_g = b'G';
4193 /// let zero = b'0';
4194 /// let percent = b'%';
4195 /// let space = b' ';
4197 /// let esc = 0x1b_u8;
4199 /// assert!(uppercase_a.is_ascii_hexdigit());
4200 /// assert!(!uppercase_g.is_ascii_hexdigit());
4201 /// assert!(a.is_ascii_hexdigit());
4202 /// assert!(!g.is_ascii_hexdigit());
4203 /// assert!(zero.is_ascii_hexdigit());
4204 /// assert!(!percent.is_ascii_hexdigit());
4205 /// assert!(!space.is_ascii_hexdigit());
4206 /// assert!(!lf.is_ascii_hexdigit());
4207 /// assert!(!esc.is_ascii_hexdigit());
4209 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4211 pub fn is_ascii_hexdigit(&self) -> bool {
4212 if *self >= 0x80 { return false }
4213 match ASCII_CHARACTER_CLASS[*self as usize] {
4214 D | Lx | Ux => true,
4219 /// Checks if the value is an ASCII punctuation character:
4221 /// - U+0021 ... U+002F `! " # $ % & ' ( ) * + , - . /`, or
4222 /// - U+003A ... U+0040 `: ; < = > ? @`, or
4223 /// - U+005B ... U+0060 ``[ \ ] ^ _ ` ``, or
4224 /// - U+007B ... U+007E `{ | } ~`
4229 /// let uppercase_a = b'A';
4230 /// let uppercase_g = b'G';
4233 /// let zero = b'0';
4234 /// let percent = b'%';
4235 /// let space = b' ';
4237 /// let esc = 0x1b_u8;
4239 /// assert!(!uppercase_a.is_ascii_punctuation());
4240 /// assert!(!uppercase_g.is_ascii_punctuation());
4241 /// assert!(!a.is_ascii_punctuation());
4242 /// assert!(!g.is_ascii_punctuation());
4243 /// assert!(!zero.is_ascii_punctuation());
4244 /// assert!(percent.is_ascii_punctuation());
4245 /// assert!(!space.is_ascii_punctuation());
4246 /// assert!(!lf.is_ascii_punctuation());
4247 /// assert!(!esc.is_ascii_punctuation());
4249 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4251 pub fn is_ascii_punctuation(&self) -> bool {
4252 if *self >= 0x80 { return false }
4253 match ASCII_CHARACTER_CLASS[*self as usize] {
4259 /// Checks if the value is an ASCII graphic character:
4260 /// U+0021 '!' ... U+007E '~'.
4265 /// let uppercase_a = b'A';
4266 /// let uppercase_g = b'G';
4269 /// let zero = b'0';
4270 /// let percent = b'%';
4271 /// let space = b' ';
4273 /// let esc = 0x1b_u8;
4275 /// assert!(uppercase_a.is_ascii_graphic());
4276 /// assert!(uppercase_g.is_ascii_graphic());
4277 /// assert!(a.is_ascii_graphic());
4278 /// assert!(g.is_ascii_graphic());
4279 /// assert!(zero.is_ascii_graphic());
4280 /// assert!(percent.is_ascii_graphic());
4281 /// assert!(!space.is_ascii_graphic());
4282 /// assert!(!lf.is_ascii_graphic());
4283 /// assert!(!esc.is_ascii_graphic());
4285 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4287 pub fn is_ascii_graphic(&self) -> bool {
4288 if *self >= 0x80 { return false; }
4289 match ASCII_CHARACTER_CLASS[*self as usize] {
4290 Ux | U | Lx | L | D | P => true,
4295 /// Checks if the value is an ASCII whitespace character:
4296 /// U+0020 SPACE, U+0009 HORIZONTAL TAB, U+000A LINE FEED,
4297 /// U+000C FORM FEED, or U+000D CARRIAGE RETURN.
4299 /// Rust uses the WhatWG Infra Standard's [definition of ASCII
4300 /// whitespace][infra-aw]. There are several other definitions in
4301 /// wide use. For instance, [the POSIX locale][pct] includes
4302 /// U+000B VERTICAL TAB as well as all the above characters,
4303 /// but—from the very same specification—[the default rule for
4304 /// "field splitting" in the Bourne shell][bfs] considers *only*
4305 /// SPACE, HORIZONTAL TAB, and LINE FEED as whitespace.
4307 /// If you are writing a program that will process an existing
4308 /// file format, check what that format's definition of whitespace is
4309 /// before using this function.
4311 /// [infra-aw]: https://infra.spec.whatwg.org/#ascii-whitespace
4312 /// [pct]: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_01
4313 /// [bfs]: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05
4318 /// let uppercase_a = b'A';
4319 /// let uppercase_g = b'G';
4322 /// let zero = b'0';
4323 /// let percent = b'%';
4324 /// let space = b' ';
4326 /// let esc = 0x1b_u8;
4328 /// assert!(!uppercase_a.is_ascii_whitespace());
4329 /// assert!(!uppercase_g.is_ascii_whitespace());
4330 /// assert!(!a.is_ascii_whitespace());
4331 /// assert!(!g.is_ascii_whitespace());
4332 /// assert!(!zero.is_ascii_whitespace());
4333 /// assert!(!percent.is_ascii_whitespace());
4334 /// assert!(space.is_ascii_whitespace());
4335 /// assert!(lf.is_ascii_whitespace());
4336 /// assert!(!esc.is_ascii_whitespace());
4338 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4340 pub fn is_ascii_whitespace(&self) -> bool {
4341 if *self >= 0x80 { return false; }
4342 match ASCII_CHARACTER_CLASS[*self as usize] {
4348 /// Checks if the value is an ASCII control character:
4349 /// U+0000 NUL ... U+001F UNIT SEPARATOR, or U+007F DELETE.
4350 /// Note that most ASCII whitespace characters are control
4351 /// characters, but SPACE is not.
4356 /// let uppercase_a = b'A';
4357 /// let uppercase_g = b'G';
4360 /// let zero = b'0';
4361 /// let percent = b'%';
4362 /// let space = b' ';
4364 /// let esc = 0x1b_u8;
4366 /// assert!(!uppercase_a.is_ascii_control());
4367 /// assert!(!uppercase_g.is_ascii_control());
4368 /// assert!(!a.is_ascii_control());
4369 /// assert!(!g.is_ascii_control());
4370 /// assert!(!zero.is_ascii_control());
4371 /// assert!(!percent.is_ascii_control());
4372 /// assert!(!space.is_ascii_control());
4373 /// assert!(lf.is_ascii_control());
4374 /// assert!(esc.is_ascii_control());
4376 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4378 pub fn is_ascii_control(&self) -> bool {
4379 if *self >= 0x80 { return false; }
4380 match ASCII_CHARACTER_CLASS[*self as usize] {
4389 uint_impl! { u16, u16, 16, 65535, "", "", 4, "0xa003", "0x3a", "0x1234", "0x3412", "0x2c48",
4390 "[0x34, 0x12]", "[0x12, 0x34]" }
4395 uint_impl! { u32, u32, 32, 4294967295, "", "", 8, "0x10000b3", "0xb301", "0x12345678",
4396 "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]", "[0x12, 0x34, 0x56, 0x78]" }
4401 uint_impl! { u64, u64, 64, 18446744073709551615, "", "", 12, "0xaa00000000006e1", "0x6e10aa",
4402 "0x1234567890123456", "0x5634129078563412", "0x6a2c48091e6a2c48",
4403 "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
4404 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]" }
4409 uint_impl! { u128, u128, 128, 340282366920938463463374607431768211455, "", "", 16,
4410 "0x13f40000000000000000000000004f76", "0x4f7613f4", "0x12345678901234567890123456789012",
4411 "0x12907856341290785634129078563412", "0x48091e6a2c48091e6a2c48091e6a2c48",
4412 "[0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, \
4413 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
4414 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, \
4415 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12]" }
4418 #[cfg(target_pointer_width = "16")]
4421 uint_impl! { usize, u16, 16, 65536, "", "", 4, "0xa003", "0x3a", "0x1234", "0x3412", "0x2c48",
4422 "[0x34, 0x12]", "[0x12, 0x34]" }
4424 #[cfg(target_pointer_width = "32")]
4427 uint_impl! { usize, u32, 32, 4294967295, "", "", 8, "0x10000b3", "0xb301", "0x12345678",
4428 "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]", "[0x12, 0x34, 0x56, 0x78]" }
4431 #[cfg(target_pointer_width = "64")]
4434 uint_impl! { usize, u64, 64, 18446744073709551615, "", "", 12, "0xaa00000000006e1", "0x6e10aa",
4435 "0x1234567890123456", "0x5634129078563412", "0x6a2c48091e6a2c48",
4436 "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
4437 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]" }
4440 /// A classification of floating point numbers.
4442 /// This `enum` is used as the return type for [`f32::classify`] and [`f64::classify`]. See
4443 /// their documentation for more.
4445 /// [`f32::classify`]: ../../std/primitive.f32.html#method.classify
4446 /// [`f64::classify`]: ../../std/primitive.f64.html#method.classify
4451 /// use std::num::FpCategory;
4454 /// let num = 12.4_f32;
4455 /// let inf = f32::INFINITY;
4456 /// let zero = 0f32;
4457 /// let sub: f32 = 1.1754942e-38;
4458 /// let nan = f32::NAN;
4460 /// assert_eq!(num.classify(), FpCategory::Normal);
4461 /// assert_eq!(inf.classify(), FpCategory::Infinite);
4462 /// assert_eq!(zero.classify(), FpCategory::Zero);
4463 /// assert_eq!(nan.classify(), FpCategory::Nan);
4464 /// assert_eq!(sub.classify(), FpCategory::Subnormal);
4466 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
4467 #[stable(feature = "rust1", since = "1.0.0")]
4468 pub enum FpCategory {
4469 /// "Not a Number", often obtained by dividing by zero.
4470 #[stable(feature = "rust1", since = "1.0.0")]
4473 /// Positive or negative infinity.
4474 #[stable(feature = "rust1", since = "1.0.0")]
4477 /// Positive or negative zero.
4478 #[stable(feature = "rust1", since = "1.0.0")]
4481 /// De-normalized floating point representation (less precise than `Normal`).
4482 #[stable(feature = "rust1", since = "1.0.0")]
4485 /// A regular floating point number.
4486 #[stable(feature = "rust1", since = "1.0.0")]
4490 macro_rules! from_str_radix_int_impl {
4492 #[stable(feature = "rust1", since = "1.0.0")]
4493 impl FromStr for $t {
4494 type Err = ParseIntError;
4495 fn from_str(src: &str) -> Result<Self, ParseIntError> {
4496 from_str_radix(src, 10)
4501 from_str_radix_int_impl! { isize i8 i16 i32 i64 i128 usize u8 u16 u32 u64 u128 }
4503 /// The error type returned when a checked integral type conversion fails.
4504 #[unstable(feature = "try_from", issue = "33417")]
4505 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
4506 pub struct TryFromIntError(());
4508 impl TryFromIntError {
4509 #[unstable(feature = "int_error_internals",
4510 reason = "available through Error trait and this method should \
4511 not be exposed publicly",
4514 pub fn __description(&self) -> &str {
4515 "out of range integral type conversion attempted"
4519 #[unstable(feature = "try_from", issue = "33417")]
4520 impl fmt::Display for TryFromIntError {
4521 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
4522 self.__description().fmt(fmt)
4526 #[unstable(feature = "try_from", issue = "33417")]
4527 impl From<!> for TryFromIntError {
4528 fn from(never: !) -> TryFromIntError {
4533 // no possible bounds violation
4534 macro_rules! try_from_unbounded {
4535 ($source:ty, $($target:ty),*) => {$(
4536 #[unstable(feature = "try_from", issue = "33417")]
4537 impl TryFrom<$source> for $target {
4538 type Error = TryFromIntError;
4541 fn try_from(value: $source) -> Result<Self, Self::Error> {
4542 Ok(value as $target)
4548 // only negative bounds
4549 macro_rules! try_from_lower_bounded {
4550 ($source:ty, $($target:ty),*) => {$(
4551 #[unstable(feature = "try_from", issue = "33417")]
4552 impl TryFrom<$source> for $target {
4553 type Error = TryFromIntError;
4556 fn try_from(u: $source) -> Result<$target, TryFromIntError> {
4560 Err(TryFromIntError(()))
4567 // unsigned to signed (only positive bound)
4568 macro_rules! try_from_upper_bounded {
4569 ($source:ty, $($target:ty),*) => {$(
4570 #[unstable(feature = "try_from", issue = "33417")]
4571 impl TryFrom<$source> for $target {
4572 type Error = TryFromIntError;
4575 fn try_from(u: $source) -> Result<$target, TryFromIntError> {
4576 if u > (<$target>::max_value() as $source) {
4577 Err(TryFromIntError(()))
4587 macro_rules! try_from_both_bounded {
4588 ($source:ty, $($target:ty),*) => {$(
4589 #[unstable(feature = "try_from", issue = "33417")]
4590 impl TryFrom<$source> for $target {
4591 type Error = TryFromIntError;
4594 fn try_from(u: $source) -> Result<$target, TryFromIntError> {
4595 let min = <$target>::min_value() as $source;
4596 let max = <$target>::max_value() as $source;
4597 if u < min || u > max {
4598 Err(TryFromIntError(()))
4608 ($mac:ident, $source:ty, $($target:ty),*) => {$(
4609 $mac!($target, $source);
4613 /// intra-sign conversions
4614 try_from_upper_bounded!(u16, u8);
4615 try_from_upper_bounded!(u32, u16, u8);
4616 try_from_upper_bounded!(u64, u32, u16, u8);
4617 try_from_upper_bounded!(u128, u64, u32, u16, u8);
4619 try_from_both_bounded!(i16, i8);
4620 try_from_both_bounded!(i32, i16, i8);
4621 try_from_both_bounded!(i64, i32, i16, i8);
4622 try_from_both_bounded!(i128, i64, i32, i16, i8);
4624 // unsigned-to-signed
4625 try_from_upper_bounded!(u8, i8);
4626 try_from_upper_bounded!(u16, i8, i16);
4627 try_from_upper_bounded!(u32, i8, i16, i32);
4628 try_from_upper_bounded!(u64, i8, i16, i32, i64);
4629 try_from_upper_bounded!(u128, i8, i16, i32, i64, i128);
4631 // signed-to-unsigned
4632 try_from_lower_bounded!(i8, u8, u16, u32, u64, u128);
4633 try_from_lower_bounded!(i16, u16, u32, u64, u128);
4634 try_from_lower_bounded!(i32, u32, u64, u128);
4635 try_from_lower_bounded!(i64, u64, u128);
4636 try_from_lower_bounded!(i128, u128);
4637 try_from_both_bounded!(i16, u8);
4638 try_from_both_bounded!(i32, u16, u8);
4639 try_from_both_bounded!(i64, u32, u16, u8);
4640 try_from_both_bounded!(i128, u64, u32, u16, u8);
4643 try_from_upper_bounded!(usize, isize);
4644 try_from_lower_bounded!(isize, usize);
4646 #[cfg(target_pointer_width = "16")]
4647 mod ptr_try_from_impls {
4648 use super::TryFromIntError;
4649 use convert::TryFrom;
4651 try_from_upper_bounded!(usize, u8);
4652 try_from_unbounded!(usize, u16, u32, u64, u128);
4653 try_from_upper_bounded!(usize, i8, i16);
4654 try_from_unbounded!(usize, i32, i64, i128);
4656 try_from_both_bounded!(isize, u8);
4657 try_from_lower_bounded!(isize, u16, u32, u64, u128);
4658 try_from_both_bounded!(isize, i8);
4659 try_from_unbounded!(isize, i16, i32, i64, i128);
4661 rev!(try_from_upper_bounded, usize, u32, u64, u128);
4662 rev!(try_from_lower_bounded, usize, i8, i16);
4663 rev!(try_from_both_bounded, usize, i32, i64, i128);
4665 rev!(try_from_upper_bounded, isize, u16, u32, u64, u128);
4666 rev!(try_from_both_bounded, isize, i32, i64, i128);
4669 #[cfg(target_pointer_width = "32")]
4670 mod ptr_try_from_impls {
4671 use super::TryFromIntError;
4672 use convert::TryFrom;
4674 try_from_upper_bounded!(usize, u8, u16);
4675 try_from_unbounded!(usize, u32, u64, u128);
4676 try_from_upper_bounded!(usize, i8, i16, i32);
4677 try_from_unbounded!(usize, i64, i128);
4679 try_from_both_bounded!(isize, u8, u16);
4680 try_from_lower_bounded!(isize, u32, u64, u128);
4681 try_from_both_bounded!(isize, i8, i16);
4682 try_from_unbounded!(isize, i32, i64, i128);
4684 rev!(try_from_unbounded, usize, u32);
4685 rev!(try_from_upper_bounded, usize, u64, u128);
4686 rev!(try_from_lower_bounded, usize, i8, i16, i32);
4687 rev!(try_from_both_bounded, usize, i64, i128);
4689 rev!(try_from_unbounded, isize, u16);
4690 rev!(try_from_upper_bounded, isize, u32, u64, u128);
4691 rev!(try_from_unbounded, isize, i32);
4692 rev!(try_from_both_bounded, isize, i64, i128);
4695 #[cfg(target_pointer_width = "64")]
4696 mod ptr_try_from_impls {
4697 use super::TryFromIntError;
4698 use convert::TryFrom;
4700 try_from_upper_bounded!(usize, u8, u16, u32);
4701 try_from_unbounded!(usize, u64, u128);
4702 try_from_upper_bounded!(usize, i8, i16, i32, i64);
4703 try_from_unbounded!(usize, i128);
4705 try_from_both_bounded!(isize, u8, u16, u32);
4706 try_from_lower_bounded!(isize, u64, u128);
4707 try_from_both_bounded!(isize, i8, i16, i32);
4708 try_from_unbounded!(isize, i64, i128);
4710 rev!(try_from_unbounded, usize, u32, u64);
4711 rev!(try_from_upper_bounded, usize, u128);
4712 rev!(try_from_lower_bounded, usize, i8, i16, i32, i64);
4713 rev!(try_from_both_bounded, usize, i128);
4715 rev!(try_from_unbounded, isize, u16, u32);
4716 rev!(try_from_upper_bounded, isize, u64, u128);
4717 rev!(try_from_unbounded, isize, i32, i64);
4718 rev!(try_from_both_bounded, isize, i128);
4722 trait FromStrRadixHelper: PartialOrd + Copy {
4723 fn min_value() -> Self;
4724 fn max_value() -> Self;
4725 fn from_u32(u: u32) -> Self;
4726 fn checked_mul(&self, other: u32) -> Option<Self>;
4727 fn checked_sub(&self, other: u32) -> Option<Self>;
4728 fn checked_add(&self, other: u32) -> Option<Self>;
4732 ($($t:ty)*) => ($(impl FromStrRadixHelper for $t {
4734 fn min_value() -> Self { Self::min_value() }
4736 fn max_value() -> Self { Self::max_value() }
4738 fn from_u32(u: u32) -> Self { u as Self }
4740 fn checked_mul(&self, other: u32) -> Option<Self> {
4741 Self::checked_mul(*self, other as Self)
4744 fn checked_sub(&self, other: u32) -> Option<Self> {
4745 Self::checked_sub(*self, other as Self)
4748 fn checked_add(&self, other: u32) -> Option<Self> {
4749 Self::checked_add(*self, other as Self)
4753 doit! { i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize }
4755 fn from_str_radix<T: FromStrRadixHelper>(src: &str, radix: u32) -> Result<T, ParseIntError> {
4756 use self::IntErrorKind::*;
4757 use self::ParseIntError as PIE;
4759 assert!(radix >= 2 && radix <= 36,
4760 "from_str_radix_int: must lie in the range `[2, 36]` - found {}",
4764 return Err(PIE { kind: Empty });
4767 let is_signed_ty = T::from_u32(0) > T::min_value();
4769 // all valid digits are ascii, so we will just iterate over the utf8 bytes
4770 // and cast them to chars. .to_digit() will safely return None for anything
4771 // other than a valid ascii digit for the given radix, including the first-byte
4772 // of multi-byte sequences
4773 let src = src.as_bytes();
4775 let (is_positive, digits) = match src[0] {
4776 b'+' => (true, &src[1..]),
4777 b'-' if is_signed_ty => (false, &src[1..]),
4781 if digits.is_empty() {
4782 return Err(PIE { kind: Empty });
4785 let mut result = T::from_u32(0);
4787 // The number is positive
4789 let x = match (c as char).to_digit(radix) {
4791 None => return Err(PIE { kind: InvalidDigit }),
4793 result = match result.checked_mul(radix) {
4794 Some(result) => result,
4795 None => return Err(PIE { kind: Overflow }),
4797 result = match result.checked_add(x) {
4798 Some(result) => result,
4799 None => return Err(PIE { kind: Overflow }),
4803 // The number is negative
4805 let x = match (c as char).to_digit(radix) {
4807 None => return Err(PIE { kind: InvalidDigit }),
4809 result = match result.checked_mul(radix) {
4810 Some(result) => result,
4811 None => return Err(PIE { kind: Underflow }),
4813 result = match result.checked_sub(x) {
4814 Some(result) => result,
4815 None => return Err(PIE { kind: Underflow }),
4822 /// An error which can be returned when parsing an integer.
4824 /// This error is used as the error type for the `from_str_radix()` functions
4825 /// on the primitive integer types, such as [`i8::from_str_radix`].
4827 /// # Potential causes
4829 /// Among other causes, `ParseIntError` can be thrown because of leading or trailing whitespace
4830 /// in the string e.g. when it is obtained from the standard input.
4831 /// Using the [`str.trim()`] method ensures that no whitespace remains before parsing.
4833 /// [`str.trim()`]: ../../std/primitive.str.html#method.trim
4834 /// [`i8::from_str_radix`]: ../../std/primitive.i8.html#method.from_str_radix
4835 #[derive(Debug, Clone, PartialEq, Eq)]
4836 #[stable(feature = "rust1", since = "1.0.0")]
4837 pub struct ParseIntError {
4841 /// Enum to store the various types of errors that can cause parsing an integer to fail.
4842 #[unstable(feature = "int_error_matching",
4843 reason = "it can be useful to match errors when making error messages \
4844 for integer parsing",
4846 #[derive(Debug, Clone, PartialEq, Eq)]
4848 pub enum IntErrorKind {
4849 /// Value being parsed is empty.
4851 /// Among other causes, this variant will be constructed when parsing an empty string.
4853 /// Contains an invalid digit.
4855 /// Among other causes, this variant will be constructed when parsing a string that
4856 /// contains a letter.
4858 /// Integer is too large to store in target integer type.
4860 /// Integer is too small to store in target integer type.
4864 impl ParseIntError {
4865 /// Outputs the detailed cause of parsing an integer failing.
4866 #[unstable(feature = "int_error_matching",
4867 reason = "it can be useful to match errors when making error messages \
4868 for integer parsing",
4870 pub fn kind(&self) -> &IntErrorKind {
4873 #[unstable(feature = "int_error_internals",
4874 reason = "available through Error trait and this method should \
4875 not be exposed publicly",
4878 pub fn __description(&self) -> &str {
4880 IntErrorKind::Empty => "cannot parse integer from empty string",
4881 IntErrorKind::InvalidDigit => "invalid digit found in string",
4882 IntErrorKind::Overflow => "number too large to fit in target type",
4883 IntErrorKind::Underflow => "number too small to fit in target type",
4888 #[stable(feature = "rust1", since = "1.0.0")]
4889 impl fmt::Display for ParseIntError {
4890 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
4891 self.__description().fmt(f)
4895 #[stable(feature = "rust1", since = "1.0.0")]
4896 pub use num::dec2flt::ParseFloatError;
4898 // Conversion traits for primitive integer and float types
4899 // Conversions T -> T are covered by a blanket impl and therefore excluded
4900 // Some conversions from and to usize/isize are not implemented due to portability concerns
4901 macro_rules! impl_from {
4902 ($Small: ty, $Large: ty, #[$attr:meta], $doc: expr) => {
4905 impl From<$Small> for $Large {
4907 fn from(small: $Small) -> $Large {
4912 ($Small: ty, $Large: ty, #[$attr:meta]) => {
4916 concat!("Converts `",
4924 macro_rules! impl_from_bool {
4925 ($target: ty, #[$attr:meta]) => {
4926 impl_from!(bool, $target, #[$attr], concat!("Converts a `bool` to a `",
4927 stringify!($target), "`. The resulting value is `0` for `false` and `1` for `true`
4933 assert_eq!(", stringify!($target), "::from(true), 1);
4934 assert_eq!(", stringify!($target), "::from(false), 0);
4940 impl_from_bool! { u8, #[stable(feature = "from_bool", since = "1.28.0")] }
4941 impl_from_bool! { u16, #[stable(feature = "from_bool", since = "1.28.0")] }
4942 impl_from_bool! { u32, #[stable(feature = "from_bool", since = "1.28.0")] }
4943 impl_from_bool! { u64, #[stable(feature = "from_bool", since = "1.28.0")] }
4944 impl_from_bool! { u128, #[stable(feature = "from_bool", since = "1.28.0")] }
4945 impl_from_bool! { usize, #[stable(feature = "from_bool", since = "1.28.0")] }
4946 impl_from_bool! { i8, #[stable(feature = "from_bool", since = "1.28.0")] }
4947 impl_from_bool! { i16, #[stable(feature = "from_bool", since = "1.28.0")] }
4948 impl_from_bool! { i32, #[stable(feature = "from_bool", since = "1.28.0")] }
4949 impl_from_bool! { i64, #[stable(feature = "from_bool", since = "1.28.0")] }
4950 impl_from_bool! { i128, #[stable(feature = "from_bool", since = "1.28.0")] }
4951 impl_from_bool! { isize, #[stable(feature = "from_bool", since = "1.28.0")] }
4953 // Unsigned -> Unsigned
4954 impl_from! { u8, u16, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4955 impl_from! { u8, u32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4956 impl_from! { u8, u64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4957 impl_from! { u8, u128, #[stable(feature = "i128", since = "1.26.0")] }
4958 impl_from! { u8, usize, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4959 impl_from! { u16, u32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4960 impl_from! { u16, u64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4961 impl_from! { u16, u128, #[stable(feature = "i128", since = "1.26.0")] }
4962 impl_from! { u32, u64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4963 impl_from! { u32, u128, #[stable(feature = "i128", since = "1.26.0")] }
4964 impl_from! { u64, u128, #[stable(feature = "i128", since = "1.26.0")] }
4967 impl_from! { i8, i16, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4968 impl_from! { i8, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4969 impl_from! { i8, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4970 impl_from! { i8, i128, #[stable(feature = "i128", since = "1.26.0")] }
4971 impl_from! { i8, isize, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4972 impl_from! { i16, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4973 impl_from! { i16, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4974 impl_from! { i16, i128, #[stable(feature = "i128", since = "1.26.0")] }
4975 impl_from! { i32, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4976 impl_from! { i32, i128, #[stable(feature = "i128", since = "1.26.0")] }
4977 impl_from! { i64, i128, #[stable(feature = "i128", since = "1.26.0")] }
4979 // Unsigned -> Signed
4980 impl_from! { u8, i16, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4981 impl_from! { u8, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4982 impl_from! { u8, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4983 impl_from! { u8, i128, #[stable(feature = "i128", since = "1.26.0")] }
4984 impl_from! { u16, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4985 impl_from! { u16, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4986 impl_from! { u16, i128, #[stable(feature = "i128", since = "1.26.0")] }
4987 impl_from! { u32, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
4988 impl_from! { u32, i128, #[stable(feature = "i128", since = "1.26.0")] }
4989 impl_from! { u64, i128, #[stable(feature = "i128", since = "1.26.0")] }
4991 // The C99 standard defines bounds on INTPTR_MIN, INTPTR_MAX, and UINTPTR_MAX
4992 // which imply that pointer-sized integers must be at least 16 bits:
4993 // https://port70.net/~nsz/c/c99/n1256.html#7.18.2.4
4994 impl_from! { u16, usize, #[stable(feature = "lossless_iusize_conv", since = "1.26.0")] }
4995 impl_from! { u8, isize, #[stable(feature = "lossless_iusize_conv", since = "1.26.0")] }
4996 impl_from! { i16, isize, #[stable(feature = "lossless_iusize_conv", since = "1.26.0")] }
4998 // RISC-V defines the possibility of a 128-bit address space (RV128).
5000 // CHERI proposes 256-bit “capabilities”. Unclear if this would be relevant to usize/isize.
5001 // https://www.cl.cam.ac.uk/research/security/ctsrd/pdfs/20171017a-cheri-poster.pdf
5002 // http://www.csl.sri.com/users/neumann/2012resolve-cheri.pdf
5005 // Note: integers can only be represented with full precision in a float if
5006 // they fit in the significand, which is 24 bits in f32 and 53 bits in f64.
5007 // Lossy float conversions are not implemented at this time.
5010 impl_from! { i8, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5011 impl_from! { i8, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5012 impl_from! { i16, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5013 impl_from! { i16, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5014 impl_from! { i32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5016 // Unsigned -> Float
5017 impl_from! { u8, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5018 impl_from! { u8, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5019 impl_from! { u16, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5020 impl_from! { u16, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5021 impl_from! { u32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5024 impl_from! { f32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5026 static ASCII_LOWERCASE_MAP: [u8; 256] = [
5027 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
5028 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
5029 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
5030 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
5031 b' ', b'!', b'"', b'#', b'$', b'%', b'&', b'\'',
5032 b'(', b')', b'*', b'+', b',', b'-', b'.', b'/',
5033 b'0', b'1', b'2', b'3', b'4', b'5', b'6', b'7',
5034 b'8', b'9', b':', b';', b'<', b'=', b'>', b'?',
5037 b'a', b'b', b'c', b'd', b'e', b'f', b'g',
5038 b'h', b'i', b'j', b'k', b'l', b'm', b'n', b'o',
5039 b'p', b'q', b'r', b's', b't', b'u', b'v', b'w',
5042 b'[', b'\\', b']', b'^', b'_',
5043 b'`', b'a', b'b', b'c', b'd', b'e', b'f', b'g',
5044 b'h', b'i', b'j', b'k', b'l', b'm', b'n', b'o',
5045 b'p', b'q', b'r', b's', b't', b'u', b'v', b'w',
5046 b'x', b'y', b'z', b'{', b'|', b'}', b'~', 0x7f,
5047 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
5048 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
5049 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
5050 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
5051 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
5052 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
5053 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
5054 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
5055 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
5056 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
5057 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
5058 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
5059 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
5060 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
5061 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
5062 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
5065 static ASCII_UPPERCASE_MAP: [u8; 256] = [
5066 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
5067 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
5068 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
5069 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
5070 b' ', b'!', b'"', b'#', b'$', b'%', b'&', b'\'',
5071 b'(', b')', b'*', b'+', b',', b'-', b'.', b'/',
5072 b'0', b'1', b'2', b'3', b'4', b'5', b'6', b'7',
5073 b'8', b'9', b':', b';', b'<', b'=', b'>', b'?',
5074 b'@', b'A', b'B', b'C', b'D', b'E', b'F', b'G',
5075 b'H', b'I', b'J', b'K', b'L', b'M', b'N', b'O',
5076 b'P', b'Q', b'R', b'S', b'T', b'U', b'V', b'W',
5077 b'X', b'Y', b'Z', b'[', b'\\', b']', b'^', b'_',
5080 b'A', b'B', b'C', b'D', b'E', b'F', b'G',
5081 b'H', b'I', b'J', b'K', b'L', b'M', b'N', b'O',
5082 b'P', b'Q', b'R', b'S', b'T', b'U', b'V', b'W',
5085 b'{', b'|', b'}', b'~', 0x7f,
5086 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
5087 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
5088 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
5089 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
5090 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
5091 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
5092 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
5093 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
5094 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
5095 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
5096 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
5097 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
5098 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
5099 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
5100 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
5101 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
5104 enum AsciiCharacterClass {
5106 Cw, // control whitespace
5110 Lx, // lowercase hex digit
5112 Ux, // uppercase hex digit
5115 use self::AsciiCharacterClass::*;
5117 static ASCII_CHARACTER_CLASS: [AsciiCharacterClass; 128] = [
5118 // _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
5119 C, C, C, C, C, C, C, C, C, Cw,Cw,C, Cw,Cw,C, C, // 0_
5120 C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, // 1_
5121 W, P, P, P, P, P, P, P, P, P, P, P, P, P, P, P, // 2_
5122 D, D, D, D, D, D, D, D, D, D, P, P, P, P, P, P, // 3_
5123 P, Ux,Ux,Ux,Ux,Ux,Ux,U, U, U, U, U, U, U, U, U, // 4_
5124 U, U, U, U, U, U, U, U, U, U, U, P, P, P, P, P, // 5_
5125 P, Lx,Lx,Lx,Lx,Lx,Lx,L, L, L, L, L, L, L, L, L, // 6_
5126 L, L, L, L, L, L, L, L, L, L, L, P, P, P, P, C, // 7_