1 // ignore-tidy-filelength
3 //! Numeric traits and functions for the built-in numeric types.
5 #![stable(feature = "rust1", since = "1.0.0")]
7 use crate::convert::{TryFrom, Infallible};
12 use crate::str::FromStr;
14 macro_rules! impl_nonzero_fmt {
15 ( #[$stability: meta] ( $( $Trait: ident ),+ ) for $Ty: ident ) => {
18 impl fmt::$Trait for $Ty {
20 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
28 macro_rules! doc_comment {
29 ($x:expr, $($tt:tt)*) => {
35 macro_rules! nonzero_integers {
36 ( $( #[$stability: meta] $Ty: ident($Int: ty); )+ ) => {
39 concat!("An integer that is known not to equal zero.
41 This enables some memory layout optimization.
42 For example, `Option<", stringify!($Ty), ">` is the same size as `", stringify!($Int), "`:
45 use std::mem::size_of;
46 assert_eq!(size_of::<Option<core::num::", stringify!($Ty), ">>(), size_of::<", stringify!($Int),
50 #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
52 #[rustc_layout_scalar_valid_range_start(1)]
53 #[rustc_nonnull_optimization_guaranteed]
58 /// Creates a non-zero without checking the value.
62 /// The value must not be zero.
65 pub const unsafe fn new_unchecked(n: $Int) -> Self {
69 /// Creates a non-zero if the given value is not zero.
72 pub fn new(n: $Int) -> Option<Self> {
74 Some(unsafe { $Ty(n) })
80 /// Returns the value as a primitive type.
83 pub const fn get(self) -> $Int {
89 #[stable(feature = "from_nonzero", since = "1.31.0")]
90 impl From<$Ty> for $Int {
91 fn from(nonzero: $Ty) -> Self {
97 #[$stability] (Debug, Display, Binary, Octal, LowerHex, UpperHex) for $Ty
104 #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU8(u8);
105 #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU16(u16);
106 #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU32(u32);
107 #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU64(u64);
108 #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU128(u128);
109 #[stable(feature = "nonzero", since = "1.28.0")] NonZeroUsize(usize);
110 #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI8(i8);
111 #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI16(i16);
112 #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI32(i32);
113 #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI64(i64);
114 #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI128(i128);
115 #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroIsize(isize);
118 macro_rules! from_str_radix_nzint_impl {
120 #[stable(feature = "nonzero_parse", since = "1.35.0")]
121 impl FromStr for $t {
122 type Err = ParseIntError;
123 fn from_str(src: &str) -> Result<Self, Self::Err> {
124 Self::new(from_str_radix(src, 10)?)
125 .ok_or(ParseIntError {
126 kind: IntErrorKind::Zero
133 from_str_radix_nzint_impl! { NonZeroU8 NonZeroU16 NonZeroU32 NonZeroU64 NonZeroU128 NonZeroUsize
134 NonZeroI8 NonZeroI16 NonZeroI32 NonZeroI64 NonZeroI128 NonZeroIsize }
136 /// Provides intentionally-wrapped arithmetic on `T`.
138 /// Operations like `+` on `u32` values is intended to never overflow,
139 /// and in some debug configurations overflow is detected and results
140 /// in a panic. While most arithmetic falls into this category, some
141 /// code explicitly expects and relies upon modular arithmetic (e.g.,
144 /// Wrapping arithmetic can be achieved either through methods like
145 /// `wrapping_add`, or through the `Wrapping<T>` type, which says that
146 /// all standard arithmetic operations on the underlying value are
147 /// intended to have wrapping semantics.
149 /// The underlying value can be retrieved through the `.0` index of the
150 /// `Wrapping` tuple.
155 /// use std::num::Wrapping;
157 /// let zero = Wrapping(0u32);
158 /// let one = Wrapping(1u32);
160 /// assert_eq!(std::u32::MAX, (zero - one).0);
162 #[stable(feature = "rust1", since = "1.0.0")]
163 #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default, Hash)]
165 pub struct Wrapping<T>(#[stable(feature = "rust1", since = "1.0.0")]
168 #[stable(feature = "rust1", since = "1.0.0")]
169 impl<T: fmt::Debug> fmt::Debug for Wrapping<T> {
170 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
175 #[stable(feature = "wrapping_display", since = "1.10.0")]
176 impl<T: fmt::Display> fmt::Display for Wrapping<T> {
177 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
182 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
183 impl<T: fmt::Binary> fmt::Binary for Wrapping<T> {
184 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
189 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
190 impl<T: fmt::Octal> fmt::Octal for Wrapping<T> {
191 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
196 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
197 impl<T: fmt::LowerHex> fmt::LowerHex for Wrapping<T> {
198 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
203 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
204 impl<T: fmt::UpperHex> fmt::UpperHex for Wrapping<T> {
205 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
210 // All these modules are technically private and only exposed for coretests:
218 macro_rules! usize_isize_to_xe_bytes_doc {
221 **Note**: This function returns an array of length 2, 4 or 8 bytes
222 depending on the target pointer size.
228 macro_rules! usize_isize_from_xe_bytes_doc {
231 **Note**: This function takes an array of length 2, 4 or 8 bytes
232 depending on the target pointer size.
237 // `Int` + `SignedInt` implemented for signed integers
238 macro_rules! int_impl {
239 ($SelfT:ty, $ActualT:ident, $UnsignedT:ty, $BITS:expr, $Min:expr, $Max:expr, $Feature:expr,
240 $EndFeature:expr, $rot:expr, $rot_op:expr, $rot_result:expr, $swap_op:expr, $swapped:expr,
241 $reversed:expr, $le_bytes:expr, $be_bytes:expr,
242 $to_xe_bytes_doc:expr, $from_xe_bytes_doc:expr) => {
244 concat!("Returns the smallest value that can be represented by this integer type.
251 ", $Feature, "assert_eq!(", stringify!($SelfT), "::min_value(), ", stringify!($Min), ");",
254 #[stable(feature = "rust1", since = "1.0.0")]
257 pub const fn min_value() -> Self {
258 !0 ^ ((!0 as $UnsignedT) >> 1) as Self
263 concat!("Returns the largest value that can be represented by this integer type.
270 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value(), ", stringify!($Max), ");",
273 #[stable(feature = "rust1", since = "1.0.0")]
276 pub const fn max_value() -> Self {
282 concat!("Converts a string slice in a given base to an integer.
284 The string is expected to be an optional `+` or `-` sign followed by digits.
285 Leading and trailing whitespace represent an error. Digits are a subset of these characters,
286 depending on `radix`:
294 This function panics if `radix` is not in the range from 2 to 36.
301 ", $Feature, "assert_eq!(", stringify!($SelfT), "::from_str_radix(\"A\", 16), Ok(10));",
304 #[stable(feature = "rust1", since = "1.0.0")]
305 pub fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError> {
306 from_str_radix(src, radix)
311 concat!("Returns the number of ones in the binary representation of `self`.
318 ", $Feature, "let n = 0b100_0000", stringify!($SelfT), ";
320 assert_eq!(n.count_ones(), 1);",
324 #[stable(feature = "rust1", since = "1.0.0")]
326 pub const fn count_ones(self) -> u32 { (self as $UnsignedT).count_ones() }
330 concat!("Returns the number of zeros in the binary representation of `self`.
337 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value().count_zeros(), 1);", $EndFeature, "
339 #[stable(feature = "rust1", since = "1.0.0")]
341 pub const fn count_zeros(self) -> u32 {
347 concat!("Returns the number of leading zeros in the binary representation of `self`.
354 ", $Feature, "let n = -1", stringify!($SelfT), ";
356 assert_eq!(n.leading_zeros(), 0);",
359 #[stable(feature = "rust1", since = "1.0.0")]
361 pub const fn leading_zeros(self) -> u32 {
362 (self as $UnsignedT).leading_zeros()
367 concat!("Returns the number of trailing zeros in the binary representation of `self`.
374 ", $Feature, "let n = -4", stringify!($SelfT), ";
376 assert_eq!(n.trailing_zeros(), 2);",
379 #[stable(feature = "rust1", since = "1.0.0")]
381 pub const fn trailing_zeros(self) -> u32 {
382 (self as $UnsignedT).trailing_zeros()
387 concat!("Shifts the bits to the left by a specified amount, `n`,
388 wrapping the truncated bits to the end of the resulting integer.
390 Please note this isn't the same operation as the `<<` shifting operator!
397 let n = ", $rot_op, stringify!($SelfT), ";
398 let m = ", $rot_result, ";
400 assert_eq!(n.rotate_left(", $rot, "), m);
402 #[stable(feature = "rust1", since = "1.0.0")]
403 #[must_use = "this returns the result of the operation, \
404 without modifying the original"]
406 pub const fn rotate_left(self, n: u32) -> Self {
407 (self as $UnsignedT).rotate_left(n) as Self
412 concat!("Shifts the bits to the right by a specified amount, `n`,
413 wrapping the truncated bits to the beginning of the resulting
416 Please note this isn't the same operation as the `>>` shifting operator!
423 let n = ", $rot_result, stringify!($SelfT), ";
424 let m = ", $rot_op, ";
426 assert_eq!(n.rotate_right(", $rot, "), m);
428 #[stable(feature = "rust1", since = "1.0.0")]
429 #[must_use = "this returns the result of the operation, \
430 without modifying the original"]
432 pub const fn rotate_right(self, n: u32) -> Self {
433 (self as $UnsignedT).rotate_right(n) as Self
438 concat!("Reverses the byte order of the integer.
445 let n = ", $swap_op, stringify!($SelfT), ";
447 let m = n.swap_bytes();
449 assert_eq!(m, ", $swapped, ");
451 #[stable(feature = "rust1", since = "1.0.0")]
453 pub const fn swap_bytes(self) -> Self {
454 (self as $UnsignedT).swap_bytes() as Self
459 concat!("Reverses the bit pattern of the integer.
466 let n = ", $swap_op, stringify!($SelfT), ";
467 let m = n.reverse_bits();
469 assert_eq!(m, ", $reversed, ");
471 #[stable(feature = "reverse_bits", since = "1.37.0")]
474 pub const fn reverse_bits(self) -> Self {
475 (self as $UnsignedT).reverse_bits() as Self
480 concat!("Converts an integer from big endian to the target's endianness.
482 On big endian this is a no-op. On little endian the bytes are swapped.
489 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
491 if cfg!(target_endian = \"big\") {
492 assert_eq!(", stringify!($SelfT), "::from_be(n), n)
494 assert_eq!(", stringify!($SelfT), "::from_be(n), n.swap_bytes())
498 #[stable(feature = "rust1", since = "1.0.0")]
500 pub const fn from_be(x: Self) -> Self {
501 #[cfg(target_endian = "big")]
505 #[cfg(not(target_endian = "big"))]
513 concat!("Converts an integer from little endian to the target's endianness.
515 On little endian this is a no-op. On big endian the bytes are swapped.
522 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
524 if cfg!(target_endian = \"little\") {
525 assert_eq!(", stringify!($SelfT), "::from_le(n), n)
527 assert_eq!(", stringify!($SelfT), "::from_le(n), n.swap_bytes())
531 #[stable(feature = "rust1", since = "1.0.0")]
533 pub const fn from_le(x: Self) -> Self {
534 #[cfg(target_endian = "little")]
538 #[cfg(not(target_endian = "little"))]
546 concat!("Converts `self` to big endian from the target's endianness.
548 On big endian this is a no-op. On little endian the bytes are swapped.
555 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
557 if cfg!(target_endian = \"big\") {
558 assert_eq!(n.to_be(), n)
560 assert_eq!(n.to_be(), n.swap_bytes())
564 #[stable(feature = "rust1", since = "1.0.0")]
566 pub const fn to_be(self) -> Self { // or not to be?
567 #[cfg(target_endian = "big")]
571 #[cfg(not(target_endian = "big"))]
579 concat!("Converts `self` to little endian from the target's endianness.
581 On little endian this is a no-op. On big endian the bytes are swapped.
588 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
590 if cfg!(target_endian = \"little\") {
591 assert_eq!(n.to_le(), n)
593 assert_eq!(n.to_le(), n.swap_bytes())
597 #[stable(feature = "rust1", since = "1.0.0")]
599 pub const fn to_le(self) -> Self {
600 #[cfg(target_endian = "little")]
604 #[cfg(not(target_endian = "little"))]
612 concat!("Checked integer addition. Computes `self + rhs`, returning `None`
613 if overflow occurred.
620 ", $Feature, "assert_eq!((", stringify!($SelfT),
621 "::max_value() - 2).checked_add(1), Some(", stringify!($SelfT), "::max_value() - 1));
622 assert_eq!((", stringify!($SelfT), "::max_value() - 2).checked_add(3), None);",
625 #[stable(feature = "rust1", since = "1.0.0")]
626 #[must_use = "this returns the result of the operation, \
627 without modifying the original"]
629 pub fn checked_add(self, rhs: Self) -> Option<Self> {
630 let (a, b) = self.overflowing_add(rhs);
631 if b {None} else {Some(a)}
636 concat!("Checked integer subtraction. Computes `self - rhs`, returning `None` if
644 ", $Feature, "assert_eq!((", stringify!($SelfT),
645 "::min_value() + 2).checked_sub(1), Some(", stringify!($SelfT), "::min_value() + 1));
646 assert_eq!((", stringify!($SelfT), "::min_value() + 2).checked_sub(3), None);",
649 #[stable(feature = "rust1", since = "1.0.0")]
650 #[must_use = "this returns the result of the operation, \
651 without modifying the original"]
653 pub fn checked_sub(self, rhs: Self) -> Option<Self> {
654 let (a, b) = self.overflowing_sub(rhs);
655 if b {None} else {Some(a)}
660 concat!("Checked integer multiplication. Computes `self * rhs`, returning `None` if
668 ", $Feature, "assert_eq!(", stringify!($SelfT),
669 "::max_value().checked_mul(1), Some(", stringify!($SelfT), "::max_value()));
670 assert_eq!(", stringify!($SelfT), "::max_value().checked_mul(2), None);",
673 #[stable(feature = "rust1", since = "1.0.0")]
674 #[must_use = "this returns the result of the operation, \
675 without modifying the original"]
677 pub fn checked_mul(self, rhs: Self) -> Option<Self> {
678 let (a, b) = self.overflowing_mul(rhs);
679 if b {None} else {Some(a)}
684 concat!("Checked integer division. Computes `self / rhs`, returning `None` if `rhs == 0`
685 or the division results in overflow.
692 ", $Feature, "assert_eq!((", stringify!($SelfT),
693 "::min_value() + 1).checked_div(-1), Some(", stringify!($Max), "));
694 assert_eq!(", stringify!($SelfT), "::min_value().checked_div(-1), None);
695 assert_eq!((1", stringify!($SelfT), ").checked_div(0), None);",
698 #[stable(feature = "rust1", since = "1.0.0")]
699 #[must_use = "this returns the result of the operation, \
700 without modifying the original"]
702 pub fn checked_div(self, rhs: Self) -> Option<Self> {
703 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
706 Some(unsafe { intrinsics::unchecked_div(self, rhs) })
712 concat!("Checked Euclidean division. Computes `self.div_euclid(rhs)`,
713 returning `None` if `rhs == 0` or the division results in overflow.
720 assert_eq!((", stringify!($SelfT),
721 "::min_value() + 1).checked_div_euclid(-1), Some(", stringify!($Max), "));
722 assert_eq!(", stringify!($SelfT), "::min_value().checked_div_euclid(-1), None);
723 assert_eq!((1", stringify!($SelfT), ").checked_div_euclid(0), None);
725 #[stable(feature = "euclidean_division", since = "1.38.0")]
726 #[must_use = "this returns the result of the operation, \
727 without modifying the original"]
729 pub fn checked_div_euclid(self, rhs: Self) -> Option<Self> {
730 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
733 Some(self.div_euclid(rhs))
739 concat!("Checked integer remainder. Computes `self % rhs`, returning `None` if
740 `rhs == 0` or the division results in overflow.
747 ", $Feature, "use std::", stringify!($SelfT), ";
749 assert_eq!(5", stringify!($SelfT), ".checked_rem(2), Some(1));
750 assert_eq!(5", stringify!($SelfT), ".checked_rem(0), None);
751 assert_eq!(", stringify!($SelfT), "::MIN.checked_rem(-1), None);",
754 #[stable(feature = "wrapping", since = "1.7.0")]
755 #[must_use = "this returns the result of the operation, \
756 without modifying the original"]
758 pub fn checked_rem(self, rhs: Self) -> Option<Self> {
759 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
762 Some(unsafe { intrinsics::unchecked_rem(self, rhs) })
768 concat!("Checked Euclidean remainder. Computes `self.rem_euclid(rhs)`, returning `None`
769 if `rhs == 0` or the division results in overflow.
776 use std::", stringify!($SelfT), ";
778 assert_eq!(5", stringify!($SelfT), ".checked_rem_euclid(2), Some(1));
779 assert_eq!(5", stringify!($SelfT), ".checked_rem_euclid(0), None);
780 assert_eq!(", stringify!($SelfT), "::MIN.checked_rem_euclid(-1), None);
782 #[stable(feature = "euclidean_division", since = "1.38.0")]
783 #[must_use = "this returns the result of the operation, \
784 without modifying the original"]
786 pub fn checked_rem_euclid(self, rhs: Self) -> Option<Self> {
787 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
790 Some(self.rem_euclid(rhs))
796 concat!("Checked negation. Computes `-self`, returning `None` if `self == MIN`.
803 ", $Feature, "use std::", stringify!($SelfT), ";
805 assert_eq!(5", stringify!($SelfT), ".checked_neg(), Some(-5));
806 assert_eq!(", stringify!($SelfT), "::MIN.checked_neg(), None);",
809 #[stable(feature = "wrapping", since = "1.7.0")]
811 pub fn checked_neg(self) -> Option<Self> {
812 let (a, b) = self.overflowing_neg();
813 if b {None} else {Some(a)}
818 concat!("Checked shift left. Computes `self << rhs`, returning `None` if `rhs` is larger
819 than or equal to the number of bits in `self`.
826 ", $Feature, "assert_eq!(0x1", stringify!($SelfT), ".checked_shl(4), Some(0x10));
827 assert_eq!(0x1", stringify!($SelfT), ".checked_shl(129), None);",
830 #[stable(feature = "wrapping", since = "1.7.0")]
831 #[must_use = "this returns the result of the operation, \
832 without modifying the original"]
834 pub fn checked_shl(self, rhs: u32) -> Option<Self> {
835 let (a, b) = self.overflowing_shl(rhs);
836 if b {None} else {Some(a)}
841 concat!("Checked shift right. Computes `self >> rhs`, returning `None` if `rhs` is
842 larger than or equal to the number of bits in `self`.
849 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".checked_shr(4), Some(0x1));
850 assert_eq!(0x10", stringify!($SelfT), ".checked_shr(128), None);",
853 #[stable(feature = "wrapping", since = "1.7.0")]
854 #[must_use = "this returns the result of the operation, \
855 without modifying the original"]
857 pub fn checked_shr(self, rhs: u32) -> Option<Self> {
858 let (a, b) = self.overflowing_shr(rhs);
859 if b {None} else {Some(a)}
864 concat!("Checked absolute value. Computes `self.abs()`, returning `None` if
872 ", $Feature, "use std::", stringify!($SelfT), ";
874 assert_eq!((-5", stringify!($SelfT), ").checked_abs(), Some(5));
875 assert_eq!(", stringify!($SelfT), "::MIN.checked_abs(), None);",
878 #[stable(feature = "no_panic_abs", since = "1.13.0")]
880 pub fn checked_abs(self) -> Option<Self> {
881 if self.is_negative() {
890 concat!("Checked exponentiation. Computes `self.pow(exp)`, returning `None` if
898 ", $Feature, "assert_eq!(8", stringify!($SelfT), ".checked_pow(2), Some(64));
899 assert_eq!(", stringify!($SelfT), "::max_value().checked_pow(2), None);",
903 #[stable(feature = "no_panic_pow", since = "1.34.0")]
904 #[must_use = "this returns the result of the operation, \
905 without modifying the original"]
907 pub fn checked_pow(self, mut exp: u32) -> Option<Self> {
909 let mut acc: Self = 1;
913 acc = acc.checked_mul(base)?;
916 base = base.checked_mul(base)?;
919 // Deal with the final bit of the exponent separately, since
920 // squaring the base afterwards is not necessary and may cause a
921 // needless overflow.
923 acc = acc.checked_mul(base)?;
931 concat!("Saturating integer addition. Computes `self + rhs`, saturating at the numeric
932 bounds instead of overflowing.
939 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_add(1), 101);
940 assert_eq!(", stringify!($SelfT), "::max_value().saturating_add(100), ", stringify!($SelfT),
945 #[stable(feature = "rust1", since = "1.0.0")]
946 #[rustc_const_unstable(feature = "const_saturating_int_methods")]
947 #[must_use = "this returns the result of the operation, \
948 without modifying the original"]
950 pub const fn saturating_add(self, rhs: Self) -> Self {
951 intrinsics::saturating_add(self, rhs)
957 concat!("Saturating integer subtraction. Computes `self - rhs`, saturating at the
958 numeric bounds instead of overflowing.
965 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_sub(127), -27);
966 assert_eq!(", stringify!($SelfT), "::min_value().saturating_sub(100), ", stringify!($SelfT),
970 #[stable(feature = "rust1", since = "1.0.0")]
971 #[rustc_const_unstable(feature = "const_saturating_int_methods")]
972 #[must_use = "this returns the result of the operation, \
973 without modifying the original"]
975 pub const fn saturating_sub(self, rhs: Self) -> Self {
976 intrinsics::saturating_sub(self, rhs)
981 concat!("Saturating integer negation. Computes `-self`, returning `MAX` if `self == MIN`
982 instead of overflowing.
989 ", $Feature, "#![feature(saturating_neg)]
990 assert_eq!(100", stringify!($SelfT), ".saturating_neg(), -100);
991 assert_eq!((-100", stringify!($SelfT), ").saturating_neg(), 100);
992 assert_eq!(", stringify!($SelfT), "::min_value().saturating_neg(), ", stringify!($SelfT),
994 assert_eq!(", stringify!($SelfT), "::max_value().saturating_neg(), ", stringify!($SelfT),
995 "::min_value() + 1);",
999 #[unstable(feature = "saturating_neg", issue = "59983")]
1001 pub fn saturating_neg(self) -> Self {
1002 intrinsics::saturating_sub(0, self)
1007 concat!("Saturating absolute value. Computes `self.abs()`, returning `MAX` if `self ==
1008 MIN` instead of overflowing.
1015 ", $Feature, "#![feature(saturating_neg)]
1016 assert_eq!(100", stringify!($SelfT), ".saturating_abs(), 100);
1017 assert_eq!((-100", stringify!($SelfT), ").saturating_abs(), 100);
1018 assert_eq!(", stringify!($SelfT), "::min_value().saturating_abs(), ", stringify!($SelfT),
1020 assert_eq!((", stringify!($SelfT), "::min_value() + 1).saturating_abs(), ", stringify!($SelfT),
1025 #[unstable(feature = "saturating_neg", issue = "59983")]
1027 pub fn saturating_abs(self) -> Self {
1028 if self.is_negative() {
1029 self.saturating_neg()
1037 concat!("Saturating integer multiplication. Computes `self * rhs`, saturating at the
1038 numeric bounds instead of overflowing.
1045 ", $Feature, "use std::", stringify!($SelfT), ";
1047 assert_eq!(10", stringify!($SelfT), ".saturating_mul(12), 120);
1048 assert_eq!(", stringify!($SelfT), "::MAX.saturating_mul(10), ", stringify!($SelfT), "::MAX);
1049 assert_eq!(", stringify!($SelfT), "::MIN.saturating_mul(10), ", stringify!($SelfT), "::MIN);",
1052 #[stable(feature = "wrapping", since = "1.7.0")]
1053 #[must_use = "this returns the result of the operation, \
1054 without modifying the original"]
1056 pub fn saturating_mul(self, rhs: Self) -> Self {
1057 self.checked_mul(rhs).unwrap_or_else(|| {
1058 if (self < 0 && rhs < 0) || (self > 0 && rhs > 0) {
1068 concat!("Saturating integer exponentiation. Computes `self.pow(exp)`,
1069 saturating at the numeric bounds instead of overflowing.
1076 ", $Feature, "use std::", stringify!($SelfT), ";
1078 assert_eq!((-4", stringify!($SelfT), ").saturating_pow(3), -64);
1079 assert_eq!(", stringify!($SelfT), "::MIN.saturating_pow(2), ", stringify!($SelfT), "::MAX);
1080 assert_eq!(", stringify!($SelfT), "::MIN.saturating_pow(3), ", stringify!($SelfT), "::MIN);",
1083 #[stable(feature = "no_panic_pow", since = "1.34.0")]
1084 #[must_use = "this returns the result of the operation, \
1085 without modifying the original"]
1087 pub fn saturating_pow(self, exp: u32) -> Self {
1088 match self.checked_pow(exp) {
1090 None if self < 0 && exp % 2 == 1 => Self::min_value(),
1091 None => Self::max_value(),
1097 concat!("Wrapping (modular) addition. Computes `self + rhs`, wrapping around at the
1098 boundary of the type.
1105 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_add(27), 127);
1106 assert_eq!(", stringify!($SelfT), "::max_value().wrapping_add(2), ", stringify!($SelfT),
1107 "::min_value() + 1);",
1110 #[stable(feature = "rust1", since = "1.0.0")]
1111 #[must_use = "this returns the result of the operation, \
1112 without modifying the original"]
1114 pub const fn wrapping_add(self, rhs: Self) -> Self {
1116 intrinsics::overflowing_add(self, rhs)
1119 #[cfg(not(bootstrap))] {
1120 intrinsics::wrapping_add(self, rhs)
1126 concat!("Wrapping (modular) subtraction. Computes `self - rhs`, wrapping around at the
1127 boundary of the type.
1134 ", $Feature, "assert_eq!(0", stringify!($SelfT), ".wrapping_sub(127), -127);
1135 assert_eq!((-2", stringify!($SelfT), ").wrapping_sub(", stringify!($SelfT), "::max_value()), ",
1136 stringify!($SelfT), "::max_value());",
1139 #[stable(feature = "rust1", since = "1.0.0")]
1140 #[must_use = "this returns the result of the operation, \
1141 without modifying the original"]
1143 pub const fn wrapping_sub(self, rhs: Self) -> Self {
1145 intrinsics::overflowing_sub(self, rhs)
1148 #[cfg(not(bootstrap))] {
1149 intrinsics::wrapping_sub(self, rhs)
1155 concat!("Wrapping (modular) multiplication. Computes `self * rhs`, wrapping around at
1156 the boundary of the type.
1163 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".wrapping_mul(12), 120);
1164 assert_eq!(11i8.wrapping_mul(12), -124);",
1167 #[stable(feature = "rust1", since = "1.0.0")]
1168 #[must_use = "this returns the result of the operation, \
1169 without modifying the original"]
1171 pub const fn wrapping_mul(self, rhs: Self) -> Self {
1173 intrinsics::overflowing_mul(self, rhs)
1176 #[cfg(not(bootstrap))] {
1177 intrinsics::wrapping_mul(self, rhs)
1183 concat!("Wrapping (modular) division. Computes `self / rhs`, wrapping around at the
1184 boundary of the type.
1186 The only case where such wrapping can occur is when one divides `MIN / -1` on a signed type (where
1187 `MIN` is the negative minimal value for the type); this is equivalent to `-MIN`, a positive value
1188 that is too large to represent in the type. In such a case, this function returns `MIN` itself.
1192 This function will panic if `rhs` is 0.
1199 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_div(10), 10);
1200 assert_eq!((-128i8).wrapping_div(-1), -128);",
1203 #[stable(feature = "num_wrapping", since = "1.2.0")]
1204 #[must_use = "this returns the result of the operation, \
1205 without modifying the original"]
1207 pub fn wrapping_div(self, rhs: Self) -> Self {
1208 self.overflowing_div(rhs).0
1213 concat!("Wrapping Euclidean division. Computes `self.div_euclid(rhs)`,
1214 wrapping around at the boundary of the type.
1216 Wrapping will only occur in `MIN / -1` on a signed type (where `MIN` is the negative minimal value
1217 for the type). This is equivalent to `-MIN`, a positive value that is too large to represent in the
1218 type. In this case, this method returns `MIN` itself.
1222 This function will panic if `rhs` is 0.
1229 assert_eq!(100", stringify!($SelfT), ".wrapping_div_euclid(10), 10);
1230 assert_eq!((-128i8).wrapping_div_euclid(-1), -128);
1232 #[stable(feature = "euclidean_division", since = "1.38.0")]
1233 #[must_use = "this returns the result of the operation, \
1234 without modifying the original"]
1236 pub fn wrapping_div_euclid(self, rhs: Self) -> Self {
1237 self.overflowing_div_euclid(rhs).0
1242 concat!("Wrapping (modular) remainder. Computes `self % rhs`, wrapping around at the
1243 boundary of the type.
1245 Such wrap-around never actually occurs mathematically; implementation artifacts make `x % y`
1246 invalid for `MIN / -1` on a signed type (where `MIN` is the negative minimal value). In such a case,
1247 this function returns `0`.
1251 This function will panic if `rhs` is 0.
1258 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_rem(10), 0);
1259 assert_eq!((-128i8).wrapping_rem(-1), 0);",
1262 #[stable(feature = "num_wrapping", since = "1.2.0")]
1263 #[must_use = "this returns the result of the operation, \
1264 without modifying the original"]
1266 pub fn wrapping_rem(self, rhs: Self) -> Self {
1267 self.overflowing_rem(rhs).0
1272 concat!("Wrapping Euclidean remainder. Computes `self.rem_euclid(rhs)`, wrapping around
1273 at the boundary of the type.
1275 Wrapping will only occur in `MIN % -1` on a signed type (where `MIN` is the negative minimal value
1276 for the type). In this case, this method returns 0.
1280 This function will panic if `rhs` is 0.
1287 assert_eq!(100", stringify!($SelfT), ".wrapping_rem_euclid(10), 0);
1288 assert_eq!((-128i8).wrapping_rem_euclid(-1), 0);
1290 #[stable(feature = "euclidean_division", since = "1.38.0")]
1291 #[must_use = "this returns the result of the operation, \
1292 without modifying the original"]
1294 pub fn wrapping_rem_euclid(self, rhs: Self) -> Self {
1295 self.overflowing_rem_euclid(rhs).0
1300 concat!("Wrapping (modular) negation. Computes `-self`, wrapping around at the boundary
1303 The only case where such wrapping can occur is when one negates `MIN` on a signed type (where `MIN`
1304 is the negative minimal value for the type); this is a positive value that is too large to represent
1305 in the type. In such a case, this function returns `MIN` itself.
1312 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_neg(), -100);
1313 assert_eq!(", stringify!($SelfT), "::min_value().wrapping_neg(), ", stringify!($SelfT),
1317 #[stable(feature = "num_wrapping", since = "1.2.0")]
1319 pub const fn wrapping_neg(self) -> Self {
1320 self.overflowing_neg().0
1325 concat!("Panic-free bitwise shift-left; yields `self << mask(rhs)`, where `mask` removes
1326 any high-order bits of `rhs` that would cause the shift to exceed the bitwidth of the type.
1328 Note that this is *not* the same as a rotate-left; the RHS of a wrapping shift-left is restricted to
1329 the range of the type, rather than the bits shifted out of the LHS being returned to the other end.
1330 The primitive integer types all implement a `rotate_left` function, which may be what you want
1338 ", $Feature, "assert_eq!((-1", stringify!($SelfT), ").wrapping_shl(7), -128);
1339 assert_eq!((-1", stringify!($SelfT), ").wrapping_shl(128), -1);",
1342 #[stable(feature = "num_wrapping", since = "1.2.0")]
1343 #[must_use = "this returns the result of the operation, \
1344 without modifying the original"]
1346 pub const fn wrapping_shl(self, rhs: u32) -> Self {
1348 intrinsics::unchecked_shl(self, (rhs & ($BITS - 1)) as $SelfT)
1354 concat!("Panic-free bitwise shift-right; yields `self >> mask(rhs)`, where `mask`
1355 removes any high-order bits of `rhs` that would cause the shift to exceed the bitwidth of the type.
1357 Note that this is *not* the same as a rotate-right; the RHS of a wrapping shift-right is restricted
1358 to the range of the type, rather than the bits shifted out of the LHS being returned to the other
1359 end. The primitive integer types all implement a `rotate_right` function, which may be what you want
1367 ", $Feature, "assert_eq!((-128", stringify!($SelfT), ").wrapping_shr(7), -1);
1368 assert_eq!((-128i16).wrapping_shr(64), -128);",
1371 #[stable(feature = "num_wrapping", since = "1.2.0")]
1372 #[must_use = "this returns the result of the operation, \
1373 without modifying the original"]
1375 pub const fn wrapping_shr(self, rhs: u32) -> Self {
1377 intrinsics::unchecked_shr(self, (rhs & ($BITS - 1)) as $SelfT)
1383 concat!("Wrapping (modular) absolute value. Computes `self.abs()`, wrapping around at
1384 the boundary of the type.
1386 The only case where such wrapping can occur is when one takes the absolute value of the negative
1387 minimal value for the type this is a positive value that is too large to represent in the type. In
1388 such a case, this function returns `MIN` itself.
1395 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_abs(), 100);
1396 assert_eq!((-100", stringify!($SelfT), ").wrapping_abs(), 100);
1397 assert_eq!(", stringify!($SelfT), "::min_value().wrapping_abs(), ", stringify!($SelfT),
1399 assert_eq!((-128i8).wrapping_abs() as u8, 128);",
1402 #[stable(feature = "no_panic_abs", since = "1.13.0")]
1404 pub const fn wrapping_abs(self) -> Self {
1405 (self ^ (self >> ($BITS - 1))).wrapping_sub(self >> ($BITS - 1))
1410 concat!("Wrapping (modular) exponentiation. Computes `self.pow(exp)`,
1411 wrapping around at the boundary of the type.
1418 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".wrapping_pow(4), 81);
1419 assert_eq!(3i8.wrapping_pow(5), -13);
1420 assert_eq!(3i8.wrapping_pow(6), -39);",
1423 #[stable(feature = "no_panic_pow", since = "1.34.0")]
1424 #[must_use = "this returns the result of the operation, \
1425 without modifying the original"]
1427 pub fn wrapping_pow(self, mut exp: u32) -> Self {
1428 let mut base = self;
1429 let mut acc: Self = 1;
1433 acc = acc.wrapping_mul(base);
1436 base = base.wrapping_mul(base);
1439 // Deal with the final bit of the exponent separately, since
1440 // squaring the base afterwards is not necessary and may cause a
1441 // needless overflow.
1443 acc = acc.wrapping_mul(base);
1451 concat!("Calculates `self` + `rhs`
1453 Returns a tuple of the addition along with a boolean indicating whether an arithmetic overflow would
1454 occur. If an overflow would have occurred then the wrapped value is returned.
1461 ", $Feature, "use std::", stringify!($SelfT), ";
1463 assert_eq!(5", stringify!($SelfT), ".overflowing_add(2), (7, false));
1464 assert_eq!(", stringify!($SelfT), "::MAX.overflowing_add(1), (", stringify!($SelfT),
1465 "::MIN, true));", $EndFeature, "
1467 #[stable(feature = "wrapping", since = "1.7.0")]
1468 #[must_use = "this returns the result of the operation, \
1469 without modifying the original"]
1471 pub const fn overflowing_add(self, rhs: Self) -> (Self, bool) {
1472 let (a, b) = intrinsics::add_with_overflow(self as $ActualT, rhs as $ActualT);
1478 concat!("Calculates `self` - `rhs`
1480 Returns a tuple of the subtraction along with a boolean indicating whether an arithmetic overflow
1481 would occur. If an overflow would have occurred then the wrapped value is returned.
1488 ", $Feature, "use std::", stringify!($SelfT), ";
1490 assert_eq!(5", stringify!($SelfT), ".overflowing_sub(2), (3, false));
1491 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_sub(1), (", stringify!($SelfT),
1492 "::MAX, true));", $EndFeature, "
1494 #[stable(feature = "wrapping", since = "1.7.0")]
1495 #[must_use = "this returns the result of the operation, \
1496 without modifying the original"]
1498 pub const fn overflowing_sub(self, rhs: Self) -> (Self, bool) {
1499 let (a, b) = intrinsics::sub_with_overflow(self as $ActualT, rhs as $ActualT);
1505 concat!("Calculates the multiplication of `self` and `rhs`.
1507 Returns a tuple of the multiplication along with a boolean indicating whether an arithmetic overflow
1508 would occur. If an overflow would have occurred then the wrapped value is returned.
1515 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".overflowing_mul(2), (10, false));
1516 assert_eq!(1_000_000_000i32.overflowing_mul(10), (1410065408, true));",
1519 #[stable(feature = "wrapping", since = "1.7.0")]
1520 #[must_use = "this returns the result of the operation, \
1521 without modifying the original"]
1523 pub const fn overflowing_mul(self, rhs: Self) -> (Self, bool) {
1524 let (a, b) = intrinsics::mul_with_overflow(self as $ActualT, rhs as $ActualT);
1530 concat!("Calculates the divisor when `self` is divided by `rhs`.
1532 Returns a tuple of the divisor along with a boolean indicating whether an arithmetic overflow would
1533 occur. If an overflow would occur then self is returned.
1537 This function will panic if `rhs` is 0.
1544 ", $Feature, "use std::", stringify!($SelfT), ";
1546 assert_eq!(5", stringify!($SelfT), ".overflowing_div(2), (2, false));
1547 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_div(-1), (", stringify!($SelfT),
1552 #[stable(feature = "wrapping", since = "1.7.0")]
1553 #[must_use = "this returns the result of the operation, \
1554 without modifying the original"]
1555 pub fn overflowing_div(self, rhs: Self) -> (Self, bool) {
1556 if self == Self::min_value() && rhs == -1 {
1565 concat!("Calculates the quotient of Euclidean division `self.div_euclid(rhs)`.
1567 Returns a tuple of the divisor along with a boolean indicating whether an arithmetic overflow would
1568 occur. If an overflow would occur then `self` is returned.
1572 This function will panic if `rhs` is 0.
1579 use std::", stringify!($SelfT), ";
1581 assert_eq!(5", stringify!($SelfT), ".overflowing_div_euclid(2), (2, false));
1582 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_div_euclid(-1), (", stringify!($SelfT),
1586 #[stable(feature = "euclidean_division", since = "1.38.0")]
1587 #[must_use = "this returns the result of the operation, \
1588 without modifying the original"]
1589 pub fn overflowing_div_euclid(self, rhs: Self) -> (Self, bool) {
1590 if self == Self::min_value() && rhs == -1 {
1593 (self.div_euclid(rhs), false)
1599 concat!("Calculates the remainder when `self` is divided by `rhs`.
1601 Returns a tuple of the remainder after dividing along with a boolean indicating whether an
1602 arithmetic overflow would occur. If an overflow would occur then 0 is returned.
1606 This function will panic if `rhs` is 0.
1613 ", $Feature, "use std::", stringify!($SelfT), ";
1615 assert_eq!(5", stringify!($SelfT), ".overflowing_rem(2), (1, false));
1616 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_rem(-1), (0, true));",
1620 #[stable(feature = "wrapping", since = "1.7.0")]
1621 #[must_use = "this returns the result of the operation, \
1622 without modifying the original"]
1623 pub fn overflowing_rem(self, rhs: Self) -> (Self, bool) {
1624 if self == Self::min_value() && rhs == -1 {
1634 concat!("Overflowing Euclidean remainder. Calculates `self.rem_euclid(rhs)`.
1636 Returns a tuple of the remainder after dividing along with a boolean indicating whether an
1637 arithmetic overflow would occur. If an overflow would occur then 0 is returned.
1641 This function will panic if `rhs` is 0.
1648 use std::", stringify!($SelfT), ";
1650 assert_eq!(5", stringify!($SelfT), ".overflowing_rem_euclid(2), (1, false));
1651 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_rem_euclid(-1), (0, true));
1653 #[stable(feature = "euclidean_division", since = "1.38.0")]
1654 #[must_use = "this returns the result of the operation, \
1655 without modifying the original"]
1657 pub fn overflowing_rem_euclid(self, rhs: Self) -> (Self, bool) {
1658 if self == Self::min_value() && rhs == -1 {
1661 (self.rem_euclid(rhs), false)
1668 concat!("Negates self, overflowing if this is equal to the minimum value.
1670 Returns a tuple of the negated version of self along with a boolean indicating whether an overflow
1671 happened. If `self` is the minimum value (e.g., `i32::MIN` for values of type `i32`), then the
1672 minimum value will be returned again and `true` will be returned for an overflow happening.
1679 ", $Feature, "use std::", stringify!($SelfT), ";
1681 assert_eq!(2", stringify!($SelfT), ".overflowing_neg(), (-2, false));
1682 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_neg(), (", stringify!($SelfT),
1683 "::MIN, true));", $EndFeature, "
1686 #[stable(feature = "wrapping", since = "1.7.0")]
1687 pub const fn overflowing_neg(self) -> (Self, bool) {
1688 ((!self).wrapping_add(1), self == Self::min_value())
1693 concat!("Shifts self left by `rhs` bits.
1695 Returns a tuple of the shifted version of self along with a boolean indicating whether the shift
1696 value was larger than or equal to the number of bits. If the shift value is too large, then value is
1697 masked (N-1) where N is the number of bits, and this value is then used to perform the shift.
1704 ", $Feature, "assert_eq!(0x1", stringify!($SelfT),".overflowing_shl(4), (0x10, false));
1705 assert_eq!(0x1i32.overflowing_shl(36), (0x10, true));",
1708 #[stable(feature = "wrapping", since = "1.7.0")]
1709 #[must_use = "this returns the result of the operation, \
1710 without modifying the original"]
1712 pub const fn overflowing_shl(self, rhs: u32) -> (Self, bool) {
1713 (self.wrapping_shl(rhs), (rhs > ($BITS - 1)))
1718 concat!("Shifts self right by `rhs` bits.
1720 Returns a tuple of the shifted version of self along with a boolean indicating whether the shift
1721 value was larger than or equal to the number of bits. If the shift value is too large, then value is
1722 masked (N-1) where N is the number of bits, and this value is then used to perform the shift.
1729 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".overflowing_shr(4), (0x1, false));
1730 assert_eq!(0x10i32.overflowing_shr(36), (0x1, true));",
1733 #[stable(feature = "wrapping", since = "1.7.0")]
1734 #[must_use = "this returns the result of the operation, \
1735 without modifying the original"]
1737 pub const fn overflowing_shr(self, rhs: u32) -> (Self, bool) {
1738 (self.wrapping_shr(rhs), (rhs > ($BITS - 1)))
1743 concat!("Computes the absolute value of `self`.
1745 Returns a tuple of the absolute version of self along with a boolean indicating whether an overflow
1746 happened. If self is the minimum value (e.g., ", stringify!($SelfT), "::MIN for values of type
1747 ", stringify!($SelfT), "), then the minimum value will be returned again and true will be returned
1748 for an overflow happening.
1755 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".overflowing_abs(), (10, false));
1756 assert_eq!((-10", stringify!($SelfT), ").overflowing_abs(), (10, false));
1757 assert_eq!((", stringify!($SelfT), "::min_value()).overflowing_abs(), (", stringify!($SelfT),
1758 "::min_value(), true));",
1761 #[stable(feature = "no_panic_abs", since = "1.13.0")]
1763 pub const fn overflowing_abs(self) -> (Self, bool) {
1764 (self ^ (self >> ($BITS - 1))).overflowing_sub(self >> ($BITS - 1))
1769 concat!("Raises self to the power of `exp`, using exponentiation by squaring.
1771 Returns a tuple of the exponentiation along with a bool indicating
1772 whether an overflow happened.
1779 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".overflowing_pow(4), (81, false));
1780 assert_eq!(3i8.overflowing_pow(5), (-13, true));",
1783 #[stable(feature = "no_panic_pow", since = "1.34.0")]
1784 #[must_use = "this returns the result of the operation, \
1785 without modifying the original"]
1787 pub fn overflowing_pow(self, mut exp: u32) -> (Self, bool) {
1788 let mut base = self;
1789 let mut acc: Self = 1;
1790 let mut overflown = false;
1791 // Scratch space for storing results of overflowing_mul.
1796 r = acc.overflowing_mul(base);
1801 r = base.overflowing_mul(base);
1806 // Deal with the final bit of the exponent separately, since
1807 // squaring the base afterwards is not necessary and may cause a
1808 // needless overflow.
1810 r = acc.overflowing_mul(base);
1820 concat!("Raises self to the power of `exp`, using exponentiation by squaring.
1827 ", $Feature, "let x: ", stringify!($SelfT), " = 2; // or any other integer type
1829 assert_eq!(x.pow(5), 32);",
1832 #[stable(feature = "rust1", since = "1.0.0")]
1833 #[must_use = "this returns the result of the operation, \
1834 without modifying the original"]
1836 #[rustc_inherit_overflow_checks]
1837 pub fn pow(self, mut exp: u32) -> Self {
1838 let mut base = self;
1849 // Deal with the final bit of the exponent separately, since
1850 // squaring the base afterwards is not necessary and may cause a
1851 // needless overflow.
1861 concat!("Calculates the quotient of Euclidean division of `self` by `rhs`.
1863 This computes the integer `n` such that `self = n * rhs + self.rem_euclid(rhs)`,
1864 with `0 <= self.rem_euclid(rhs) < rhs`.
1866 In other words, the result is `self / rhs` rounded to the integer `n`
1867 such that `self >= n * rhs`.
1868 If `self > 0`, this is equal to round towards zero (the default in Rust);
1869 if `self < 0`, this is equal to round towards +/- infinity.
1873 This function will panic if `rhs` is 0.
1880 let a: ", stringify!($SelfT), " = 7; // or any other integer type
1883 assert_eq!(a.div_euclid(b), 1); // 7 >= 4 * 1
1884 assert_eq!(a.div_euclid(-b), -1); // 7 >= -4 * -1
1885 assert_eq!((-a).div_euclid(b), -2); // -7 >= 4 * -2
1886 assert_eq!((-a).div_euclid(-b), 2); // -7 >= -4 * 2
1888 #[stable(feature = "euclidean_division", since = "1.38.0")]
1889 #[must_use = "this returns the result of the operation, \
1890 without modifying the original"]
1892 #[rustc_inherit_overflow_checks]
1893 pub fn div_euclid(self, rhs: Self) -> Self {
1896 return if rhs > 0 { q - 1 } else { q + 1 }
1904 concat!("Calculates the least nonnegative remainder of `self (mod rhs)`.
1906 This is done as if by the Euclidean division algorithm -- given
1907 `r = self.rem_euclid(rhs)`, `self = rhs * self.div_euclid(rhs) + r`, and
1908 `0 <= r < abs(rhs)`.
1912 This function will panic if `rhs` is 0.
1919 let a: ", stringify!($SelfT), " = 7; // or any other integer type
1922 assert_eq!(a.rem_euclid(b), 3);
1923 assert_eq!((-a).rem_euclid(b), 1);
1924 assert_eq!(a.rem_euclid(-b), 3);
1925 assert_eq!((-a).rem_euclid(-b), 1);
1927 #[stable(feature = "euclidean_division", since = "1.38.0")]
1928 #[must_use = "this returns the result of the operation, \
1929 without modifying the original"]
1931 #[rustc_inherit_overflow_checks]
1932 pub fn rem_euclid(self, rhs: Self) -> Self {
1947 concat!("Computes the absolute value of `self`.
1951 The absolute value of `", stringify!($SelfT), "::min_value()` cannot be represented as an
1952 `", stringify!($SelfT), "`, and attempting to calculate it will cause an overflow. This means that
1953 code in debug mode will trigger a panic on this case and optimized code will return `",
1954 stringify!($SelfT), "::min_value()` without a panic.
1961 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".abs(), 10);
1962 assert_eq!((-10", stringify!($SelfT), ").abs(), 10);",
1965 #[stable(feature = "rust1", since = "1.0.0")]
1967 #[rustc_inherit_overflow_checks]
1968 pub const fn abs(self) -> Self {
1969 // Note that the #[inline] above means that the overflow
1970 // semantics of the subtraction depend on the crate we're being
1972 (self ^ (self >> ($BITS - 1))) - (self >> ($BITS - 1))
1977 concat!("Returns a number representing sign of `self`.
1979 - `0` if the number is zero
1980 - `1` if the number is positive
1981 - `-1` if the number is negative
1988 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".signum(), 1);
1989 assert_eq!(0", stringify!($SelfT), ".signum(), 0);
1990 assert_eq!((-10", stringify!($SelfT), ").signum(), -1);",
1993 #[stable(feature = "rust1", since = "1.0.0")]
1994 #[rustc_const_unstable(feature = "const_int_sign")]
1996 pub const fn signum(self) -> Self {
1997 (self > 0) as Self - (self < 0) as Self
2002 concat!("Returns `true` if `self` is positive and `false` if the number is zero or
2010 ", $Feature, "assert!(10", stringify!($SelfT), ".is_positive());
2011 assert!(!(-10", stringify!($SelfT), ").is_positive());",
2014 #[stable(feature = "rust1", since = "1.0.0")]
2016 pub const fn is_positive(self) -> bool { self > 0 }
2020 concat!("Returns `true` if `self` is negative and `false` if the number is zero or
2028 ", $Feature, "assert!((-10", stringify!($SelfT), ").is_negative());
2029 assert!(!10", stringify!($SelfT), ".is_negative());",
2032 #[stable(feature = "rust1", since = "1.0.0")]
2034 pub const fn is_negative(self) -> bool { self < 0 }
2038 concat!("Return the memory representation of this integer as a byte array in
2039 big-endian (network) byte order.
2046 let bytes = ", $swap_op, stringify!($SelfT), ".to_be_bytes();
2047 assert_eq!(bytes, ", $be_bytes, ");
2049 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2050 #[rustc_const_unstable(feature = "const_int_conversion")]
2052 pub const fn to_be_bytes(self) -> [u8; mem::size_of::<Self>()] {
2053 self.to_be().to_ne_bytes()
2058 concat!("Return the memory representation of this integer as a byte array in
2059 little-endian byte order.
2066 let bytes = ", $swap_op, stringify!($SelfT), ".to_le_bytes();
2067 assert_eq!(bytes, ", $le_bytes, ");
2069 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2070 #[rustc_const_unstable(feature = "const_int_conversion")]
2072 pub const fn to_le_bytes(self) -> [u8; mem::size_of::<Self>()] {
2073 self.to_le().to_ne_bytes()
2079 Return the memory representation of this integer as a byte array in
2082 As the target platform's native endianness is used, portable code
2083 should use [`to_be_bytes`] or [`to_le_bytes`], as appropriate,
2088 [`to_be_bytes`]: #method.to_be_bytes
2089 [`to_le_bytes`]: #method.to_le_bytes
2094 let bytes = ", $swap_op, stringify!($SelfT), ".to_ne_bytes();
2097 if cfg!(target_endian = \"big\") {
2104 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2105 #[rustc_const_unstable(feature = "const_int_conversion")]
2107 pub const fn to_ne_bytes(self) -> [u8; mem::size_of::<Self>()] {
2108 unsafe { mem::transmute(self) }
2113 concat!("Create an integer value from its representation as a byte array in
2121 let value = ", stringify!($SelfT), "::from_be_bytes(", $be_bytes, ");
2122 assert_eq!(value, ", $swap_op, ");
2125 When starting from a slice rather than an array, fallible conversion APIs can be used:
2128 use std::convert::TryInto;
2130 fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
2131 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
2133 ", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
2136 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2137 #[rustc_const_unstable(feature = "const_int_conversion")]
2139 pub const fn from_be_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
2140 Self::from_be(Self::from_ne_bytes(bytes))
2146 Create an integer value from its representation as a byte array in
2154 let value = ", stringify!($SelfT), "::from_le_bytes(", $le_bytes, ");
2155 assert_eq!(value, ", $swap_op, ");
2158 When starting from a slice rather than an array, fallible conversion APIs can be used:
2161 use std::convert::TryInto;
2163 fn read_le_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
2164 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
2166 ", stringify!($SelfT), "::from_le_bytes(int_bytes.try_into().unwrap())
2169 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2170 #[rustc_const_unstable(feature = "const_int_conversion")]
2172 pub const fn from_le_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
2173 Self::from_le(Self::from_ne_bytes(bytes))
2178 concat!("Create an integer value from its memory representation as a byte
2179 array in native endianness.
2181 As the target platform's native endianness is used, portable code
2182 likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as
2183 appropriate instead.
2185 [`from_be_bytes`]: #method.from_be_bytes
2186 [`from_le_bytes`]: #method.from_le_bytes
2193 let value = ", stringify!($SelfT), "::from_ne_bytes(if cfg!(target_endian = \"big\") {
2198 assert_eq!(value, ", $swap_op, ");
2201 When starting from a slice rather than an array, fallible conversion APIs can be used:
2204 use std::convert::TryInto;
2206 fn read_ne_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
2207 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
2209 ", stringify!($SelfT), "::from_ne_bytes(int_bytes.try_into().unwrap())
2212 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2213 #[rustc_const_unstable(feature = "const_int_conversion")]
2215 pub const fn from_ne_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
2216 unsafe { mem::transmute(bytes) }
2224 int_impl! { i8, i8, u8, 8, -128, 127, "", "", 2, "-0x7e", "0xa", "0x12", "0x12", "0x48",
2225 "[0x12]", "[0x12]", "", "" }
2230 int_impl! { i16, i16, u16, 16, -32768, 32767, "", "", 4, "-0x5ffd", "0x3a", "0x1234", "0x3412",
2231 "0x2c48", "[0x34, 0x12]", "[0x12, 0x34]", "", "" }
2236 int_impl! { i32, i32, u32, 32, -2147483648, 2147483647, "", "", 8, "0x10000b3", "0xb301",
2237 "0x12345678", "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]",
2238 "[0x12, 0x34, 0x56, 0x78]", "", "" }
2243 int_impl! { i64, i64, u64, 64, -9223372036854775808, 9223372036854775807, "", "", 12,
2244 "0xaa00000000006e1", "0x6e10aa", "0x1234567890123456", "0x5634129078563412",
2245 "0x6a2c48091e6a2c48", "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
2246 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]", "", "" }
2251 int_impl! { i128, i128, u128, 128, -170141183460469231731687303715884105728,
2252 170141183460469231731687303715884105727, "", "", 16,
2253 "0x13f40000000000000000000000004f76", "0x4f7613f4", "0x12345678901234567890123456789012",
2254 "0x12907856341290785634129078563412", "0x48091e6a2c48091e6a2c48091e6a2c48",
2255 "[0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, \
2256 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
2257 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, \
2258 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12]", "", "" }
2261 #[cfg(target_pointer_width = "16")]
2264 int_impl! { isize, i16, u16, 16, -32768, 32767, "", "", 4, "-0x5ffd", "0x3a", "0x1234",
2265 "0x3412", "0x2c48", "[0x34, 0x12]", "[0x12, 0x34]",
2266 usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
2269 #[cfg(target_pointer_width = "32")]
2272 int_impl! { isize, i32, u32, 32, -2147483648, 2147483647, "", "", 8, "0x10000b3", "0xb301",
2273 "0x12345678", "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]",
2274 "[0x12, 0x34, 0x56, 0x78]",
2275 usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
2278 #[cfg(target_pointer_width = "64")]
2281 int_impl! { isize, i64, u64, 64, -9223372036854775808, 9223372036854775807, "", "",
2282 12, "0xaa00000000006e1", "0x6e10aa", "0x1234567890123456", "0x5634129078563412",
2283 "0x6a2c48091e6a2c48", "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
2284 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]",
2285 usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
2288 // `Int` + `UnsignedInt` implemented for unsigned integers
2289 macro_rules! uint_impl {
2290 ($SelfT:ty, $ActualT:ty, $BITS:expr, $MaxV:expr, $Feature:expr, $EndFeature:expr,
2291 $rot:expr, $rot_op:expr, $rot_result:expr, $swap_op:expr, $swapped:expr,
2292 $reversed:expr, $le_bytes:expr, $be_bytes:expr,
2293 $to_xe_bytes_doc:expr, $from_xe_bytes_doc:expr) => {
2295 concat!("Returns the smallest value that can be represented by this integer type.
2302 ", $Feature, "assert_eq!(", stringify!($SelfT), "::min_value(), 0);", $EndFeature, "
2304 #[stable(feature = "rust1", since = "1.0.0")]
2307 pub const fn min_value() -> Self { 0 }
2311 concat!("Returns the largest value that can be represented by this integer type.
2318 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value(), ",
2319 stringify!($MaxV), ");", $EndFeature, "
2321 #[stable(feature = "rust1", since = "1.0.0")]
2324 pub const fn max_value() -> Self { !0 }
2328 concat!("Converts a string slice in a given base to an integer.
2330 The string is expected to be an optional `+` sign
2332 Leading and trailing whitespace represent an error.
2333 Digits are a subset of these characters, depending on `radix`:
2341 This function panics if `radix` is not in the range from 2 to 36.
2348 ", $Feature, "assert_eq!(", stringify!($SelfT), "::from_str_radix(\"A\", 16), Ok(10));",
2351 #[stable(feature = "rust1", since = "1.0.0")]
2352 pub fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError> {
2353 from_str_radix(src, radix)
2358 concat!("Returns the number of ones in the binary representation of `self`.
2365 ", $Feature, "let n = 0b01001100", stringify!($SelfT), ";
2367 assert_eq!(n.count_ones(), 3);", $EndFeature, "
2369 #[stable(feature = "rust1", since = "1.0.0")]
2371 pub const fn count_ones(self) -> u32 {
2372 intrinsics::ctpop(self as $ActualT) as u32
2377 concat!("Returns the number of zeros in the binary representation of `self`.
2384 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value().count_zeros(), 0);", $EndFeature, "
2386 #[stable(feature = "rust1", since = "1.0.0")]
2388 pub const fn count_zeros(self) -> u32 {
2389 (!self).count_ones()
2394 concat!("Returns the number of leading zeros in the binary representation of `self`.
2401 ", $Feature, "let n = ", stringify!($SelfT), "::max_value() >> 2;
2403 assert_eq!(n.leading_zeros(), 2);", $EndFeature, "
2405 #[stable(feature = "rust1", since = "1.0.0")]
2407 pub const fn leading_zeros(self) -> u32 {
2408 intrinsics::ctlz(self as $ActualT) as u32
2413 concat!("Returns the number of trailing zeros in the binary representation
2421 ", $Feature, "let n = 0b0101000", stringify!($SelfT), ";
2423 assert_eq!(n.trailing_zeros(), 3);", $EndFeature, "
2425 #[stable(feature = "rust1", since = "1.0.0")]
2427 pub const fn trailing_zeros(self) -> u32 {
2428 intrinsics::cttz(self) as u32
2433 concat!("Shifts the bits to the left by a specified amount, `n`,
2434 wrapping the truncated bits to the end of the resulting integer.
2436 Please note this isn't the same operation as the `<<` shifting operator!
2443 let n = ", $rot_op, stringify!($SelfT), ";
2444 let m = ", $rot_result, ";
2446 assert_eq!(n.rotate_left(", $rot, "), m);
2448 #[stable(feature = "rust1", since = "1.0.0")]
2449 #[must_use = "this returns the result of the operation, \
2450 without modifying the original"]
2452 pub const fn rotate_left(self, n: u32) -> Self {
2453 intrinsics::rotate_left(self, n as $SelfT)
2458 concat!("Shifts the bits to the right by a specified amount, `n`,
2459 wrapping the truncated bits to the beginning of the resulting
2462 Please note this isn't the same operation as the `>>` shifting operator!
2469 let n = ", $rot_result, stringify!($SelfT), ";
2470 let m = ", $rot_op, ";
2472 assert_eq!(n.rotate_right(", $rot, "), m);
2474 #[stable(feature = "rust1", since = "1.0.0")]
2475 #[must_use = "this returns the result of the operation, \
2476 without modifying the original"]
2478 pub const fn rotate_right(self, n: u32) -> Self {
2479 intrinsics::rotate_right(self, n as $SelfT)
2485 Reverses the byte order of the integer.
2492 let n = ", $swap_op, stringify!($SelfT), ";
2493 let m = n.swap_bytes();
2495 assert_eq!(m, ", $swapped, ");
2497 #[stable(feature = "rust1", since = "1.0.0")]
2499 pub const fn swap_bytes(self) -> Self {
2500 intrinsics::bswap(self as $ActualT) as Self
2505 concat!("Reverses the bit pattern of the integer.
2512 let n = ", $swap_op, stringify!($SelfT), ";
2513 let m = n.reverse_bits();
2515 assert_eq!(m, ", $reversed, ");
2517 #[stable(feature = "reverse_bits", since = "1.37.0")]
2520 pub const fn reverse_bits(self) -> Self {
2521 intrinsics::bitreverse(self as $ActualT) as Self
2526 concat!("Converts an integer from big endian to the target's endianness.
2528 On big endian this is a no-op. On little endian the bytes are
2536 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2538 if cfg!(target_endian = \"big\") {
2539 assert_eq!(", stringify!($SelfT), "::from_be(n), n)
2541 assert_eq!(", stringify!($SelfT), "::from_be(n), n.swap_bytes())
2544 #[stable(feature = "rust1", since = "1.0.0")]
2546 pub const fn from_be(x: Self) -> Self {
2547 #[cfg(target_endian = "big")]
2551 #[cfg(not(target_endian = "big"))]
2559 concat!("Converts an integer from little endian to the target's endianness.
2561 On little endian this is a no-op. On big endian the bytes are
2569 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2571 if cfg!(target_endian = \"little\") {
2572 assert_eq!(", stringify!($SelfT), "::from_le(n), n)
2574 assert_eq!(", stringify!($SelfT), "::from_le(n), n.swap_bytes())
2577 #[stable(feature = "rust1", since = "1.0.0")]
2579 pub const fn from_le(x: Self) -> Self {
2580 #[cfg(target_endian = "little")]
2584 #[cfg(not(target_endian = "little"))]
2592 concat!("Converts `self` to big endian from the target's endianness.
2594 On big endian this is a no-op. On little endian the bytes are
2602 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2604 if cfg!(target_endian = \"big\") {
2605 assert_eq!(n.to_be(), n)
2607 assert_eq!(n.to_be(), n.swap_bytes())
2610 #[stable(feature = "rust1", since = "1.0.0")]
2612 pub const fn to_be(self) -> Self { // or not to be?
2613 #[cfg(target_endian = "big")]
2617 #[cfg(not(target_endian = "big"))]
2625 concat!("Converts `self` to little endian from the target's endianness.
2627 On little endian this is a no-op. On big endian the bytes are
2635 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2637 if cfg!(target_endian = \"little\") {
2638 assert_eq!(n.to_le(), n)
2640 assert_eq!(n.to_le(), n.swap_bytes())
2643 #[stable(feature = "rust1", since = "1.0.0")]
2645 pub const fn to_le(self) -> Self {
2646 #[cfg(target_endian = "little")]
2650 #[cfg(not(target_endian = "little"))]
2658 concat!("Checked integer addition. Computes `self + rhs`, returning `None`
2659 if overflow occurred.
2666 ", $Feature, "assert_eq!((", stringify!($SelfT), "::max_value() - 2).checked_add(1), ",
2667 "Some(", stringify!($SelfT), "::max_value() - 1));
2668 assert_eq!((", stringify!($SelfT), "::max_value() - 2).checked_add(3), None);", $EndFeature, "
2670 #[stable(feature = "rust1", since = "1.0.0")]
2671 #[must_use = "this returns the result of the operation, \
2672 without modifying the original"]
2674 pub fn checked_add(self, rhs: Self) -> Option<Self> {
2675 let (a, b) = self.overflowing_add(rhs);
2676 if b {None} else {Some(a)}
2681 concat!("Checked integer subtraction. Computes `self - rhs`, returning
2682 `None` if overflow occurred.
2689 ", $Feature, "assert_eq!(1", stringify!($SelfT), ".checked_sub(1), Some(0));
2690 assert_eq!(0", stringify!($SelfT), ".checked_sub(1), None);", $EndFeature, "
2692 #[stable(feature = "rust1", since = "1.0.0")]
2693 #[must_use = "this returns the result of the operation, \
2694 without modifying the original"]
2696 pub fn checked_sub(self, rhs: Self) -> Option<Self> {
2697 let (a, b) = self.overflowing_sub(rhs);
2698 if b {None} else {Some(a)}
2703 concat!("Checked integer multiplication. Computes `self * rhs`, returning
2704 `None` if overflow occurred.
2711 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".checked_mul(1), Some(5));
2712 assert_eq!(", stringify!($SelfT), "::max_value().checked_mul(2), None);", $EndFeature, "
2714 #[stable(feature = "rust1", since = "1.0.0")]
2715 #[must_use = "this returns the result of the operation, \
2716 without modifying the original"]
2718 pub fn checked_mul(self, rhs: Self) -> Option<Self> {
2719 let (a, b) = self.overflowing_mul(rhs);
2720 if b {None} else {Some(a)}
2725 concat!("Checked integer division. Computes `self / rhs`, returning `None`
2733 ", $Feature, "assert_eq!(128", stringify!($SelfT), ".checked_div(2), Some(64));
2734 assert_eq!(1", stringify!($SelfT), ".checked_div(0), None);", $EndFeature, "
2736 #[stable(feature = "rust1", since = "1.0.0")]
2737 #[must_use = "this returns the result of the operation, \
2738 without modifying the original"]
2740 pub fn checked_div(self, rhs: Self) -> Option<Self> {
2743 rhs => Some(unsafe { intrinsics::unchecked_div(self, rhs) }),
2749 concat!("Checked Euclidean division. Computes `self.div_euclid(rhs)`, returning `None`
2757 assert_eq!(128", stringify!($SelfT), ".checked_div_euclid(2), Some(64));
2758 assert_eq!(1", stringify!($SelfT), ".checked_div_euclid(0), None);
2760 #[stable(feature = "euclidean_division", since = "1.38.0")]
2761 #[must_use = "this returns the result of the operation, \
2762 without modifying the original"]
2764 pub fn checked_div_euclid(self, rhs: Self) -> Option<Self> {
2768 Some(self.div_euclid(rhs))
2775 concat!("Checked integer remainder. Computes `self % rhs`, returning `None`
2783 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".checked_rem(2), Some(1));
2784 assert_eq!(5", stringify!($SelfT), ".checked_rem(0), None);", $EndFeature, "
2786 #[stable(feature = "wrapping", since = "1.7.0")]
2787 #[must_use = "this returns the result of the operation, \
2788 without modifying the original"]
2790 pub fn checked_rem(self, rhs: Self) -> Option<Self> {
2794 Some(unsafe { intrinsics::unchecked_rem(self, rhs) })
2800 concat!("Checked Euclidean modulo. Computes `self.rem_euclid(rhs)`, returning `None`
2808 assert_eq!(5", stringify!($SelfT), ".checked_rem_euclid(2), Some(1));
2809 assert_eq!(5", stringify!($SelfT), ".checked_rem_euclid(0), None);
2811 #[stable(feature = "euclidean_division", since = "1.38.0")]
2812 #[must_use = "this returns the result of the operation, \
2813 without modifying the original"]
2815 pub fn checked_rem_euclid(self, rhs: Self) -> Option<Self> {
2819 Some(self.rem_euclid(rhs))
2825 concat!("Checked negation. Computes `-self`, returning `None` unless `self ==
2828 Note that negating any positive integer will overflow.
2835 ", $Feature, "assert_eq!(0", stringify!($SelfT), ".checked_neg(), Some(0));
2836 assert_eq!(1", stringify!($SelfT), ".checked_neg(), None);", $EndFeature, "
2838 #[stable(feature = "wrapping", since = "1.7.0")]
2840 pub fn checked_neg(self) -> Option<Self> {
2841 let (a, b) = self.overflowing_neg();
2842 if b {None} else {Some(a)}
2847 concat!("Checked shift left. Computes `self << rhs`, returning `None`
2848 if `rhs` is larger than or equal to the number of bits in `self`.
2855 ", $Feature, "assert_eq!(0x1", stringify!($SelfT), ".checked_shl(4), Some(0x10));
2856 assert_eq!(0x10", stringify!($SelfT), ".checked_shl(129), None);", $EndFeature, "
2858 #[stable(feature = "wrapping", since = "1.7.0")]
2859 #[must_use = "this returns the result of the operation, \
2860 without modifying the original"]
2862 pub fn checked_shl(self, rhs: u32) -> Option<Self> {
2863 let (a, b) = self.overflowing_shl(rhs);
2864 if b {None} else {Some(a)}
2869 concat!("Checked shift right. Computes `self >> rhs`, returning `None`
2870 if `rhs` is larger than or equal to the number of bits in `self`.
2877 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".checked_shr(4), Some(0x1));
2878 assert_eq!(0x10", stringify!($SelfT), ".checked_shr(129), None);", $EndFeature, "
2880 #[stable(feature = "wrapping", since = "1.7.0")]
2881 #[must_use = "this returns the result of the operation, \
2882 without modifying the original"]
2884 pub fn checked_shr(self, rhs: u32) -> Option<Self> {
2885 let (a, b) = self.overflowing_shr(rhs);
2886 if b {None} else {Some(a)}
2891 concat!("Checked exponentiation. Computes `self.pow(exp)`, returning `None` if
2899 ", $Feature, "assert_eq!(2", stringify!($SelfT), ".checked_pow(5), Some(32));
2900 assert_eq!(", stringify!($SelfT), "::max_value().checked_pow(2), None);", $EndFeature, "
2902 #[stable(feature = "no_panic_pow", since = "1.34.0")]
2903 #[must_use = "this returns the result of the operation, \
2904 without modifying the original"]
2906 pub fn checked_pow(self, mut exp: u32) -> Option<Self> {
2907 let mut base = self;
2908 let mut acc: Self = 1;
2912 acc = acc.checked_mul(base)?;
2915 base = base.checked_mul(base)?;
2918 // Deal with the final bit of the exponent separately, since
2919 // squaring the base afterwards is not necessary and may cause a
2920 // needless overflow.
2922 acc = acc.checked_mul(base)?;
2930 concat!("Saturating integer addition. Computes `self + rhs`, saturating at
2931 the numeric bounds instead of overflowing.
2938 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_add(1), 101);
2939 assert_eq!(200u8.saturating_add(127), 255);", $EndFeature, "
2942 #[stable(feature = "rust1", since = "1.0.0")]
2943 #[must_use = "this returns the result of the operation, \
2944 without modifying the original"]
2945 #[rustc_const_unstable(feature = "const_saturating_int_methods")]
2947 pub const fn saturating_add(self, rhs: Self) -> Self {
2948 intrinsics::saturating_add(self, rhs)
2953 concat!("Saturating integer subtraction. Computes `self - rhs`, saturating
2954 at the numeric bounds instead of overflowing.
2961 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_sub(27), 73);
2962 assert_eq!(13", stringify!($SelfT), ".saturating_sub(127), 0);", $EndFeature, "
2964 #[stable(feature = "rust1", since = "1.0.0")]
2965 #[must_use = "this returns the result of the operation, \
2966 without modifying the original"]
2967 #[rustc_const_unstable(feature = "const_saturating_int_methods")]
2969 pub const fn saturating_sub(self, rhs: Self) -> Self {
2970 intrinsics::saturating_sub(self, rhs)
2975 concat!("Saturating integer multiplication. Computes `self * rhs`,
2976 saturating at the numeric bounds instead of overflowing.
2983 ", $Feature, "use std::", stringify!($SelfT), ";
2985 assert_eq!(2", stringify!($SelfT), ".saturating_mul(10), 20);
2986 assert_eq!((", stringify!($SelfT), "::MAX).saturating_mul(10), ", stringify!($SelfT),
2987 "::MAX);", $EndFeature, "
2989 #[stable(feature = "wrapping", since = "1.7.0")]
2990 #[must_use = "this returns the result of the operation, \
2991 without modifying the original"]
2993 pub fn saturating_mul(self, rhs: Self) -> Self {
2994 self.checked_mul(rhs).unwrap_or(Self::max_value())
2999 concat!("Saturating integer exponentiation. Computes `self.pow(exp)`,
3000 saturating at the numeric bounds instead of overflowing.
3007 ", $Feature, "use std::", stringify!($SelfT), ";
3009 assert_eq!(4", stringify!($SelfT), ".saturating_pow(3), 64);
3010 assert_eq!(", stringify!($SelfT), "::MAX.saturating_pow(2), ", stringify!($SelfT), "::MAX);",
3013 #[stable(feature = "no_panic_pow", since = "1.34.0")]
3014 #[must_use = "this returns the result of the operation, \
3015 without modifying the original"]
3017 pub fn saturating_pow(self, exp: u32) -> Self {
3018 match self.checked_pow(exp) {
3020 None => Self::max_value(),
3026 concat!("Wrapping (modular) addition. Computes `self + rhs`,
3027 wrapping around at the boundary of the type.
3034 ", $Feature, "assert_eq!(200", stringify!($SelfT), ".wrapping_add(55), 255);
3035 assert_eq!(200", stringify!($SelfT), ".wrapping_add(", stringify!($SelfT), "::max_value()), 199);",
3038 #[stable(feature = "rust1", since = "1.0.0")]
3039 #[must_use = "this returns the result of the operation, \
3040 without modifying the original"]
3042 pub const fn wrapping_add(self, rhs: Self) -> Self {
3044 intrinsics::overflowing_add(self, rhs)
3047 #[cfg(not(bootstrap))] {
3048 intrinsics::wrapping_add(self, rhs)
3054 concat!("Wrapping (modular) subtraction. Computes `self - rhs`,
3055 wrapping around at the boundary of the type.
3062 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_sub(100), 0);
3063 assert_eq!(100", stringify!($SelfT), ".wrapping_sub(", stringify!($SelfT), "::max_value()), 101);",
3066 #[stable(feature = "rust1", since = "1.0.0")]
3067 #[must_use = "this returns the result of the operation, \
3068 without modifying the original"]
3070 pub const fn wrapping_sub(self, rhs: Self) -> Self {
3072 intrinsics::overflowing_sub(self, rhs)
3075 #[cfg(not(bootstrap))] {
3076 intrinsics::wrapping_sub(self, rhs)
3081 /// Wrapping (modular) multiplication. Computes `self *
3082 /// rhs`, wrapping around at the boundary of the type.
3088 /// Please note that this example is shared between integer types.
3089 /// Which explains why `u8` is used here.
3092 /// assert_eq!(10u8.wrapping_mul(12), 120);
3093 /// assert_eq!(25u8.wrapping_mul(12), 44);
3095 #[stable(feature = "rust1", since = "1.0.0")]
3096 #[must_use = "this returns the result of the operation, \
3097 without modifying the original"]
3099 pub const fn wrapping_mul(self, rhs: Self) -> Self {
3101 intrinsics::overflowing_mul(self, rhs)
3104 #[cfg(not(bootstrap))] {
3105 intrinsics::wrapping_mul(self, rhs)
3110 concat!("Wrapping (modular) division. Computes `self / rhs`.
3111 Wrapped division on unsigned types is just normal division.
3112 There's no way wrapping could ever happen.
3113 This function exists, so that all operations
3114 are accounted for in the wrapping operations.
3121 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_div(10), 10);", $EndFeature, "
3123 #[stable(feature = "num_wrapping", since = "1.2.0")]
3124 #[must_use = "this returns the result of the operation, \
3125 without modifying the original"]
3127 pub fn wrapping_div(self, rhs: Self) -> Self {
3133 concat!("Wrapping Euclidean division. Computes `self.div_euclid(rhs)`.
3134 Wrapped division on unsigned types is just normal division.
3135 There's no way wrapping could ever happen.
3136 This function exists, so that all operations
3137 are accounted for in the wrapping operations.
3138 Since, for the positive integers, all common
3139 definitions of division are equal, this
3140 is exactly equal to `self.wrapping_div(rhs)`.
3147 assert_eq!(100", stringify!($SelfT), ".wrapping_div_euclid(10), 10);
3149 #[stable(feature = "euclidean_division", since = "1.38.0")]
3150 #[must_use = "this returns the result of the operation, \
3151 without modifying the original"]
3153 pub fn wrapping_div_euclid(self, rhs: Self) -> Self {
3159 concat!("Wrapping (modular) remainder. Computes `self % rhs`.
3160 Wrapped remainder calculation on unsigned types is
3161 just the regular remainder calculation.
3162 There's no way wrapping could ever happen.
3163 This function exists, so that all operations
3164 are accounted for in the wrapping operations.
3171 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_rem(10), 0);", $EndFeature, "
3173 #[stable(feature = "num_wrapping", since = "1.2.0")]
3174 #[must_use = "this returns the result of the operation, \
3175 without modifying the original"]
3177 pub fn wrapping_rem(self, rhs: Self) -> Self {
3183 concat!("Wrapping Euclidean modulo. Computes `self.rem_euclid(rhs)`.
3184 Wrapped modulo calculation on unsigned types is
3185 just the regular remainder calculation.
3186 There's no way wrapping could ever happen.
3187 This function exists, so that all operations
3188 are accounted for in the wrapping operations.
3189 Since, for the positive integers, all common
3190 definitions of division are equal, this
3191 is exactly equal to `self.wrapping_rem(rhs)`.
3198 assert_eq!(100", stringify!($SelfT), ".wrapping_rem_euclid(10), 0);
3200 #[stable(feature = "euclidean_division", since = "1.38.0")]
3201 #[must_use = "this returns the result of the operation, \
3202 without modifying the original"]
3204 pub fn wrapping_rem_euclid(self, rhs: Self) -> Self {
3209 /// Wrapping (modular) negation. Computes `-self`,
3210 /// wrapping around at the boundary of the type.
3212 /// Since unsigned types do not have negative equivalents
3213 /// all applications of this function will wrap (except for `-0`).
3214 /// For values smaller than the corresponding signed type's maximum
3215 /// the result is the same as casting the corresponding signed value.
3216 /// Any larger values are equivalent to `MAX + 1 - (val - MAX - 1)` where
3217 /// `MAX` is the corresponding signed type's maximum.
3223 /// Please note that this example is shared between integer types.
3224 /// Which explains why `i8` is used here.
3227 /// assert_eq!(100i8.wrapping_neg(), -100);
3228 /// assert_eq!((-128i8).wrapping_neg(), -128);
3230 #[stable(feature = "num_wrapping", since = "1.2.0")]
3232 pub const fn wrapping_neg(self) -> Self {
3233 self.overflowing_neg().0
3237 concat!("Panic-free bitwise shift-left; yields `self << mask(rhs)`,
3238 where `mask` removes any high-order bits of `rhs` that
3239 would cause the shift to exceed the bitwidth of the type.
3241 Note that this is *not* the same as a rotate-left; the
3242 RHS of a wrapping shift-left is restricted to the range
3243 of the type, rather than the bits shifted out of the LHS
3244 being returned to the other end. The primitive integer
3245 types all implement a `rotate_left` function, which may
3246 be what you want instead.
3253 ", $Feature, "assert_eq!(1", stringify!($SelfT), ".wrapping_shl(7), 128);
3254 assert_eq!(1", stringify!($SelfT), ".wrapping_shl(128), 1);", $EndFeature, "
3256 #[stable(feature = "num_wrapping", since = "1.2.0")]
3257 #[must_use = "this returns the result of the operation, \
3258 without modifying the original"]
3260 pub const fn wrapping_shl(self, rhs: u32) -> Self {
3262 intrinsics::unchecked_shl(self, (rhs & ($BITS - 1)) as $SelfT)
3268 concat!("Panic-free bitwise shift-right; yields `self >> mask(rhs)`,
3269 where `mask` removes any high-order bits of `rhs` that
3270 would cause the shift to exceed the bitwidth of the type.
3272 Note that this is *not* the same as a rotate-right; the
3273 RHS of a wrapping shift-right is restricted to the range
3274 of the type, rather than the bits shifted out of the LHS
3275 being returned to the other end. The primitive integer
3276 types all implement a `rotate_right` function, which may
3277 be what you want instead.
3284 ", $Feature, "assert_eq!(128", stringify!($SelfT), ".wrapping_shr(7), 1);
3285 assert_eq!(128", stringify!($SelfT), ".wrapping_shr(128), 128);", $EndFeature, "
3287 #[stable(feature = "num_wrapping", since = "1.2.0")]
3288 #[must_use = "this returns the result of the operation, \
3289 without modifying the original"]
3291 pub const fn wrapping_shr(self, rhs: u32) -> Self {
3293 intrinsics::unchecked_shr(self, (rhs & ($BITS - 1)) as $SelfT)
3299 concat!("Wrapping (modular) exponentiation. Computes `self.pow(exp)`,
3300 wrapping around at the boundary of the type.
3307 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".wrapping_pow(5), 243);
3308 assert_eq!(3u8.wrapping_pow(6), 217);", $EndFeature, "
3310 #[stable(feature = "no_panic_pow", since = "1.34.0")]
3311 #[must_use = "this returns the result of the operation, \
3312 without modifying the original"]
3314 pub fn wrapping_pow(self, mut exp: u32) -> Self {
3315 let mut base = self;
3316 let mut acc: Self = 1;
3320 acc = acc.wrapping_mul(base);
3323 base = base.wrapping_mul(base);
3326 // Deal with the final bit of the exponent separately, since
3327 // squaring the base afterwards is not necessary and may cause a
3328 // needless overflow.
3330 acc = acc.wrapping_mul(base);
3338 concat!("Calculates `self` + `rhs`
3340 Returns a tuple of the addition along with a boolean indicating
3341 whether an arithmetic overflow would occur. If an overflow would
3342 have occurred then the wrapped value is returned.
3349 ", $Feature, "use std::", stringify!($SelfT), ";
3351 assert_eq!(5", stringify!($SelfT), ".overflowing_add(2), (7, false));
3352 assert_eq!(", stringify!($SelfT), "::MAX.overflowing_add(1), (0, true));", $EndFeature, "
3354 #[stable(feature = "wrapping", since = "1.7.0")]
3355 #[must_use = "this returns the result of the operation, \
3356 without modifying the original"]
3358 pub const fn overflowing_add(self, rhs: Self) -> (Self, bool) {
3359 let (a, b) = intrinsics::add_with_overflow(self as $ActualT, rhs as $ActualT);
3365 concat!("Calculates `self` - `rhs`
3367 Returns a tuple of the subtraction along with a boolean indicating
3368 whether an arithmetic overflow would occur. If an overflow would
3369 have occurred then the wrapped value is returned.
3376 ", $Feature, "use std::", stringify!($SelfT), ";
3378 assert_eq!(5", stringify!($SelfT), ".overflowing_sub(2), (3, false));
3379 assert_eq!(0", stringify!($SelfT), ".overflowing_sub(1), (", stringify!($SelfT), "::MAX, true));",
3382 #[stable(feature = "wrapping", since = "1.7.0")]
3383 #[must_use = "this returns the result of the operation, \
3384 without modifying the original"]
3386 pub const fn overflowing_sub(self, rhs: Self) -> (Self, bool) {
3387 let (a, b) = intrinsics::sub_with_overflow(self as $ActualT, rhs as $ActualT);
3392 /// Calculates the multiplication of `self` and `rhs`.
3394 /// Returns a tuple of the multiplication along with a boolean
3395 /// indicating whether an arithmetic overflow would occur. If an
3396 /// overflow would have occurred then the wrapped value is returned.
3402 /// Please note that this example is shared between integer types.
3403 /// Which explains why `u32` is used here.
3406 /// assert_eq!(5u32.overflowing_mul(2), (10, false));
3407 /// assert_eq!(1_000_000_000u32.overflowing_mul(10), (1410065408, true));
3409 #[stable(feature = "wrapping", since = "1.7.0")]
3410 #[must_use = "this returns the result of the operation, \
3411 without modifying the original"]
3413 pub const fn overflowing_mul(self, rhs: Self) -> (Self, bool) {
3414 let (a, b) = intrinsics::mul_with_overflow(self as $ActualT, rhs as $ActualT);
3419 concat!("Calculates the divisor when `self` is divided by `rhs`.
3421 Returns a tuple of the divisor along with a boolean indicating
3422 whether an arithmetic overflow would occur. Note that for unsigned
3423 integers overflow never occurs, so the second value is always
3428 This function will panic if `rhs` is 0.
3435 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".overflowing_div(2), (2, false));", $EndFeature, "
3438 #[stable(feature = "wrapping", since = "1.7.0")]
3439 #[must_use = "this returns the result of the operation, \
3440 without modifying the original"]
3441 pub fn overflowing_div(self, rhs: Self) -> (Self, bool) {
3447 concat!("Calculates the quotient of Euclidean division `self.div_euclid(rhs)`.
3449 Returns a tuple of the divisor along with a boolean indicating
3450 whether an arithmetic overflow would occur. Note that for unsigned
3451 integers overflow never occurs, so the second value is always
3453 Since, for the positive integers, all common
3454 definitions of division are equal, this
3455 is exactly equal to `self.overflowing_div(rhs)`.
3459 This function will panic if `rhs` is 0.
3466 assert_eq!(5", stringify!($SelfT), ".overflowing_div_euclid(2), (2, false));
3469 #[stable(feature = "euclidean_division", since = "1.38.0")]
3470 #[must_use = "this returns the result of the operation, \
3471 without modifying the original"]
3472 pub fn overflowing_div_euclid(self, rhs: Self) -> (Self, bool) {
3478 concat!("Calculates the remainder when `self` is divided by `rhs`.
3480 Returns a tuple of the remainder after dividing along with a boolean
3481 indicating whether an arithmetic overflow would occur. Note that for
3482 unsigned integers overflow never occurs, so the second value is
3487 This function will panic if `rhs` is 0.
3494 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".overflowing_rem(2), (1, false));", $EndFeature, "
3497 #[stable(feature = "wrapping", since = "1.7.0")]
3498 #[must_use = "this returns the result of the operation, \
3499 without modifying the original"]
3500 pub fn overflowing_rem(self, rhs: Self) -> (Self, bool) {
3506 concat!("Calculates the remainder `self.rem_euclid(rhs)` as if by Euclidean division.
3508 Returns a tuple of the modulo after dividing along with a boolean
3509 indicating whether an arithmetic overflow would occur. Note that for
3510 unsigned integers overflow never occurs, so the second value is
3512 Since, for the positive integers, all common
3513 definitions of division are equal, this operation
3514 is exactly equal to `self.overflowing_rem(rhs)`.
3518 This function will panic if `rhs` is 0.
3525 assert_eq!(5", stringify!($SelfT), ".overflowing_rem_euclid(2), (1, false));
3528 #[stable(feature = "euclidean_division", since = "1.38.0")]
3529 #[must_use = "this returns the result of the operation, \
3530 without modifying the original"]
3531 pub fn overflowing_rem_euclid(self, rhs: Self) -> (Self, bool) {
3537 concat!("Negates self in an overflowing fashion.
3539 Returns `!self + 1` using wrapping operations to return the value
3540 that represents the negation of this unsigned value. Note that for
3541 positive unsigned values overflow always occurs, but negating 0 does
3549 ", $Feature, "assert_eq!(0", stringify!($SelfT), ".overflowing_neg(), (0, false));
3550 assert_eq!(2", stringify!($SelfT), ".overflowing_neg(), (-2i32 as ", stringify!($SelfT),
3551 ", true));", $EndFeature, "
3554 #[stable(feature = "wrapping", since = "1.7.0")]
3555 pub const fn overflowing_neg(self) -> (Self, bool) {
3556 ((!self).wrapping_add(1), self != 0)
3561 concat!("Shifts self left by `rhs` bits.
3563 Returns a tuple of the shifted version of self along with a boolean
3564 indicating whether the shift value was larger than or equal to the
3565 number of bits. If the shift value is too large, then value is
3566 masked (N-1) where N is the number of bits, and this value is then
3567 used to perform the shift.
3574 ", $Feature, "assert_eq!(0x1", stringify!($SelfT), ".overflowing_shl(4), (0x10, false));
3575 assert_eq!(0x1", stringify!($SelfT), ".overflowing_shl(132), (0x10, true));", $EndFeature, "
3577 #[stable(feature = "wrapping", since = "1.7.0")]
3578 #[must_use = "this returns the result of the operation, \
3579 without modifying the original"]
3581 pub const fn overflowing_shl(self, rhs: u32) -> (Self, bool) {
3582 (self.wrapping_shl(rhs), (rhs > ($BITS - 1)))
3587 concat!("Shifts self right by `rhs` bits.
3589 Returns a tuple of the shifted version of self along with a boolean
3590 indicating whether the shift value was larger than or equal to the
3591 number of bits. If the shift value is too large, then value is
3592 masked (N-1) where N is the number of bits, and this value is then
3593 used to perform the shift.
3600 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".overflowing_shr(4), (0x1, false));
3601 assert_eq!(0x10", stringify!($SelfT), ".overflowing_shr(132), (0x1, true));", $EndFeature, "
3603 #[stable(feature = "wrapping", since = "1.7.0")]
3604 #[must_use = "this returns the result of the operation, \
3605 without modifying the original"]
3607 pub const fn overflowing_shr(self, rhs: u32) -> (Self, bool) {
3608 (self.wrapping_shr(rhs), (rhs > ($BITS - 1)))
3613 concat!("Raises self to the power of `exp`, using exponentiation by squaring.
3615 Returns a tuple of the exponentiation along with a bool indicating
3616 whether an overflow happened.
3623 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".overflowing_pow(5), (243, false));
3624 assert_eq!(3u8.overflowing_pow(6), (217, true));", $EndFeature, "
3626 #[stable(feature = "no_panic_pow", since = "1.34.0")]
3627 #[must_use = "this returns the result of the operation, \
3628 without modifying the original"]
3630 pub fn overflowing_pow(self, mut exp: u32) -> (Self, bool) {
3631 let mut base = self;
3632 let mut acc: Self = 1;
3633 let mut overflown = false;
3634 // Scratch space for storing results of overflowing_mul.
3639 r = acc.overflowing_mul(base);
3644 r = base.overflowing_mul(base);
3649 // Deal with the final bit of the exponent separately, since
3650 // squaring the base afterwards is not necessary and may cause a
3651 // needless overflow.
3653 r = acc.overflowing_mul(base);
3663 concat!("Raises self to the power of `exp`, using exponentiation by squaring.
3670 ", $Feature, "assert_eq!(2", stringify!($SelfT), ".pow(5), 32);", $EndFeature, "
3672 #[stable(feature = "rust1", since = "1.0.0")]
3673 #[must_use = "this returns the result of the operation, \
3674 without modifying the original"]
3676 #[rustc_inherit_overflow_checks]
3677 pub fn pow(self, mut exp: u32) -> Self {
3678 let mut base = self;
3689 // Deal with the final bit of the exponent separately, since
3690 // squaring the base afterwards is not necessary and may cause a
3691 // needless overflow.
3701 concat!("Performs Euclidean division.
3703 Since, for the positive integers, all common
3704 definitions of division are equal, this
3705 is exactly equal to `self / rhs`.
3712 assert_eq!(7", stringify!($SelfT), ".div_euclid(4), 1); // or any other integer type
3714 #[stable(feature = "euclidean_division", since = "1.38.0")]
3715 #[must_use = "this returns the result of the operation, \
3716 without modifying the original"]
3718 #[rustc_inherit_overflow_checks]
3719 pub fn div_euclid(self, rhs: Self) -> Self {
3726 concat!("Calculates the least remainder of `self (mod rhs)`.
3728 Since, for the positive integers, all common
3729 definitions of division are equal, this
3730 is exactly equal to `self % rhs`.
3737 assert_eq!(7", stringify!($SelfT), ".rem_euclid(4), 3); // or any other integer type
3739 #[stable(feature = "euclidean_division", since = "1.38.0")]
3740 #[must_use = "this returns the result of the operation, \
3741 without modifying the original"]
3743 #[rustc_inherit_overflow_checks]
3744 pub fn rem_euclid(self, rhs: Self) -> Self {
3750 concat!("Returns `true` if and only if `self == 2^k` for some `k`.
3757 ", $Feature, "assert!(16", stringify!($SelfT), ".is_power_of_two());
3758 assert!(!10", stringify!($SelfT), ".is_power_of_two());", $EndFeature, "
3760 #[stable(feature = "rust1", since = "1.0.0")]
3762 pub fn is_power_of_two(self) -> bool {
3763 (self.wrapping_sub(1)) & self == 0 && !(self == 0)
3767 // Returns one less than next power of two.
3768 // (For 8u8 next power of two is 8u8 and for 6u8 it is 8u8)
3770 // 8u8.one_less_than_next_power_of_two() == 7
3771 // 6u8.one_less_than_next_power_of_two() == 7
3773 // This method cannot overflow, as in the `next_power_of_two`
3774 // overflow cases it instead ends up returning the maximum value
3775 // of the type, and can return 0 for 0.
3777 fn one_less_than_next_power_of_two(self) -> Self {
3778 if self <= 1 { return 0; }
3780 // Because `p > 0`, it cannot consist entirely of leading zeros.
3781 // That means the shift is always in-bounds, and some processors
3782 // (such as intel pre-haswell) have more efficient ctlz
3783 // intrinsics when the argument is non-zero.
3785 let z = unsafe { intrinsics::ctlz_nonzero(p) };
3786 <$SelfT>::max_value() >> z
3790 concat!("Returns the smallest power of two greater than or equal to `self`.
3792 When return value overflows (i.e., `self > (1 << (N-1))` for type
3793 `uN`), it panics in debug mode and return value is wrapped to 0 in
3794 release mode (the only situation in which method can return 0).
3801 ", $Feature, "assert_eq!(2", stringify!($SelfT), ".next_power_of_two(), 2);
3802 assert_eq!(3", stringify!($SelfT), ".next_power_of_two(), 4);", $EndFeature, "
3804 #[stable(feature = "rust1", since = "1.0.0")]
3806 pub fn next_power_of_two(self) -> Self {
3807 // Call the trait to get overflow checks
3808 ops::Add::add(self.one_less_than_next_power_of_two(), 1)
3813 concat!("Returns the smallest power of two greater than or equal to `n`. If
3814 the next power of two is greater than the type's maximum value,
3815 `None` is returned, otherwise the power of two is wrapped in `Some`.
3822 ", $Feature, "assert_eq!(2", stringify!($SelfT),
3823 ".checked_next_power_of_two(), Some(2));
3824 assert_eq!(3", stringify!($SelfT), ".checked_next_power_of_two(), Some(4));
3825 assert_eq!(", stringify!($SelfT), "::max_value().checked_next_power_of_two(), None);",
3829 #[stable(feature = "rust1", since = "1.0.0")]
3830 pub fn checked_next_power_of_two(self) -> Option<Self> {
3831 self.one_less_than_next_power_of_two().checked_add(1)
3836 concat!("Returns the smallest power of two greater than or equal to `n`. If
3837 the next power of two is greater than the type's maximum value,
3838 the return value is wrapped to `0`.
3845 #![feature(wrapping_next_power_of_two)]
3847 assert_eq!(2", stringify!($SelfT), ".wrapping_next_power_of_two(), 2);
3848 assert_eq!(3", stringify!($SelfT), ".wrapping_next_power_of_two(), 4);
3849 assert_eq!(", stringify!($SelfT), "::max_value().wrapping_next_power_of_two(), 0);",
3852 #[unstable(feature = "wrapping_next_power_of_two", issue = "32463",
3853 reason = "needs decision on wrapping behaviour")]
3854 pub fn wrapping_next_power_of_two(self) -> Self {
3855 self.one_less_than_next_power_of_two().wrapping_add(1)
3860 concat!("Return the memory representation of this integer as a byte array in
3861 big-endian (network) byte order.
3868 let bytes = ", $swap_op, stringify!($SelfT), ".to_be_bytes();
3869 assert_eq!(bytes, ", $be_bytes, ");
3871 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3872 #[rustc_const_unstable(feature = "const_int_conversion")]
3874 pub const fn to_be_bytes(self) -> [u8; mem::size_of::<Self>()] {
3875 self.to_be().to_ne_bytes()
3880 concat!("Return the memory representation of this integer as a byte array in
3881 little-endian byte order.
3888 let bytes = ", $swap_op, stringify!($SelfT), ".to_le_bytes();
3889 assert_eq!(bytes, ", $le_bytes, ");
3891 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3892 #[rustc_const_unstable(feature = "const_int_conversion")]
3894 pub const fn to_le_bytes(self) -> [u8; mem::size_of::<Self>()] {
3895 self.to_le().to_ne_bytes()
3901 Return the memory representation of this integer as a byte array in
3904 As the target platform's native endianness is used, portable code
3905 should use [`to_be_bytes`] or [`to_le_bytes`], as appropriate,
3910 [`to_be_bytes`]: #method.to_be_bytes
3911 [`to_le_bytes`]: #method.to_le_bytes
3916 let bytes = ", $swap_op, stringify!($SelfT), ".to_ne_bytes();
3919 if cfg!(target_endian = \"big\") {
3926 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3927 #[rustc_const_unstable(feature = "const_int_conversion")]
3929 pub const fn to_ne_bytes(self) -> [u8; mem::size_of::<Self>()] {
3930 unsafe { mem::transmute(self) }
3935 concat!("Create an integer value from its representation as a byte array in
3943 let value = ", stringify!($SelfT), "::from_be_bytes(", $be_bytes, ");
3944 assert_eq!(value, ", $swap_op, ");
3947 When starting from a slice rather than an array, fallible conversion APIs can be used:
3950 use std::convert::TryInto;
3952 fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
3953 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
3955 ", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
3958 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3959 #[rustc_const_unstable(feature = "const_int_conversion")]
3961 pub const fn from_be_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
3962 Self::from_be(Self::from_ne_bytes(bytes))
3968 Create an integer value from its representation as a byte array in
3976 let value = ", stringify!($SelfT), "::from_le_bytes(", $le_bytes, ");
3977 assert_eq!(value, ", $swap_op, ");
3980 When starting from a slice rather than an array, fallible conversion APIs can be used:
3983 use std::convert::TryInto;
3985 fn read_le_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
3986 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
3988 ", stringify!($SelfT), "::from_le_bytes(int_bytes.try_into().unwrap())
3991 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3992 #[rustc_const_unstable(feature = "const_int_conversion")]
3994 pub const fn from_le_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
3995 Self::from_le(Self::from_ne_bytes(bytes))
4000 concat!("Create an integer value from its memory representation as a byte
4001 array in native endianness.
4003 As the target platform's native endianness is used, portable code
4004 likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as
4005 appropriate instead.
4007 [`from_be_bytes`]: #method.from_be_bytes
4008 [`from_le_bytes`]: #method.from_le_bytes
4015 let value = ", stringify!($SelfT), "::from_ne_bytes(if cfg!(target_endian = \"big\") {
4020 assert_eq!(value, ", $swap_op, ");
4023 When starting from a slice rather than an array, fallible conversion APIs can be used:
4026 use std::convert::TryInto;
4028 fn read_ne_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
4029 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
4031 ", stringify!($SelfT), "::from_ne_bytes(int_bytes.try_into().unwrap())
4034 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
4035 #[rustc_const_unstable(feature = "const_int_conversion")]
4037 pub const fn from_ne_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
4038 unsafe { mem::transmute(bytes) }
4046 uint_impl! { u8, u8, 8, 255, "", "", 2, "0x82", "0xa", "0x12", "0x12", "0x48", "[0x12]",
4050 /// Checks if the value is within the ASCII range.
4055 /// let ascii = 97u8;
4056 /// let non_ascii = 150u8;
4058 /// assert!(ascii.is_ascii());
4059 /// assert!(!non_ascii.is_ascii());
4061 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4063 pub fn is_ascii(&self) -> bool {
4067 /// Makes a copy of the value in its ASCII upper case equivalent.
4069 /// ASCII letters 'a' to 'z' are mapped to 'A' to 'Z',
4070 /// but non-ASCII letters are unchanged.
4072 /// To uppercase the value in-place, use [`make_ascii_uppercase`].
4077 /// let lowercase_a = 97u8;
4079 /// assert_eq!(65, lowercase_a.to_ascii_uppercase());
4082 /// [`make_ascii_uppercase`]: #method.make_ascii_uppercase
4083 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4085 pub fn to_ascii_uppercase(&self) -> u8 {
4086 // Unset the fith bit if this is a lowercase letter
4087 *self & !((self.is_ascii_lowercase() as u8) << 5)
4090 /// Makes a copy of the value in its ASCII lower case equivalent.
4092 /// ASCII letters 'A' to 'Z' are mapped to 'a' to 'z',
4093 /// but non-ASCII letters are unchanged.
4095 /// To lowercase the value in-place, use [`make_ascii_lowercase`].
4100 /// let uppercase_a = 65u8;
4102 /// assert_eq!(97, uppercase_a.to_ascii_lowercase());
4105 /// [`make_ascii_lowercase`]: #method.make_ascii_lowercase
4106 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4108 pub fn to_ascii_lowercase(&self) -> u8 {
4109 // Set the fith bit if this is an uppercase letter
4110 *self | ((self.is_ascii_uppercase() as u8) << 5)
4113 /// Checks that two values are an ASCII case-insensitive match.
4115 /// This is equivalent to `to_ascii_lowercase(a) == to_ascii_lowercase(b)`.
4120 /// let lowercase_a = 97u8;
4121 /// let uppercase_a = 65u8;
4123 /// assert!(lowercase_a.eq_ignore_ascii_case(&uppercase_a));
4125 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4127 pub fn eq_ignore_ascii_case(&self, other: &u8) -> bool {
4128 self.to_ascii_lowercase() == other.to_ascii_lowercase()
4131 /// Converts this value to its ASCII upper case equivalent in-place.
4133 /// ASCII letters 'a' to 'z' are mapped to 'A' to 'Z',
4134 /// but non-ASCII letters are unchanged.
4136 /// To return a new uppercased value without modifying the existing one, use
4137 /// [`to_ascii_uppercase`].
4142 /// let mut byte = b'a';
4144 /// byte.make_ascii_uppercase();
4146 /// assert_eq!(b'A', byte);
4149 /// [`to_ascii_uppercase`]: #method.to_ascii_uppercase
4150 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4152 pub fn make_ascii_uppercase(&mut self) {
4153 *self = self.to_ascii_uppercase();
4156 /// Converts this value to its ASCII lower case equivalent in-place.
4158 /// ASCII letters 'A' to 'Z' are mapped to 'a' to 'z',
4159 /// but non-ASCII letters are unchanged.
4161 /// To return a new lowercased value without modifying the existing one, use
4162 /// [`to_ascii_lowercase`].
4167 /// let mut byte = b'A';
4169 /// byte.make_ascii_lowercase();
4171 /// assert_eq!(b'a', byte);
4174 /// [`to_ascii_lowercase`]: #method.to_ascii_lowercase
4175 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4177 pub fn make_ascii_lowercase(&mut self) {
4178 *self = self.to_ascii_lowercase();
4181 /// Checks if the value is an ASCII alphabetic character:
4183 /// - U+0041 'A' ..= U+005A 'Z', or
4184 /// - U+0061 'a' ..= U+007A 'z'.
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_alphabetic());
4200 /// assert!(uppercase_g.is_ascii_alphabetic());
4201 /// assert!(a.is_ascii_alphabetic());
4202 /// assert!(g.is_ascii_alphabetic());
4203 /// assert!(!zero.is_ascii_alphabetic());
4204 /// assert!(!percent.is_ascii_alphabetic());
4205 /// assert!(!space.is_ascii_alphabetic());
4206 /// assert!(!lf.is_ascii_alphabetic());
4207 /// assert!(!esc.is_ascii_alphabetic());
4209 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4211 pub fn is_ascii_alphabetic(&self) -> bool {
4213 b'A'..=b'Z' | b'a'..=b'z' => true,
4218 /// Checks if the value is an ASCII uppercase character:
4219 /// U+0041 'A' ..= U+005A 'Z'.
4224 /// let uppercase_a = b'A';
4225 /// let uppercase_g = b'G';
4228 /// let zero = b'0';
4229 /// let percent = b'%';
4230 /// let space = b' ';
4232 /// let esc = 0x1b_u8;
4234 /// assert!(uppercase_a.is_ascii_uppercase());
4235 /// assert!(uppercase_g.is_ascii_uppercase());
4236 /// assert!(!a.is_ascii_uppercase());
4237 /// assert!(!g.is_ascii_uppercase());
4238 /// assert!(!zero.is_ascii_uppercase());
4239 /// assert!(!percent.is_ascii_uppercase());
4240 /// assert!(!space.is_ascii_uppercase());
4241 /// assert!(!lf.is_ascii_uppercase());
4242 /// assert!(!esc.is_ascii_uppercase());
4244 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4246 pub fn is_ascii_uppercase(&self) -> bool {
4248 b'A'..=b'Z' => true,
4253 /// Checks if the value is an ASCII lowercase character:
4254 /// U+0061 'a' ..= U+007A 'z'.
4259 /// let uppercase_a = b'A';
4260 /// let uppercase_g = b'G';
4263 /// let zero = b'0';
4264 /// let percent = b'%';
4265 /// let space = b' ';
4267 /// let esc = 0x1b_u8;
4269 /// assert!(!uppercase_a.is_ascii_lowercase());
4270 /// assert!(!uppercase_g.is_ascii_lowercase());
4271 /// assert!(a.is_ascii_lowercase());
4272 /// assert!(g.is_ascii_lowercase());
4273 /// assert!(!zero.is_ascii_lowercase());
4274 /// assert!(!percent.is_ascii_lowercase());
4275 /// assert!(!space.is_ascii_lowercase());
4276 /// assert!(!lf.is_ascii_lowercase());
4277 /// assert!(!esc.is_ascii_lowercase());
4279 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4281 pub fn is_ascii_lowercase(&self) -> bool {
4283 b'a'..=b'z' => true,
4288 /// Checks if the value is an ASCII alphanumeric character:
4290 /// - U+0041 'A' ..= U+005A 'Z', or
4291 /// - U+0061 'a' ..= U+007A 'z', or
4292 /// - U+0030 '0' ..= U+0039 '9'.
4297 /// let uppercase_a = b'A';
4298 /// let uppercase_g = b'G';
4301 /// let zero = b'0';
4302 /// let percent = b'%';
4303 /// let space = b' ';
4305 /// let esc = 0x1b_u8;
4307 /// assert!(uppercase_a.is_ascii_alphanumeric());
4308 /// assert!(uppercase_g.is_ascii_alphanumeric());
4309 /// assert!(a.is_ascii_alphanumeric());
4310 /// assert!(g.is_ascii_alphanumeric());
4311 /// assert!(zero.is_ascii_alphanumeric());
4312 /// assert!(!percent.is_ascii_alphanumeric());
4313 /// assert!(!space.is_ascii_alphanumeric());
4314 /// assert!(!lf.is_ascii_alphanumeric());
4315 /// assert!(!esc.is_ascii_alphanumeric());
4317 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4319 pub fn is_ascii_alphanumeric(&self) -> bool {
4321 b'0'..=b'9' | b'A'..=b'Z' | b'a'..=b'z' => true,
4326 /// Checks if the value is an ASCII decimal digit:
4327 /// U+0030 '0' ..= U+0039 '9'.
4332 /// let uppercase_a = b'A';
4333 /// let uppercase_g = b'G';
4336 /// let zero = b'0';
4337 /// let percent = b'%';
4338 /// let space = b' ';
4340 /// let esc = 0x1b_u8;
4342 /// assert!(!uppercase_a.is_ascii_digit());
4343 /// assert!(!uppercase_g.is_ascii_digit());
4344 /// assert!(!a.is_ascii_digit());
4345 /// assert!(!g.is_ascii_digit());
4346 /// assert!(zero.is_ascii_digit());
4347 /// assert!(!percent.is_ascii_digit());
4348 /// assert!(!space.is_ascii_digit());
4349 /// assert!(!lf.is_ascii_digit());
4350 /// assert!(!esc.is_ascii_digit());
4352 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4354 pub fn is_ascii_digit(&self) -> bool {
4356 b'0'..=b'9' => true,
4361 /// Checks if the value is an ASCII hexadecimal digit:
4363 /// - U+0030 '0' ..= U+0039 '9', or
4364 /// - U+0041 'A' ..= U+0046 'F', or
4365 /// - U+0061 'a' ..= U+0066 'f'.
4370 /// let uppercase_a = b'A';
4371 /// let uppercase_g = b'G';
4374 /// let zero = b'0';
4375 /// let percent = b'%';
4376 /// let space = b' ';
4378 /// let esc = 0x1b_u8;
4380 /// assert!(uppercase_a.is_ascii_hexdigit());
4381 /// assert!(!uppercase_g.is_ascii_hexdigit());
4382 /// assert!(a.is_ascii_hexdigit());
4383 /// assert!(!g.is_ascii_hexdigit());
4384 /// assert!(zero.is_ascii_hexdigit());
4385 /// assert!(!percent.is_ascii_hexdigit());
4386 /// assert!(!space.is_ascii_hexdigit());
4387 /// assert!(!lf.is_ascii_hexdigit());
4388 /// assert!(!esc.is_ascii_hexdigit());
4390 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4392 pub fn is_ascii_hexdigit(&self) -> bool {
4394 b'0'..=b'9' | b'A'..=b'F' | b'a'..=b'f' => true,
4399 /// Checks if the value is an ASCII punctuation character:
4401 /// - U+0021 ..= U+002F `! " # $ % & ' ( ) * + , - . /`, or
4402 /// - U+003A ..= U+0040 `: ; < = > ? @`, or
4403 /// - U+005B ..= U+0060 ``[ \ ] ^ _ ` ``, or
4404 /// - U+007B ..= U+007E `{ | } ~`
4409 /// let uppercase_a = b'A';
4410 /// let uppercase_g = b'G';
4413 /// let zero = b'0';
4414 /// let percent = b'%';
4415 /// let space = b' ';
4417 /// let esc = 0x1b_u8;
4419 /// assert!(!uppercase_a.is_ascii_punctuation());
4420 /// assert!(!uppercase_g.is_ascii_punctuation());
4421 /// assert!(!a.is_ascii_punctuation());
4422 /// assert!(!g.is_ascii_punctuation());
4423 /// assert!(!zero.is_ascii_punctuation());
4424 /// assert!(percent.is_ascii_punctuation());
4425 /// assert!(!space.is_ascii_punctuation());
4426 /// assert!(!lf.is_ascii_punctuation());
4427 /// assert!(!esc.is_ascii_punctuation());
4429 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4431 pub fn is_ascii_punctuation(&self) -> bool {
4433 b'!'..=b'/' | b':'..=b'@' | b'['..=b'`' | b'{'..=b'~' => true,
4438 /// Checks if the value is an ASCII graphic character:
4439 /// U+0021 '!' ..= U+007E '~'.
4444 /// let uppercase_a = b'A';
4445 /// let uppercase_g = b'G';
4448 /// let zero = b'0';
4449 /// let percent = b'%';
4450 /// let space = b' ';
4452 /// let esc = 0x1b_u8;
4454 /// assert!(uppercase_a.is_ascii_graphic());
4455 /// assert!(uppercase_g.is_ascii_graphic());
4456 /// assert!(a.is_ascii_graphic());
4457 /// assert!(g.is_ascii_graphic());
4458 /// assert!(zero.is_ascii_graphic());
4459 /// assert!(percent.is_ascii_graphic());
4460 /// assert!(!space.is_ascii_graphic());
4461 /// assert!(!lf.is_ascii_graphic());
4462 /// assert!(!esc.is_ascii_graphic());
4464 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4466 pub fn is_ascii_graphic(&self) -> bool {
4468 b'!'..=b'~' => true,
4473 /// Checks if the value is an ASCII whitespace character:
4474 /// U+0020 SPACE, U+0009 HORIZONTAL TAB, U+000A LINE FEED,
4475 /// U+000C FORM FEED, or U+000D CARRIAGE RETURN.
4477 /// Rust uses the WhatWG Infra Standard's [definition of ASCII
4478 /// whitespace][infra-aw]. There are several other definitions in
4479 /// wide use. For instance, [the POSIX locale][pct] includes
4480 /// U+000B VERTICAL TAB as well as all the above characters,
4481 /// but—from the very same specification—[the default rule for
4482 /// "field splitting" in the Bourne shell][bfs] considers *only*
4483 /// SPACE, HORIZONTAL TAB, and LINE FEED as whitespace.
4485 /// If you are writing a program that will process an existing
4486 /// file format, check what that format's definition of whitespace is
4487 /// before using this function.
4489 /// [infra-aw]: https://infra.spec.whatwg.org/#ascii-whitespace
4490 /// [pct]: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_01
4491 /// [bfs]: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05
4496 /// let uppercase_a = b'A';
4497 /// let uppercase_g = b'G';
4500 /// let zero = b'0';
4501 /// let percent = b'%';
4502 /// let space = b' ';
4504 /// let esc = 0x1b_u8;
4506 /// assert!(!uppercase_a.is_ascii_whitespace());
4507 /// assert!(!uppercase_g.is_ascii_whitespace());
4508 /// assert!(!a.is_ascii_whitespace());
4509 /// assert!(!g.is_ascii_whitespace());
4510 /// assert!(!zero.is_ascii_whitespace());
4511 /// assert!(!percent.is_ascii_whitespace());
4512 /// assert!(space.is_ascii_whitespace());
4513 /// assert!(lf.is_ascii_whitespace());
4514 /// assert!(!esc.is_ascii_whitespace());
4516 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4518 pub fn is_ascii_whitespace(&self) -> bool {
4520 b'\t' | b'\n' | b'\x0C' | b'\r' | b' ' => true,
4525 /// Checks if the value is an ASCII control character:
4526 /// U+0000 NUL ..= U+001F UNIT SEPARATOR, or U+007F DELETE.
4527 /// Note that most ASCII whitespace characters are control
4528 /// characters, but SPACE is not.
4533 /// let uppercase_a = b'A';
4534 /// let uppercase_g = b'G';
4537 /// let zero = b'0';
4538 /// let percent = b'%';
4539 /// let space = b' ';
4541 /// let esc = 0x1b_u8;
4543 /// assert!(!uppercase_a.is_ascii_control());
4544 /// assert!(!uppercase_g.is_ascii_control());
4545 /// assert!(!a.is_ascii_control());
4546 /// assert!(!g.is_ascii_control());
4547 /// assert!(!zero.is_ascii_control());
4548 /// assert!(!percent.is_ascii_control());
4549 /// assert!(!space.is_ascii_control());
4550 /// assert!(lf.is_ascii_control());
4551 /// assert!(esc.is_ascii_control());
4553 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4555 pub fn is_ascii_control(&self) -> bool {
4557 b'\0'..=b'\x1F' | b'\x7F' => true,
4565 uint_impl! { u16, u16, 16, 65535, "", "", 4, "0xa003", "0x3a", "0x1234", "0x3412", "0x2c48",
4566 "[0x34, 0x12]", "[0x12, 0x34]", "", "" }
4571 uint_impl! { u32, u32, 32, 4294967295, "", "", 8, "0x10000b3", "0xb301", "0x12345678",
4572 "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]", "[0x12, 0x34, 0x56, 0x78]", "", "" }
4577 uint_impl! { u64, u64, 64, 18446744073709551615, "", "", 12, "0xaa00000000006e1", "0x6e10aa",
4578 "0x1234567890123456", "0x5634129078563412", "0x6a2c48091e6a2c48",
4579 "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
4580 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]",
4586 uint_impl! { u128, u128, 128, 340282366920938463463374607431768211455, "", "", 16,
4587 "0x13f40000000000000000000000004f76", "0x4f7613f4", "0x12345678901234567890123456789012",
4588 "0x12907856341290785634129078563412", "0x48091e6a2c48091e6a2c48091e6a2c48",
4589 "[0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, \
4590 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
4591 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, \
4592 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12]",
4596 #[cfg(target_pointer_width = "16")]
4599 uint_impl! { usize, u16, 16, 65535, "", "", 4, "0xa003", "0x3a", "0x1234", "0x3412", "0x2c48",
4600 "[0x34, 0x12]", "[0x12, 0x34]",
4601 usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
4603 #[cfg(target_pointer_width = "32")]
4606 uint_impl! { usize, u32, 32, 4294967295, "", "", 8, "0x10000b3", "0xb301", "0x12345678",
4607 "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]", "[0x12, 0x34, 0x56, 0x78]",
4608 usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
4611 #[cfg(target_pointer_width = "64")]
4614 uint_impl! { usize, u64, 64, 18446744073709551615, "", "", 12, "0xaa00000000006e1", "0x6e10aa",
4615 "0x1234567890123456", "0x5634129078563412", "0x6a2c48091e6a2c48",
4616 "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
4617 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]",
4618 usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
4621 /// A classification of floating point numbers.
4623 /// This `enum` is used as the return type for [`f32::classify`] and [`f64::classify`]. See
4624 /// their documentation for more.
4626 /// [`f32::classify`]: ../../std/primitive.f32.html#method.classify
4627 /// [`f64::classify`]: ../../std/primitive.f64.html#method.classify
4632 /// use std::num::FpCategory;
4635 /// let num = 12.4_f32;
4636 /// let inf = f32::INFINITY;
4637 /// let zero = 0f32;
4638 /// let sub: f32 = 1.1754942e-38;
4639 /// let nan = f32::NAN;
4641 /// assert_eq!(num.classify(), FpCategory::Normal);
4642 /// assert_eq!(inf.classify(), FpCategory::Infinite);
4643 /// assert_eq!(zero.classify(), FpCategory::Zero);
4644 /// assert_eq!(nan.classify(), FpCategory::Nan);
4645 /// assert_eq!(sub.classify(), FpCategory::Subnormal);
4647 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
4648 #[stable(feature = "rust1", since = "1.0.0")]
4649 pub enum FpCategory {
4650 /// "Not a Number", often obtained by dividing by zero.
4651 #[stable(feature = "rust1", since = "1.0.0")]
4654 /// Positive or negative infinity.
4655 #[stable(feature = "rust1", since = "1.0.0")]
4658 /// Positive or negative zero.
4659 #[stable(feature = "rust1", since = "1.0.0")]
4662 /// De-normalized floating point representation (less precise than `Normal`).
4663 #[stable(feature = "rust1", since = "1.0.0")]
4666 /// A regular floating point number.
4667 #[stable(feature = "rust1", since = "1.0.0")]
4671 macro_rules! from_str_radix_int_impl {
4673 #[stable(feature = "rust1", since = "1.0.0")]
4674 impl FromStr for $t {
4675 type Err = ParseIntError;
4676 fn from_str(src: &str) -> Result<Self, ParseIntError> {
4677 from_str_radix(src, 10)
4682 from_str_radix_int_impl! { isize i8 i16 i32 i64 i128 usize u8 u16 u32 u64 u128 }
4684 /// The error type returned when a checked integral type conversion fails.
4685 #[stable(feature = "try_from", since = "1.34.0")]
4686 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
4687 pub struct TryFromIntError(());
4689 impl TryFromIntError {
4690 #[unstable(feature = "int_error_internals",
4691 reason = "available through Error trait and this method should \
4692 not be exposed publicly",
4695 pub fn __description(&self) -> &str {
4696 "out of range integral type conversion attempted"
4700 #[stable(feature = "try_from", since = "1.34.0")]
4701 impl fmt::Display for TryFromIntError {
4702 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
4703 self.__description().fmt(fmt)
4707 #[stable(feature = "try_from", since = "1.34.0")]
4708 impl From<Infallible> for TryFromIntError {
4709 fn from(x: Infallible) -> TryFromIntError {
4714 #[unstable(feature = "never_type", issue = "35121")]
4715 impl From<!> for TryFromIntError {
4716 fn from(never: !) -> TryFromIntError {
4717 // Match rather than coerce to make sure that code like
4718 // `From<Infallible> for TryFromIntError` above will keep working
4719 // when `Infallible` becomes an alias to `!`.
4724 // no possible bounds violation
4725 macro_rules! try_from_unbounded {
4726 ($source:ty, $($target:ty),*) => {$(
4727 #[stable(feature = "try_from", since = "1.34.0")]
4728 impl TryFrom<$source> for $target {
4729 type Error = TryFromIntError;
4731 /// Try to create the target number type from a source
4732 /// number type. This returns an error if the source value
4733 /// is outside of the range of the target type.
4735 fn try_from(value: $source) -> Result<Self, Self::Error> {
4736 Ok(value as $target)
4742 // only negative bounds
4743 macro_rules! try_from_lower_bounded {
4744 ($source:ty, $($target:ty),*) => {$(
4745 #[stable(feature = "try_from", since = "1.34.0")]
4746 impl TryFrom<$source> for $target {
4747 type Error = TryFromIntError;
4749 /// Try to create the target number type from a source
4750 /// number type. This returns an error if the source value
4751 /// is outside of the range of the target type.
4753 fn try_from(u: $source) -> Result<$target, TryFromIntError> {
4757 Err(TryFromIntError(()))
4764 // unsigned to signed (only positive bound)
4765 macro_rules! try_from_upper_bounded {
4766 ($source:ty, $($target:ty),*) => {$(
4767 #[stable(feature = "try_from", since = "1.34.0")]
4768 impl TryFrom<$source> for $target {
4769 type Error = TryFromIntError;
4771 /// Try to create the target number type from a source
4772 /// number type. This returns an error if the source value
4773 /// is outside of the range of the target type.
4775 fn try_from(u: $source) -> Result<$target, TryFromIntError> {
4776 if u > (<$target>::max_value() as $source) {
4777 Err(TryFromIntError(()))
4787 macro_rules! try_from_both_bounded {
4788 ($source:ty, $($target:ty),*) => {$(
4789 #[stable(feature = "try_from", since = "1.34.0")]
4790 impl TryFrom<$source> for $target {
4791 type Error = TryFromIntError;
4793 /// Try to create the target number type from a source
4794 /// number type. This returns an error if the source value
4795 /// is outside of the range of the target type.
4797 fn try_from(u: $source) -> Result<$target, TryFromIntError> {
4798 let min = <$target>::min_value() as $source;
4799 let max = <$target>::max_value() as $source;
4800 if u < min || u > max {
4801 Err(TryFromIntError(()))
4811 ($mac:ident, $source:ty, $($target:ty),*) => {$(
4812 $mac!($target, $source);
4816 // intra-sign conversions
4817 try_from_upper_bounded!(u16, u8);
4818 try_from_upper_bounded!(u32, u16, u8);
4819 try_from_upper_bounded!(u64, u32, u16, u8);
4820 try_from_upper_bounded!(u128, u64, u32, u16, u8);
4822 try_from_both_bounded!(i16, i8);
4823 try_from_both_bounded!(i32, i16, i8);
4824 try_from_both_bounded!(i64, i32, i16, i8);
4825 try_from_both_bounded!(i128, i64, i32, i16, i8);
4827 // unsigned-to-signed
4828 try_from_upper_bounded!(u8, i8);
4829 try_from_upper_bounded!(u16, i8, i16);
4830 try_from_upper_bounded!(u32, i8, i16, i32);
4831 try_from_upper_bounded!(u64, i8, i16, i32, i64);
4832 try_from_upper_bounded!(u128, i8, i16, i32, i64, i128);
4834 // signed-to-unsigned
4835 try_from_lower_bounded!(i8, u8, u16, u32, u64, u128);
4836 try_from_lower_bounded!(i16, u16, u32, u64, u128);
4837 try_from_lower_bounded!(i32, u32, u64, u128);
4838 try_from_lower_bounded!(i64, u64, u128);
4839 try_from_lower_bounded!(i128, u128);
4840 try_from_both_bounded!(i16, u8);
4841 try_from_both_bounded!(i32, u16, u8);
4842 try_from_both_bounded!(i64, u32, u16, u8);
4843 try_from_both_bounded!(i128, u64, u32, u16, u8);
4846 try_from_upper_bounded!(usize, isize);
4847 try_from_lower_bounded!(isize, usize);
4849 #[cfg(target_pointer_width = "16")]
4850 mod ptr_try_from_impls {
4851 use super::TryFromIntError;
4852 use crate::convert::TryFrom;
4854 try_from_upper_bounded!(usize, u8);
4855 try_from_unbounded!(usize, u16, u32, u64, u128);
4856 try_from_upper_bounded!(usize, i8, i16);
4857 try_from_unbounded!(usize, i32, i64, i128);
4859 try_from_both_bounded!(isize, u8);
4860 try_from_lower_bounded!(isize, u16, u32, u64, u128);
4861 try_from_both_bounded!(isize, i8);
4862 try_from_unbounded!(isize, i16, i32, i64, i128);
4864 rev!(try_from_upper_bounded, usize, u32, u64, u128);
4865 rev!(try_from_lower_bounded, usize, i8, i16);
4866 rev!(try_from_both_bounded, usize, i32, i64, i128);
4868 rev!(try_from_upper_bounded, isize, u16, u32, u64, u128);
4869 rev!(try_from_both_bounded, isize, i32, i64, i128);
4872 #[cfg(target_pointer_width = "32")]
4873 mod ptr_try_from_impls {
4874 use super::TryFromIntError;
4875 use crate::convert::TryFrom;
4877 try_from_upper_bounded!(usize, u8, u16);
4878 try_from_unbounded!(usize, u32, u64, u128);
4879 try_from_upper_bounded!(usize, i8, i16, i32);
4880 try_from_unbounded!(usize, i64, i128);
4882 try_from_both_bounded!(isize, u8, u16);
4883 try_from_lower_bounded!(isize, u32, u64, u128);
4884 try_from_both_bounded!(isize, i8, i16);
4885 try_from_unbounded!(isize, i32, i64, i128);
4887 rev!(try_from_unbounded, usize, u32);
4888 rev!(try_from_upper_bounded, usize, u64, u128);
4889 rev!(try_from_lower_bounded, usize, i8, i16, i32);
4890 rev!(try_from_both_bounded, usize, i64, i128);
4892 rev!(try_from_unbounded, isize, u16);
4893 rev!(try_from_upper_bounded, isize, u32, u64, u128);
4894 rev!(try_from_unbounded, isize, i32);
4895 rev!(try_from_both_bounded, isize, i64, i128);
4898 #[cfg(target_pointer_width = "64")]
4899 mod ptr_try_from_impls {
4900 use super::TryFromIntError;
4901 use crate::convert::TryFrom;
4903 try_from_upper_bounded!(usize, u8, u16, u32);
4904 try_from_unbounded!(usize, u64, u128);
4905 try_from_upper_bounded!(usize, i8, i16, i32, i64);
4906 try_from_unbounded!(usize, i128);
4908 try_from_both_bounded!(isize, u8, u16, u32);
4909 try_from_lower_bounded!(isize, u64, u128);
4910 try_from_both_bounded!(isize, i8, i16, i32);
4911 try_from_unbounded!(isize, i64, i128);
4913 rev!(try_from_unbounded, usize, u32, u64);
4914 rev!(try_from_upper_bounded, usize, u128);
4915 rev!(try_from_lower_bounded, usize, i8, i16, i32, i64);
4916 rev!(try_from_both_bounded, usize, i128);
4918 rev!(try_from_unbounded, isize, u16, u32);
4919 rev!(try_from_upper_bounded, isize, u64, u128);
4920 rev!(try_from_unbounded, isize, i32, i64);
4921 rev!(try_from_both_bounded, isize, i128);
4925 trait FromStrRadixHelper: PartialOrd + Copy {
4926 fn min_value() -> Self;
4927 fn max_value() -> Self;
4928 fn from_u32(u: u32) -> Self;
4929 fn checked_mul(&self, other: u32) -> Option<Self>;
4930 fn checked_sub(&self, other: u32) -> Option<Self>;
4931 fn checked_add(&self, other: u32) -> Option<Self>;
4935 ($($t:ty)*) => ($(impl FromStrRadixHelper for $t {
4937 fn min_value() -> Self { Self::min_value() }
4939 fn max_value() -> Self { Self::max_value() }
4941 fn from_u32(u: u32) -> Self { u as Self }
4943 fn checked_mul(&self, other: u32) -> Option<Self> {
4944 Self::checked_mul(*self, other as Self)
4947 fn checked_sub(&self, other: u32) -> Option<Self> {
4948 Self::checked_sub(*self, other as Self)
4951 fn checked_add(&self, other: u32) -> Option<Self> {
4952 Self::checked_add(*self, other as Self)
4956 doit! { i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize }
4958 fn from_str_radix<T: FromStrRadixHelper>(src: &str, radix: u32) -> Result<T, ParseIntError> {
4959 use self::IntErrorKind::*;
4960 use self::ParseIntError as PIE;
4962 assert!(radix >= 2 && radix <= 36,
4963 "from_str_radix_int: must lie in the range `[2, 36]` - found {}",
4967 return Err(PIE { kind: Empty });
4970 let is_signed_ty = T::from_u32(0) > T::min_value();
4972 // all valid digits are ascii, so we will just iterate over the utf8 bytes
4973 // and cast them to chars. .to_digit() will safely return None for anything
4974 // other than a valid ascii digit for the given radix, including the first-byte
4975 // of multi-byte sequences
4976 let src = src.as_bytes();
4978 let (is_positive, digits) = match src[0] {
4979 b'+' => (true, &src[1..]),
4980 b'-' if is_signed_ty => (false, &src[1..]),
4984 if digits.is_empty() {
4985 return Err(PIE { kind: Empty });
4988 let mut result = T::from_u32(0);
4990 // The number is positive
4992 let x = match (c as char).to_digit(radix) {
4994 None => return Err(PIE { kind: InvalidDigit }),
4996 result = match result.checked_mul(radix) {
4997 Some(result) => result,
4998 None => return Err(PIE { kind: Overflow }),
5000 result = match result.checked_add(x) {
5001 Some(result) => result,
5002 None => return Err(PIE { kind: Overflow }),
5006 // The number is negative
5008 let x = match (c as char).to_digit(radix) {
5010 None => return Err(PIE { kind: InvalidDigit }),
5012 result = match result.checked_mul(radix) {
5013 Some(result) => result,
5014 None => return Err(PIE { kind: Underflow }),
5016 result = match result.checked_sub(x) {
5017 Some(result) => result,
5018 None => return Err(PIE { kind: Underflow }),
5025 /// An error which can be returned when parsing an integer.
5027 /// This error is used as the error type for the `from_str_radix()` functions
5028 /// on the primitive integer types, such as [`i8::from_str_radix`].
5030 /// # Potential causes
5032 /// Among other causes, `ParseIntError` can be thrown because of leading or trailing whitespace
5033 /// in the string e.g., when it is obtained from the standard input.
5034 /// Using the [`str.trim()`] method ensures that no whitespace remains before parsing.
5036 /// [`str.trim()`]: ../../std/primitive.str.html#method.trim
5037 /// [`i8::from_str_radix`]: ../../std/primitive.i8.html#method.from_str_radix
5038 #[derive(Debug, Clone, PartialEq, Eq)]
5039 #[stable(feature = "rust1", since = "1.0.0")]
5040 pub struct ParseIntError {
5044 /// Enum to store the various types of errors that can cause parsing an integer to fail.
5045 #[unstable(feature = "int_error_matching",
5046 reason = "it can be useful to match errors when making error messages \
5047 for integer parsing",
5049 #[derive(Debug, Clone, PartialEq, Eq)]
5051 pub enum IntErrorKind {
5052 /// Value being parsed is empty.
5054 /// Among other causes, this variant will be constructed when parsing an empty string.
5056 /// Contains an invalid digit.
5058 /// Among other causes, this variant will be constructed when parsing a string that
5059 /// contains a letter.
5061 /// Integer is too large to store in target integer type.
5063 /// Integer is too small to store in target integer type.
5067 /// This variant will be emitted when the parsing string has a value of zero, which
5068 /// would be illegal for non-zero types.
5072 impl ParseIntError {
5073 /// Outputs the detailed cause of parsing an integer failing.
5074 #[unstable(feature = "int_error_matching",
5075 reason = "it can be useful to match errors when making error messages \
5076 for integer parsing",
5078 pub fn kind(&self) -> &IntErrorKind {
5081 #[unstable(feature = "int_error_internals",
5082 reason = "available through Error trait and this method should \
5083 not be exposed publicly",
5086 pub fn __description(&self) -> &str {
5088 IntErrorKind::Empty => "cannot parse integer from empty string",
5089 IntErrorKind::InvalidDigit => "invalid digit found in string",
5090 IntErrorKind::Overflow => "number too large to fit in target type",
5091 IntErrorKind::Underflow => "number too small to fit in target type",
5092 IntErrorKind::Zero => "number would be zero for non-zero type",
5097 #[stable(feature = "rust1", since = "1.0.0")]
5098 impl fmt::Display for ParseIntError {
5099 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
5100 self.__description().fmt(f)
5104 #[stable(feature = "rust1", since = "1.0.0")]
5105 pub use crate::num::dec2flt::ParseFloatError;
5107 // Conversion traits for primitive integer and float types
5108 // Conversions T -> T are covered by a blanket impl and therefore excluded
5109 // Some conversions from and to usize/isize are not implemented due to portability concerns
5110 macro_rules! impl_from {
5111 ($Small: ty, $Large: ty, #[$attr:meta], $doc: expr) => {
5114 impl From<$Small> for $Large {
5116 fn from(small: $Small) -> $Large {
5121 ($Small: ty, $Large: ty, #[$attr:meta]) => {
5125 concat!("Converts `",
5133 macro_rules! impl_from_bool {
5134 ($target: ty, #[$attr:meta]) => {
5135 impl_from!(bool, $target, #[$attr], concat!("Converts a `bool` to a `",
5136 stringify!($target), "`. The resulting value is `0` for `false` and `1` for `true`
5142 assert_eq!(", stringify!($target), "::from(true), 1);
5143 assert_eq!(", stringify!($target), "::from(false), 0);
5149 impl_from_bool! { u8, #[stable(feature = "from_bool", since = "1.28.0")] }
5150 impl_from_bool! { u16, #[stable(feature = "from_bool", since = "1.28.0")] }
5151 impl_from_bool! { u32, #[stable(feature = "from_bool", since = "1.28.0")] }
5152 impl_from_bool! { u64, #[stable(feature = "from_bool", since = "1.28.0")] }
5153 impl_from_bool! { u128, #[stable(feature = "from_bool", since = "1.28.0")] }
5154 impl_from_bool! { usize, #[stable(feature = "from_bool", since = "1.28.0")] }
5155 impl_from_bool! { i8, #[stable(feature = "from_bool", since = "1.28.0")] }
5156 impl_from_bool! { i16, #[stable(feature = "from_bool", since = "1.28.0")] }
5157 impl_from_bool! { i32, #[stable(feature = "from_bool", since = "1.28.0")] }
5158 impl_from_bool! { i64, #[stable(feature = "from_bool", since = "1.28.0")] }
5159 impl_from_bool! { i128, #[stable(feature = "from_bool", since = "1.28.0")] }
5160 impl_from_bool! { isize, #[stable(feature = "from_bool", since = "1.28.0")] }
5162 // Unsigned -> Unsigned
5163 impl_from! { u8, u16, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5164 impl_from! { u8, u32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5165 impl_from! { u8, u64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5166 impl_from! { u8, u128, #[stable(feature = "i128", since = "1.26.0")] }
5167 impl_from! { u8, usize, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5168 impl_from! { u16, u32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5169 impl_from! { u16, u64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5170 impl_from! { u16, u128, #[stable(feature = "i128", since = "1.26.0")] }
5171 impl_from! { u32, u64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5172 impl_from! { u32, u128, #[stable(feature = "i128", since = "1.26.0")] }
5173 impl_from! { u64, u128, #[stable(feature = "i128", since = "1.26.0")] }
5176 impl_from! { i8, i16, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5177 impl_from! { i8, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5178 impl_from! { i8, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5179 impl_from! { i8, i128, #[stable(feature = "i128", since = "1.26.0")] }
5180 impl_from! { i8, isize, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5181 impl_from! { i16, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5182 impl_from! { i16, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5183 impl_from! { i16, i128, #[stable(feature = "i128", since = "1.26.0")] }
5184 impl_from! { i32, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5185 impl_from! { i32, i128, #[stable(feature = "i128", since = "1.26.0")] }
5186 impl_from! { i64, i128, #[stable(feature = "i128", since = "1.26.0")] }
5188 // Unsigned -> Signed
5189 impl_from! { u8, i16, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5190 impl_from! { u8, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5191 impl_from! { u8, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5192 impl_from! { u8, i128, #[stable(feature = "i128", since = "1.26.0")] }
5193 impl_from! { u16, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5194 impl_from! { u16, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5195 impl_from! { u16, i128, #[stable(feature = "i128", since = "1.26.0")] }
5196 impl_from! { u32, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5197 impl_from! { u32, i128, #[stable(feature = "i128", since = "1.26.0")] }
5198 impl_from! { u64, i128, #[stable(feature = "i128", since = "1.26.0")] }
5200 // The C99 standard defines bounds on INTPTR_MIN, INTPTR_MAX, and UINTPTR_MAX
5201 // which imply that pointer-sized integers must be at least 16 bits:
5202 // https://port70.net/~nsz/c/c99/n1256.html#7.18.2.4
5203 impl_from! { u16, usize, #[stable(feature = "lossless_iusize_conv", since = "1.26.0")] }
5204 impl_from! { u8, isize, #[stable(feature = "lossless_iusize_conv", since = "1.26.0")] }
5205 impl_from! { i16, isize, #[stable(feature = "lossless_iusize_conv", since = "1.26.0")] }
5207 // RISC-V defines the possibility of a 128-bit address space (RV128).
5209 // CHERI proposes 256-bit “capabilities”. Unclear if this would be relevant to usize/isize.
5210 // https://www.cl.cam.ac.uk/research/security/ctsrd/pdfs/20171017a-cheri-poster.pdf
5211 // http://www.csl.sri.com/users/neumann/2012resolve-cheri.pdf
5214 // Note: integers can only be represented with full precision in a float if
5215 // they fit in the significand, which is 24 bits in f32 and 53 bits in f64.
5216 // Lossy float conversions are not implemented at this time.
5219 impl_from! { i8, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5220 impl_from! { i8, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5221 impl_from! { i16, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5222 impl_from! { i16, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5223 impl_from! { i32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5225 // Unsigned -> Float
5226 impl_from! { u8, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5227 impl_from! { u8, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5228 impl_from! { u16, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5229 impl_from! { u16, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5230 impl_from! { u32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5233 impl_from! { f32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }