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)]
57 /// Creates a non-zero without checking the value.
61 /// The value must not be zero.
64 pub const unsafe fn new_unchecked(n: $Int) -> Self {
68 /// Creates a non-zero if the given value is not zero.
71 pub fn new(n: $Int) -> Option<Self> {
73 Some(unsafe { $Ty(n) })
79 /// Returns the value as a primitive type.
82 pub const fn get(self) -> $Int {
88 #[stable(feature = "from_nonzero", since = "1.31.0")]
89 impl From<$Ty> for $Int {
90 fn from(nonzero: $Ty) -> Self {
96 #[$stability] (Debug, Display, Binary, Octal, LowerHex, UpperHex) for $Ty
103 #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU8(u8);
104 #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU16(u16);
105 #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU32(u32);
106 #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU64(u64);
107 #[stable(feature = "nonzero", since = "1.28.0")] NonZeroU128(u128);
108 #[stable(feature = "nonzero", since = "1.28.0")] NonZeroUsize(usize);
109 #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI8(i8);
110 #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI16(i16);
111 #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI32(i32);
112 #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI64(i64);
113 #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroI128(i128);
114 #[stable(feature = "signed_nonzero", since = "1.34.0")] NonZeroIsize(isize);
117 macro_rules! from_str_radix_nzint_impl {
119 #[stable(feature = "nonzero_parse", since = "1.35.0")]
120 impl FromStr for $t {
121 type Err = ParseIntError;
122 fn from_str(src: &str) -> Result<Self, Self::Err> {
123 Self::new(from_str_radix(src, 10)?)
124 .ok_or(ParseIntError {
125 kind: IntErrorKind::Zero
132 from_str_radix_nzint_impl! { NonZeroU8 NonZeroU16 NonZeroU32 NonZeroU64 NonZeroU128 NonZeroUsize
133 NonZeroI8 NonZeroI16 NonZeroI32 NonZeroI64 NonZeroI128 NonZeroIsize }
135 /// Provides intentionally-wrapped arithmetic on `T`.
137 /// Operations like `+` on `u32` values is intended to never overflow,
138 /// and in some debug configurations overflow is detected and results
139 /// in a panic. While most arithmetic falls into this category, some
140 /// code explicitly expects and relies upon modular arithmetic (e.g.,
143 /// Wrapping arithmetic can be achieved either through methods like
144 /// `wrapping_add`, or through the `Wrapping<T>` type, which says that
145 /// all standard arithmetic operations on the underlying value are
146 /// intended to have wrapping semantics.
148 /// The underlying value can be retrieved through the `.0` index of the
149 /// `Wrapping` tuple.
154 /// use std::num::Wrapping;
156 /// let zero = Wrapping(0u32);
157 /// let one = Wrapping(1u32);
159 /// assert_eq!(std::u32::MAX, (zero - one).0);
161 #[stable(feature = "rust1", since = "1.0.0")]
162 #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Default, Hash)]
164 pub struct Wrapping<T>(#[stable(feature = "rust1", since = "1.0.0")]
167 #[stable(feature = "rust1", since = "1.0.0")]
168 impl<T: fmt::Debug> fmt::Debug for Wrapping<T> {
169 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
174 #[stable(feature = "wrapping_display", since = "1.10.0")]
175 impl<T: fmt::Display> fmt::Display for Wrapping<T> {
176 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
181 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
182 impl<T: fmt::Binary> fmt::Binary for Wrapping<T> {
183 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
188 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
189 impl<T: fmt::Octal> fmt::Octal for Wrapping<T> {
190 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
195 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
196 impl<T: fmt::LowerHex> fmt::LowerHex for Wrapping<T> {
197 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
202 #[stable(feature = "wrapping_fmt", since = "1.11.0")]
203 impl<T: fmt::UpperHex> fmt::UpperHex for Wrapping<T> {
204 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
209 // All these modules are technically private and only exposed for coretests:
217 macro_rules! usize_isize_to_xe_bytes_doc {
220 **Note**: This function returns an array of length 2, 4 or 8 bytes
221 depending on the target pointer size.
227 macro_rules! usize_isize_from_xe_bytes_doc {
230 **Note**: This function takes an array of length 2, 4 or 8 bytes
231 depending on the target pointer size.
236 // `Int` + `SignedInt` implemented for signed integers
237 macro_rules! int_impl {
238 ($SelfT:ty, $ActualT:ident, $UnsignedT:ty, $BITS:expr, $Min:expr, $Max:expr, $Feature:expr,
239 $EndFeature:expr, $rot:expr, $rot_op:expr, $rot_result:expr, $swap_op:expr, $swapped:expr,
240 $reversed:expr, $le_bytes:expr, $be_bytes:expr,
241 $to_xe_bytes_doc:expr, $from_xe_bytes_doc:expr) => {
243 concat!("Returns the smallest value that can be represented by this integer type.
250 ", $Feature, "assert_eq!(", stringify!($SelfT), "::min_value(), ", stringify!($Min), ");",
253 #[stable(feature = "rust1", since = "1.0.0")]
256 pub const fn min_value() -> Self {
257 !0 ^ ((!0 as $UnsignedT) >> 1) as Self
262 concat!("Returns the largest value that can be represented by this integer type.
269 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value(), ", stringify!($Max), ");",
272 #[stable(feature = "rust1", since = "1.0.0")]
275 pub const fn max_value() -> Self {
281 concat!("Converts a string slice in a given base to an integer.
283 The string is expected to be an optional `+` or `-` sign followed by digits.
284 Leading and trailing whitespace represent an error. Digits are a subset of these characters,
285 depending on `radix`:
293 This function panics if `radix` is not in the range from 2 to 36.
300 ", $Feature, "assert_eq!(", stringify!($SelfT), "::from_str_radix(\"A\", 16), Ok(10));",
303 #[stable(feature = "rust1", since = "1.0.0")]
304 pub fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError> {
305 from_str_radix(src, radix)
310 concat!("Returns the number of ones in the binary representation of `self`.
317 ", $Feature, "let n = 0b100_0000", stringify!($SelfT), ";
319 assert_eq!(n.count_ones(), 1);",
323 #[stable(feature = "rust1", since = "1.0.0")]
325 pub const fn count_ones(self) -> u32 { (self as $UnsignedT).count_ones() }
329 concat!("Returns the number of zeros in the binary representation of `self`.
336 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value().count_zeros(), 1);", $EndFeature, "
338 #[stable(feature = "rust1", since = "1.0.0")]
340 pub const fn count_zeros(self) -> u32 {
346 concat!("Returns the number of leading zeros in the binary representation of `self`.
353 ", $Feature, "let n = -1", stringify!($SelfT), ";
355 assert_eq!(n.leading_zeros(), 0);",
358 #[stable(feature = "rust1", since = "1.0.0")]
360 pub const fn leading_zeros(self) -> u32 {
361 (self as $UnsignedT).leading_zeros()
366 concat!("Returns the number of trailing zeros in the binary representation of `self`.
373 ", $Feature, "let n = -4", stringify!($SelfT), ";
375 assert_eq!(n.trailing_zeros(), 2);",
378 #[stable(feature = "rust1", since = "1.0.0")]
380 pub const fn trailing_zeros(self) -> u32 {
381 (self as $UnsignedT).trailing_zeros()
386 concat!("Shifts the bits to the left by a specified amount, `n`,
387 wrapping the truncated bits to the end of the resulting integer.
389 Please note this isn't the same operation as the `<<` shifting operator!
396 let n = ", $rot_op, stringify!($SelfT), ";
397 let m = ", $rot_result, ";
399 assert_eq!(n.rotate_left(", $rot, "), m);
401 #[stable(feature = "rust1", since = "1.0.0")]
402 #[must_use = "this returns the result of the operation, \
403 without modifying the original"]
405 pub const fn rotate_left(self, n: u32) -> Self {
406 (self as $UnsignedT).rotate_left(n) as Self
411 concat!("Shifts the bits to the right by a specified amount, `n`,
412 wrapping the truncated bits to the beginning of the resulting
415 Please note this isn't the same operation as the `>>` shifting operator!
422 let n = ", $rot_result, stringify!($SelfT), ";
423 let m = ", $rot_op, ";
425 assert_eq!(n.rotate_right(", $rot, "), m);
427 #[stable(feature = "rust1", since = "1.0.0")]
428 #[must_use = "this returns the result of the operation, \
429 without modifying the original"]
431 pub const fn rotate_right(self, n: u32) -> Self {
432 (self as $UnsignedT).rotate_right(n) as Self
437 concat!("Reverses the byte order of the integer.
444 let n = ", $swap_op, stringify!($SelfT), ";
446 let m = n.swap_bytes();
448 assert_eq!(m, ", $swapped, ");
450 #[stable(feature = "rust1", since = "1.0.0")]
452 pub const fn swap_bytes(self) -> Self {
453 (self as $UnsignedT).swap_bytes() as Self
458 concat!("Reverses the bit pattern of the integer.
465 #![feature(reverse_bits)]
467 let n = ", $swap_op, stringify!($SelfT), ";
468 let m = n.reverse_bits();
470 assert_eq!(m, ", $reversed, ");
472 #[unstable(feature = "reverse_bits", issue = "48763")]
473 #[rustc_const_unstable(feature = "const_int_conversion")]
476 pub const fn reverse_bits(self) -> Self {
477 (self as $UnsignedT).reverse_bits() as Self
482 concat!("Converts an integer from big endian to the target's endianness.
484 On big endian this is a no-op. On little endian the bytes are swapped.
491 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
493 if cfg!(target_endian = \"big\") {
494 assert_eq!(", stringify!($SelfT), "::from_be(n), n)
496 assert_eq!(", stringify!($SelfT), "::from_be(n), n.swap_bytes())
500 #[stable(feature = "rust1", since = "1.0.0")]
502 pub const fn from_be(x: Self) -> Self {
503 #[cfg(target_endian = "big")]
507 #[cfg(not(target_endian = "big"))]
515 concat!("Converts an integer from little endian to the target's endianness.
517 On little endian this is a no-op. On big endian the bytes are swapped.
524 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
526 if cfg!(target_endian = \"little\") {
527 assert_eq!(", stringify!($SelfT), "::from_le(n), n)
529 assert_eq!(", stringify!($SelfT), "::from_le(n), n.swap_bytes())
533 #[stable(feature = "rust1", since = "1.0.0")]
535 pub const fn from_le(x: Self) -> Self {
536 #[cfg(target_endian = "little")]
540 #[cfg(not(target_endian = "little"))]
548 concat!("Converts `self` to big endian from the target's endianness.
550 On big endian this is a no-op. On little endian the bytes are swapped.
557 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
559 if cfg!(target_endian = \"big\") {
560 assert_eq!(n.to_be(), n)
562 assert_eq!(n.to_be(), n.swap_bytes())
566 #[stable(feature = "rust1", since = "1.0.0")]
568 pub const fn to_be(self) -> Self { // or not to be?
569 #[cfg(target_endian = "big")]
573 #[cfg(not(target_endian = "big"))]
581 concat!("Converts `self` to little endian from the target's endianness.
583 On little endian this is a no-op. On big endian the bytes are swapped.
590 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
592 if cfg!(target_endian = \"little\") {
593 assert_eq!(n.to_le(), n)
595 assert_eq!(n.to_le(), n.swap_bytes())
599 #[stable(feature = "rust1", since = "1.0.0")]
601 pub const fn to_le(self) -> Self {
602 #[cfg(target_endian = "little")]
606 #[cfg(not(target_endian = "little"))]
614 concat!("Checked integer addition. Computes `self + rhs`, returning `None`
615 if overflow occurred.
622 ", $Feature, "assert_eq!((", stringify!($SelfT),
623 "::max_value() - 2).checked_add(1), Some(", stringify!($SelfT), "::max_value() - 1));
624 assert_eq!((", stringify!($SelfT), "::max_value() - 2).checked_add(3), None);",
627 #[stable(feature = "rust1", since = "1.0.0")]
628 #[must_use = "this returns the result of the operation, \
629 without modifying the original"]
631 pub fn checked_add(self, rhs: Self) -> Option<Self> {
632 let (a, b) = self.overflowing_add(rhs);
633 if b {None} else {Some(a)}
638 concat!("Checked integer subtraction. Computes `self - rhs`, returning `None` if
646 ", $Feature, "assert_eq!((", stringify!($SelfT),
647 "::min_value() + 2).checked_sub(1), Some(", stringify!($SelfT), "::min_value() + 1));
648 assert_eq!((", stringify!($SelfT), "::min_value() + 2).checked_sub(3), None);",
651 #[stable(feature = "rust1", since = "1.0.0")]
652 #[must_use = "this returns the result of the operation, \
653 without modifying the original"]
655 pub fn checked_sub(self, rhs: Self) -> Option<Self> {
656 let (a, b) = self.overflowing_sub(rhs);
657 if b {None} else {Some(a)}
662 concat!("Checked integer multiplication. Computes `self * rhs`, returning `None` if
670 ", $Feature, "assert_eq!(", stringify!($SelfT),
671 "::max_value().checked_mul(1), Some(", stringify!($SelfT), "::max_value()));
672 assert_eq!(", stringify!($SelfT), "::max_value().checked_mul(2), None);",
675 #[stable(feature = "rust1", since = "1.0.0")]
676 #[must_use = "this returns the result of the operation, \
677 without modifying the original"]
679 pub fn checked_mul(self, rhs: Self) -> Option<Self> {
680 let (a, b) = self.overflowing_mul(rhs);
681 if b {None} else {Some(a)}
686 concat!("Checked integer division. Computes `self / rhs`, returning `None` if `rhs == 0`
687 or the division results in overflow.
694 ", $Feature, "assert_eq!((", stringify!($SelfT),
695 "::min_value() + 1).checked_div(-1), Some(", stringify!($Max), "));
696 assert_eq!(", stringify!($SelfT), "::min_value().checked_div(-1), None);
697 assert_eq!((1", stringify!($SelfT), ").checked_div(0), None);",
700 #[stable(feature = "rust1", since = "1.0.0")]
701 #[must_use = "this returns the result of the operation, \
702 without modifying the original"]
704 pub fn checked_div(self, rhs: Self) -> Option<Self> {
705 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
708 Some(unsafe { intrinsics::unchecked_div(self, rhs) })
714 concat!("Checked Euclidean division. Computes `self.div_euclid(rhs)`,
715 returning `None` if `rhs == 0` or the division results in overflow.
722 #![feature(euclidean_division)]
723 assert_eq!((", stringify!($SelfT),
724 "::min_value() + 1).checked_div_euclid(-1), Some(", stringify!($Max), "));
725 assert_eq!(", stringify!($SelfT), "::min_value().checked_div_euclid(-1), None);
726 assert_eq!((1", stringify!($SelfT), ").checked_div_euclid(0), None);
728 #[unstable(feature = "euclidean_division", issue = "49048")]
729 #[must_use = "this returns the result of the operation, \
730 without modifying the original"]
732 pub fn checked_div_euclid(self, rhs: Self) -> Option<Self> {
733 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
736 Some(self.div_euclid(rhs))
742 concat!("Checked integer remainder. Computes `self % rhs`, returning `None` if
743 `rhs == 0` or the division results in overflow.
750 ", $Feature, "use std::", stringify!($SelfT), ";
752 assert_eq!(5", stringify!($SelfT), ".checked_rem(2), Some(1));
753 assert_eq!(5", stringify!($SelfT), ".checked_rem(0), None);
754 assert_eq!(", stringify!($SelfT), "::MIN.checked_rem(-1), None);",
757 #[stable(feature = "wrapping", since = "1.7.0")]
758 #[must_use = "this returns the result of the operation, \
759 without modifying the original"]
761 pub fn checked_rem(self, rhs: Self) -> Option<Self> {
762 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
765 Some(unsafe { intrinsics::unchecked_rem(self, rhs) })
771 concat!("Checked Euclidean remainder. Computes `self.rem_euclid(rhs)`, returning `None`
772 if `rhs == 0` or the division results in overflow.
779 #![feature(euclidean_division)]
780 use std::", stringify!($SelfT), ";
782 assert_eq!(5", stringify!($SelfT), ".checked_rem_euclid(2), Some(1));
783 assert_eq!(5", stringify!($SelfT), ".checked_rem_euclid(0), None);
784 assert_eq!(", stringify!($SelfT), "::MIN.checked_rem_euclid(-1), None);
786 #[unstable(feature = "euclidean_division", issue = "49048")]
787 #[must_use = "this returns the result of the operation, \
788 without modifying the original"]
790 pub fn checked_rem_euclid(self, rhs: Self) -> Option<Self> {
791 if rhs == 0 || (self == Self::min_value() && rhs == -1) {
794 Some(self.rem_euclid(rhs))
800 concat!("Checked negation. Computes `-self`, returning `None` if `self == MIN`.
807 ", $Feature, "use std::", stringify!($SelfT), ";
809 assert_eq!(5", stringify!($SelfT), ".checked_neg(), Some(-5));
810 assert_eq!(", stringify!($SelfT), "::MIN.checked_neg(), None);",
813 #[stable(feature = "wrapping", since = "1.7.0")]
815 pub fn checked_neg(self) -> Option<Self> {
816 let (a, b) = self.overflowing_neg();
817 if b {None} else {Some(a)}
822 concat!("Checked shift left. Computes `self << rhs`, returning `None` if `rhs` is larger
823 than or equal to the number of bits in `self`.
830 ", $Feature, "assert_eq!(0x1", stringify!($SelfT), ".checked_shl(4), Some(0x10));
831 assert_eq!(0x1", stringify!($SelfT), ".checked_shl(129), None);",
834 #[stable(feature = "wrapping", since = "1.7.0")]
835 #[must_use = "this returns the result of the operation, \
836 without modifying the original"]
838 pub fn checked_shl(self, rhs: u32) -> Option<Self> {
839 let (a, b) = self.overflowing_shl(rhs);
840 if b {None} else {Some(a)}
845 concat!("Checked shift right. Computes `self >> rhs`, returning `None` if `rhs` is
846 larger than or equal to the number of bits in `self`.
853 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".checked_shr(4), Some(0x1));
854 assert_eq!(0x10", stringify!($SelfT), ".checked_shr(128), None);",
857 #[stable(feature = "wrapping", since = "1.7.0")]
858 #[must_use = "this returns the result of the operation, \
859 without modifying the original"]
861 pub fn checked_shr(self, rhs: u32) -> Option<Self> {
862 let (a, b) = self.overflowing_shr(rhs);
863 if b {None} else {Some(a)}
868 concat!("Checked absolute value. Computes `self.abs()`, returning `None` if
876 ", $Feature, "use std::", stringify!($SelfT), ";
878 assert_eq!((-5", stringify!($SelfT), ").checked_abs(), Some(5));
879 assert_eq!(", stringify!($SelfT), "::MIN.checked_abs(), None);",
882 #[stable(feature = "no_panic_abs", since = "1.13.0")]
884 pub fn checked_abs(self) -> Option<Self> {
885 if self.is_negative() {
894 concat!("Checked exponentiation. Computes `self.pow(exp)`, returning `None` if
902 ", $Feature, "assert_eq!(8", stringify!($SelfT), ".checked_pow(2), Some(64));
903 assert_eq!(", stringify!($SelfT), "::max_value().checked_pow(2), None);",
907 #[stable(feature = "no_panic_pow", since = "1.34.0")]
908 #[must_use = "this returns the result of the operation, \
909 without modifying the original"]
911 pub fn checked_pow(self, mut exp: u32) -> Option<Self> {
913 let mut acc: Self = 1;
917 acc = acc.checked_mul(base)?;
920 base = base.checked_mul(base)?;
923 // Deal with the final bit of the exponent separately, since
924 // squaring the base afterwards is not necessary and may cause a
925 // needless overflow.
927 acc = acc.checked_mul(base)?;
935 concat!("Saturating integer addition. Computes `self + rhs`, saturating at the numeric
936 bounds instead of overflowing.
943 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_add(1), 101);
944 assert_eq!(", stringify!($SelfT), "::max_value().saturating_add(100), ", stringify!($SelfT),
949 #[stable(feature = "rust1", since = "1.0.0")]
950 #[rustc_const_unstable(feature = "const_saturating_int_methods")]
951 #[must_use = "this returns the result of the operation, \
952 without modifying the original"]
954 pub const fn saturating_add(self, rhs: Self) -> Self {
955 intrinsics::saturating_add(self, rhs)
961 concat!("Saturating integer subtraction. Computes `self - rhs`, saturating at the
962 numeric bounds instead of overflowing.
969 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_sub(127), -27);
970 assert_eq!(", stringify!($SelfT), "::min_value().saturating_sub(100), ", stringify!($SelfT),
974 #[stable(feature = "rust1", since = "1.0.0")]
975 #[rustc_const_unstable(feature = "const_saturating_int_methods")]
976 #[must_use = "this returns the result of the operation, \
977 without modifying the original"]
979 pub const fn saturating_sub(self, rhs: Self) -> Self {
980 intrinsics::saturating_sub(self, rhs)
985 concat!("Saturating integer negation. Computes `-self`, returning `MAX` if `self == MIN`
986 instead of overflowing.
993 ", $Feature, "#![feature(saturating_neg)]
994 assert_eq!(100", stringify!($SelfT), ".saturating_neg(), -100);
995 assert_eq!((-100", stringify!($SelfT), ").saturating_neg(), 100);
996 assert_eq!(", stringify!($SelfT), "::min_value().saturating_neg(), ", stringify!($SelfT),
998 assert_eq!(", stringify!($SelfT), "::max_value().saturating_neg(), ", stringify!($SelfT),
999 "::min_value() + 1);",
1003 #[unstable(feature = "saturating_neg", issue = "59983")]
1005 pub fn saturating_neg(self) -> Self {
1006 intrinsics::saturating_sub(0, self)
1011 concat!("Saturating absolute value. Computes `self.abs()`, returning `MAX` if `self ==
1012 MIN` instead of overflowing.
1019 ", $Feature, "#![feature(saturating_neg)]
1020 assert_eq!(100", stringify!($SelfT), ".saturating_abs(), 100);
1021 assert_eq!((-100", stringify!($SelfT), ").saturating_abs(), 100);
1022 assert_eq!(", stringify!($SelfT), "::min_value().saturating_abs(), ", stringify!($SelfT),
1024 assert_eq!((", stringify!($SelfT), "::min_value() + 1).saturating_abs(), ", stringify!($SelfT),
1029 #[unstable(feature = "saturating_neg", issue = "59983")]
1031 pub fn saturating_abs(self) -> Self {
1032 if self.is_negative() {
1033 self.saturating_neg()
1041 concat!("Saturating integer multiplication. Computes `self * rhs`, saturating at the
1042 numeric bounds instead of overflowing.
1049 ", $Feature, "use std::", stringify!($SelfT), ";
1051 assert_eq!(10", stringify!($SelfT), ".saturating_mul(12), 120);
1052 assert_eq!(", stringify!($SelfT), "::MAX.saturating_mul(10), ", stringify!($SelfT), "::MAX);
1053 assert_eq!(", stringify!($SelfT), "::MIN.saturating_mul(10), ", stringify!($SelfT), "::MIN);",
1056 #[stable(feature = "wrapping", since = "1.7.0")]
1057 #[must_use = "this returns the result of the operation, \
1058 without modifying the original"]
1060 pub fn saturating_mul(self, rhs: Self) -> Self {
1061 self.checked_mul(rhs).unwrap_or_else(|| {
1062 if (self < 0 && rhs < 0) || (self > 0 && rhs > 0) {
1072 concat!("Saturating integer exponentiation. Computes `self.pow(exp)`,
1073 saturating at the numeric bounds instead of overflowing.
1080 ", $Feature, "use std::", stringify!($SelfT), ";
1082 assert_eq!((-4", stringify!($SelfT), ").saturating_pow(3), -64);
1083 assert_eq!(", stringify!($SelfT), "::MIN.saturating_pow(2), ", stringify!($SelfT), "::MAX);
1084 assert_eq!(", stringify!($SelfT), "::MIN.saturating_pow(3), ", stringify!($SelfT), "::MIN);",
1087 #[stable(feature = "no_panic_pow", since = "1.34.0")]
1088 #[must_use = "this returns the result of the operation, \
1089 without modifying the original"]
1091 pub fn saturating_pow(self, exp: u32) -> Self {
1092 match self.checked_pow(exp) {
1094 None if self < 0 && exp % 2 == 1 => Self::min_value(),
1095 None => Self::max_value(),
1101 concat!("Wrapping (modular) addition. Computes `self + rhs`, wrapping around at the
1102 boundary of the type.
1109 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_add(27), 127);
1110 assert_eq!(", stringify!($SelfT), "::max_value().wrapping_add(2), ", stringify!($SelfT),
1111 "::min_value() + 1);",
1114 #[stable(feature = "rust1", since = "1.0.0")]
1115 #[must_use = "this returns the result of the operation, \
1116 without modifying the original"]
1118 pub const fn wrapping_add(self, rhs: Self) -> Self {
1119 intrinsics::overflowing_add(self, rhs)
1124 concat!("Wrapping (modular) subtraction. Computes `self - rhs`, wrapping around at the
1125 boundary of the type.
1132 ", $Feature, "assert_eq!(0", stringify!($SelfT), ".wrapping_sub(127), -127);
1133 assert_eq!((-2", stringify!($SelfT), ").wrapping_sub(", stringify!($SelfT), "::max_value()), ",
1134 stringify!($SelfT), "::max_value());",
1137 #[stable(feature = "rust1", since = "1.0.0")]
1138 #[must_use = "this returns the result of the operation, \
1139 without modifying the original"]
1141 pub const fn wrapping_sub(self, rhs: Self) -> Self {
1142 intrinsics::overflowing_sub(self, rhs)
1147 concat!("Wrapping (modular) multiplication. Computes `self * rhs`, wrapping around at
1148 the boundary of the type.
1155 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".wrapping_mul(12), 120);
1156 assert_eq!(11i8.wrapping_mul(12), -124);",
1159 #[stable(feature = "rust1", since = "1.0.0")]
1160 #[must_use = "this returns the result of the operation, \
1161 without modifying the original"]
1163 pub const fn wrapping_mul(self, rhs: Self) -> Self {
1164 intrinsics::overflowing_mul(self, rhs)
1169 concat!("Wrapping (modular) division. Computes `self / rhs`, wrapping around at the
1170 boundary of the type.
1172 The only case where such wrapping can occur is when one divides `MIN / -1` on a signed type (where
1173 `MIN` is the negative minimal value for the type); this is equivalent to `-MIN`, a positive value
1174 that is too large to represent in the type. In such a case, this function returns `MIN` itself.
1178 This function will panic if `rhs` is 0.
1185 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_div(10), 10);
1186 assert_eq!((-128i8).wrapping_div(-1), -128);",
1189 #[stable(feature = "num_wrapping", since = "1.2.0")]
1190 #[must_use = "this returns the result of the operation, \
1191 without modifying the original"]
1193 pub fn wrapping_div(self, rhs: Self) -> Self {
1194 self.overflowing_div(rhs).0
1199 concat!("Wrapping Euclidean division. Computes `self.div_euclid(rhs)`,
1200 wrapping around at the boundary of the type.
1202 Wrapping will only occur in `MIN / -1` on a signed type (where `MIN` is the negative minimal value
1203 for the type). This is equivalent to `-MIN`, a positive value that is too large to represent in the
1204 type. In this case, this method returns `MIN` itself.
1208 This function will panic if `rhs` is 0.
1215 #![feature(euclidean_division)]
1216 assert_eq!(100", stringify!($SelfT), ".wrapping_div_euclid(10), 10);
1217 assert_eq!((-128i8).wrapping_div_euclid(-1), -128);
1219 #[unstable(feature = "euclidean_division", issue = "49048")]
1220 #[must_use = "this returns the result of the operation, \
1221 without modifying the original"]
1223 pub fn wrapping_div_euclid(self, rhs: Self) -> Self {
1224 self.overflowing_div_euclid(rhs).0
1229 concat!("Wrapping (modular) remainder. Computes `self % rhs`, wrapping around at the
1230 boundary of the type.
1232 Such wrap-around never actually occurs mathematically; implementation artifacts make `x % y`
1233 invalid for `MIN / -1` on a signed type (where `MIN` is the negative minimal value). In such a case,
1234 this function returns `0`.
1238 This function will panic if `rhs` is 0.
1245 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_rem(10), 0);
1246 assert_eq!((-128i8).wrapping_rem(-1), 0);",
1249 #[stable(feature = "num_wrapping", since = "1.2.0")]
1250 #[must_use = "this returns the result of the operation, \
1251 without modifying the original"]
1253 pub fn wrapping_rem(self, rhs: Self) -> Self {
1254 self.overflowing_rem(rhs).0
1259 concat!("Wrapping Euclidean remainder. Computes `self.rem_euclid(rhs)`, wrapping around
1260 at the boundary of the type.
1262 Wrapping will only occur in `MIN % -1` on a signed type (where `MIN` is the negative minimal value
1263 for the type). In this case, this method returns 0.
1267 This function will panic if `rhs` is 0.
1274 #![feature(euclidean_division)]
1275 assert_eq!(100", stringify!($SelfT), ".wrapping_rem_euclid(10), 0);
1276 assert_eq!((-128i8).wrapping_rem_euclid(-1), 0);
1278 #[unstable(feature = "euclidean_division", issue = "49048")]
1279 #[must_use = "this returns the result of the operation, \
1280 without modifying the original"]
1282 pub fn wrapping_rem_euclid(self, rhs: Self) -> Self {
1283 self.overflowing_rem_euclid(rhs).0
1288 concat!("Wrapping (modular) negation. Computes `-self`, wrapping around at the boundary
1291 The only case where such wrapping can occur is when one negates `MIN` on a signed type (where `MIN`
1292 is the negative minimal value for the type); this is a positive value that is too large to represent
1293 in the type. In such a case, this function returns `MIN` itself.
1300 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_neg(), -100);
1301 assert_eq!(", stringify!($SelfT), "::min_value().wrapping_neg(), ", stringify!($SelfT),
1305 #[stable(feature = "num_wrapping", since = "1.2.0")]
1307 pub const fn wrapping_neg(self) -> Self {
1308 self.overflowing_neg().0
1313 concat!("Panic-free bitwise shift-left; yields `self << mask(rhs)`, where `mask` removes
1314 any high-order bits of `rhs` that would cause the shift to exceed the bitwidth of the type.
1316 Note that this is *not* the same as a rotate-left; the RHS of a wrapping shift-left is restricted to
1317 the range of the type, rather than the bits shifted out of the LHS being returned to the other end.
1318 The primitive integer types all implement a `rotate_left` function, which may be what you want
1326 ", $Feature, "assert_eq!((-1", stringify!($SelfT), ").wrapping_shl(7), -128);
1327 assert_eq!((-1", stringify!($SelfT), ").wrapping_shl(128), -1);",
1330 #[stable(feature = "num_wrapping", since = "1.2.0")]
1331 #[must_use = "this returns the result of the operation, \
1332 without modifying the original"]
1334 pub const fn wrapping_shl(self, rhs: u32) -> Self {
1336 intrinsics::unchecked_shl(self, (rhs & ($BITS - 1)) as $SelfT)
1342 concat!("Panic-free bitwise shift-right; yields `self >> mask(rhs)`, where `mask`
1343 removes any high-order bits of `rhs` that would cause the shift to exceed the bitwidth of the type.
1345 Note that this is *not* the same as a rotate-right; the RHS of a wrapping shift-right is restricted
1346 to the range of the type, rather than the bits shifted out of the LHS being returned to the other
1347 end. The primitive integer types all implement a `rotate_right` function, which may be what you want
1355 ", $Feature, "assert_eq!((-128", stringify!($SelfT), ").wrapping_shr(7), -1);
1356 assert_eq!((-128i16).wrapping_shr(64), -128);",
1359 #[stable(feature = "num_wrapping", since = "1.2.0")]
1360 #[must_use = "this returns the result of the operation, \
1361 without modifying the original"]
1363 pub const fn wrapping_shr(self, rhs: u32) -> Self {
1365 intrinsics::unchecked_shr(self, (rhs & ($BITS - 1)) as $SelfT)
1371 concat!("Wrapping (modular) absolute value. Computes `self.abs()`, wrapping around at
1372 the boundary of the type.
1374 The only case where such wrapping can occur is when one takes the absolute value of the negative
1375 minimal value for the type this is a positive value that is too large to represent in the type. In
1376 such a case, this function returns `MIN` itself.
1383 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_abs(), 100);
1384 assert_eq!((-100", stringify!($SelfT), ").wrapping_abs(), 100);
1385 assert_eq!(", stringify!($SelfT), "::min_value().wrapping_abs(), ", stringify!($SelfT),
1387 assert_eq!((-128i8).wrapping_abs() as u8, 128);",
1390 #[stable(feature = "no_panic_abs", since = "1.13.0")]
1392 pub fn wrapping_abs(self) -> Self {
1393 if self.is_negative() {
1402 concat!("Wrapping (modular) exponentiation. Computes `self.pow(exp)`,
1403 wrapping around at the boundary of the type.
1410 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".wrapping_pow(4), 81);
1411 assert_eq!(3i8.wrapping_pow(5), -13);
1412 assert_eq!(3i8.wrapping_pow(6), -39);",
1415 #[stable(feature = "no_panic_pow", since = "1.34.0")]
1416 #[must_use = "this returns the result of the operation, \
1417 without modifying the original"]
1419 pub fn wrapping_pow(self, mut exp: u32) -> Self {
1420 let mut base = self;
1421 let mut acc: Self = 1;
1425 acc = acc.wrapping_mul(base);
1428 base = base.wrapping_mul(base);
1431 // Deal with the final bit of the exponent separately, since
1432 // squaring the base afterwards is not necessary and may cause a
1433 // needless overflow.
1435 acc = acc.wrapping_mul(base);
1443 concat!("Calculates `self` + `rhs`
1445 Returns a tuple of the addition along with a boolean indicating whether an arithmetic overflow would
1446 occur. If an overflow would have occurred then the wrapped value is returned.
1453 ", $Feature, "use std::", stringify!($SelfT), ";
1455 assert_eq!(5", stringify!($SelfT), ".overflowing_add(2), (7, false));
1456 assert_eq!(", stringify!($SelfT), "::MAX.overflowing_add(1), (", stringify!($SelfT),
1457 "::MIN, true));", $EndFeature, "
1459 #[stable(feature = "wrapping", since = "1.7.0")]
1460 #[must_use = "this returns the result of the operation, \
1461 without modifying the original"]
1463 pub const fn overflowing_add(self, rhs: Self) -> (Self, bool) {
1464 let (a, b) = intrinsics::add_with_overflow(self as $ActualT, rhs as $ActualT);
1470 concat!("Calculates `self` - `rhs`
1472 Returns a tuple of the subtraction along with a boolean indicating whether an arithmetic overflow
1473 would occur. If an overflow would have occurred then the wrapped value is returned.
1480 ", $Feature, "use std::", stringify!($SelfT), ";
1482 assert_eq!(5", stringify!($SelfT), ".overflowing_sub(2), (3, false));
1483 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_sub(1), (", stringify!($SelfT),
1484 "::MAX, true));", $EndFeature, "
1486 #[stable(feature = "wrapping", since = "1.7.0")]
1487 #[must_use = "this returns the result of the operation, \
1488 without modifying the original"]
1490 pub const fn overflowing_sub(self, rhs: Self) -> (Self, bool) {
1491 let (a, b) = intrinsics::sub_with_overflow(self as $ActualT, rhs as $ActualT);
1497 concat!("Calculates the multiplication of `self` and `rhs`.
1499 Returns a tuple of the multiplication along with a boolean indicating whether an arithmetic overflow
1500 would occur. If an overflow would have occurred then the wrapped value is returned.
1507 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".overflowing_mul(2), (10, false));
1508 assert_eq!(1_000_000_000i32.overflowing_mul(10), (1410065408, true));",
1511 #[stable(feature = "wrapping", since = "1.7.0")]
1512 #[must_use = "this returns the result of the operation, \
1513 without modifying the original"]
1515 pub const fn overflowing_mul(self, rhs: Self) -> (Self, bool) {
1516 let (a, b) = intrinsics::mul_with_overflow(self as $ActualT, rhs as $ActualT);
1522 concat!("Calculates the divisor when `self` is divided by `rhs`.
1524 Returns a tuple of the divisor along with a boolean indicating whether an arithmetic overflow would
1525 occur. If an overflow would occur then self is returned.
1529 This function will panic if `rhs` is 0.
1536 ", $Feature, "use std::", stringify!($SelfT), ";
1538 assert_eq!(5", stringify!($SelfT), ".overflowing_div(2), (2, false));
1539 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_div(-1), (", stringify!($SelfT),
1544 #[stable(feature = "wrapping", since = "1.7.0")]
1545 #[must_use = "this returns the result of the operation, \
1546 without modifying the original"]
1547 pub fn overflowing_div(self, rhs: Self) -> (Self, bool) {
1548 if self == Self::min_value() && rhs == -1 {
1557 concat!("Calculates the quotient of Euclidean division `self.div_euclid(rhs)`.
1559 Returns a tuple of the divisor along with a boolean indicating whether an arithmetic overflow would
1560 occur. If an overflow would occur then `self` is returned.
1564 This function will panic if `rhs` is 0.
1571 #![feature(euclidean_division)]
1572 use std::", stringify!($SelfT), ";
1574 assert_eq!(5", stringify!($SelfT), ".overflowing_div_euclid(2), (2, false));
1575 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_div_euclid(-1), (", stringify!($SelfT),
1579 #[unstable(feature = "euclidean_division", issue = "49048")]
1580 #[must_use = "this returns the result of the operation, \
1581 without modifying the original"]
1582 pub fn overflowing_div_euclid(self, rhs: Self) -> (Self, bool) {
1583 if self == Self::min_value() && rhs == -1 {
1586 (self.div_euclid(rhs), false)
1592 concat!("Calculates the remainder when `self` is divided by `rhs`.
1594 Returns a tuple of the remainder after dividing along with a boolean indicating whether an
1595 arithmetic overflow would occur. If an overflow would occur then 0 is returned.
1599 This function will panic if `rhs` is 0.
1606 ", $Feature, "use std::", stringify!($SelfT), ";
1608 assert_eq!(5", stringify!($SelfT), ".overflowing_rem(2), (1, false));
1609 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_rem(-1), (0, true));",
1613 #[stable(feature = "wrapping", since = "1.7.0")]
1614 #[must_use = "this returns the result of the operation, \
1615 without modifying the original"]
1616 pub fn overflowing_rem(self, rhs: Self) -> (Self, bool) {
1617 if self == Self::min_value() && rhs == -1 {
1627 concat!("Overflowing Euclidean remainder. Calculates `self.rem_euclid(rhs)`.
1629 Returns a tuple of the remainder after dividing along with a boolean indicating whether an
1630 arithmetic overflow would occur. If an overflow would occur then 0 is returned.
1634 This function will panic if `rhs` is 0.
1641 #![feature(euclidean_division)]
1642 use std::", stringify!($SelfT), ";
1644 assert_eq!(5", stringify!($SelfT), ".overflowing_rem_euclid(2), (1, false));
1645 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_rem_euclid(-1), (0, true));
1647 #[unstable(feature = "euclidean_division", issue = "49048")]
1648 #[must_use = "this returns the result of the operation, \
1649 without modifying the original"]
1651 pub fn overflowing_rem_euclid(self, rhs: Self) -> (Self, bool) {
1652 if self == Self::min_value() && rhs == -1 {
1655 (self.rem_euclid(rhs), false)
1662 concat!("Negates self, overflowing if this is equal to the minimum value.
1664 Returns a tuple of the negated version of self along with a boolean indicating whether an overflow
1665 happened. If `self` is the minimum value (e.g., `i32::MIN` for values of type `i32`), then the
1666 minimum value will be returned again and `true` will be returned for an overflow happening.
1673 ", $Feature, "use std::", stringify!($SelfT), ";
1675 assert_eq!(2", stringify!($SelfT), ".overflowing_neg(), (-2, false));
1676 assert_eq!(", stringify!($SelfT), "::MIN.overflowing_neg(), (", stringify!($SelfT),
1677 "::MIN, true));", $EndFeature, "
1680 #[stable(feature = "wrapping", since = "1.7.0")]
1681 pub const fn overflowing_neg(self) -> (Self, bool) {
1682 ((!self).wrapping_add(1), self == Self::min_value())
1687 concat!("Shifts self left by `rhs` bits.
1689 Returns a tuple of the shifted version of self along with a boolean indicating whether the shift
1690 value was larger than or equal to the number of bits. If the shift value is too large, then value is
1691 masked (N-1) where N is the number of bits, and this value is then used to perform the shift.
1698 ", $Feature, "assert_eq!(0x1", stringify!($SelfT),".overflowing_shl(4), (0x10, false));
1699 assert_eq!(0x1i32.overflowing_shl(36), (0x10, true));",
1702 #[stable(feature = "wrapping", since = "1.7.0")]
1703 #[must_use = "this returns the result of the operation, \
1704 without modifying the original"]
1706 pub const fn overflowing_shl(self, rhs: u32) -> (Self, bool) {
1707 (self.wrapping_shl(rhs), (rhs > ($BITS - 1)))
1712 concat!("Shifts self right by `rhs` bits.
1714 Returns a tuple of the shifted version of self along with a boolean indicating whether the shift
1715 value was larger than or equal to the number of bits. If the shift value is too large, then value is
1716 masked (N-1) where N is the number of bits, and this value is then used to perform the shift.
1723 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".overflowing_shr(4), (0x1, false));
1724 assert_eq!(0x10i32.overflowing_shr(36), (0x1, true));",
1727 #[stable(feature = "wrapping", since = "1.7.0")]
1728 #[must_use = "this returns the result of the operation, \
1729 without modifying the original"]
1731 pub const fn overflowing_shr(self, rhs: u32) -> (Self, bool) {
1732 (self.wrapping_shr(rhs), (rhs > ($BITS - 1)))
1737 concat!("Computes the absolute value of `self`.
1739 Returns a tuple of the absolute version of self along with a boolean indicating whether an overflow
1740 happened. If self is the minimum value (e.g., ", stringify!($SelfT), "::MIN for values of type
1741 ", stringify!($SelfT), "), then the minimum value will be returned again and true will be returned
1742 for an overflow happening.
1749 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".overflowing_abs(), (10, false));
1750 assert_eq!((-10", stringify!($SelfT), ").overflowing_abs(), (10, false));
1751 assert_eq!((", stringify!($SelfT), "::min_value()).overflowing_abs(), (", stringify!($SelfT),
1752 "::min_value(), true));",
1755 #[stable(feature = "no_panic_abs", since = "1.13.0")]
1757 pub fn overflowing_abs(self) -> (Self, bool) {
1758 if self.is_negative() {
1759 self.overflowing_neg()
1767 concat!("Raises self to the power of `exp`, using exponentiation by squaring.
1769 Returns a tuple of the exponentiation along with a bool indicating
1770 whether an overflow happened.
1777 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".overflowing_pow(4), (81, false));
1778 assert_eq!(3i8.overflowing_pow(5), (-13, true));",
1781 #[stable(feature = "no_panic_pow", since = "1.34.0")]
1782 #[must_use = "this returns the result of the operation, \
1783 without modifying the original"]
1785 pub fn overflowing_pow(self, mut exp: u32) -> (Self, bool) {
1786 let mut base = self;
1787 let mut acc: Self = 1;
1788 let mut overflown = false;
1789 // Scratch space for storing results of overflowing_mul.
1794 r = acc.overflowing_mul(base);
1799 r = base.overflowing_mul(base);
1804 // Deal with the final bit of the exponent separately, since
1805 // squaring the base afterwards is not necessary and may cause a
1806 // needless overflow.
1808 r = acc.overflowing_mul(base);
1818 concat!("Raises self to the power of `exp`, using exponentiation by squaring.
1825 ", $Feature, "let x: ", stringify!($SelfT), " = 2; // or any other integer type
1827 assert_eq!(x.pow(5), 32);",
1830 #[stable(feature = "rust1", since = "1.0.0")]
1831 #[must_use = "this returns the result of the operation, \
1832 without modifying the original"]
1834 #[rustc_inherit_overflow_checks]
1835 pub fn pow(self, mut exp: u32) -> Self {
1836 let mut base = self;
1847 // Deal with the final bit of the exponent separately, since
1848 // squaring the base afterwards is not necessary and may cause a
1849 // needless overflow.
1859 concat!("Calculates the quotient of Euclidean division of `self` by `rhs`.
1861 This computes the integer `n` such that `self = n * rhs + self.rem_euclid(rhs)`,
1862 with `0 <= self.rem_euclid(rhs) < rhs`.
1864 In other words, the result is `self / rhs` rounded to the integer `n`
1865 such that `self >= n * rhs`.
1866 If `self > 0`, this is equal to round towards zero (the default in Rust);
1867 if `self < 0`, this is equal to round towards +/- infinity.
1871 This function will panic if `rhs` is 0.
1878 #![feature(euclidean_division)]
1879 let a: ", stringify!($SelfT), " = 7; // or any other integer type
1882 assert_eq!(a.div_euclid(b), 1); // 7 >= 4 * 1
1883 assert_eq!(a.div_euclid(-b), -1); // 7 >= -4 * -1
1884 assert_eq!((-a).div_euclid(b), -2); // -7 >= 4 * -2
1885 assert_eq!((-a).div_euclid(-b), 2); // -7 >= -4 * 2
1887 #[unstable(feature = "euclidean_division", issue = "49048")]
1888 #[must_use = "this returns the result of the operation, \
1889 without modifying the original"]
1891 #[rustc_inherit_overflow_checks]
1892 pub fn div_euclid(self, rhs: Self) -> Self {
1895 return if rhs > 0 { q - 1 } else { q + 1 }
1903 concat!("Calculates the least nonnegative remainder of `self (mod rhs)`.
1905 This is done as if by the Euclidean division algorithm -- given
1906 `r = self.rem_euclid(rhs)`, `self = rhs * self.div_euclid(rhs) + r`, and
1907 `0 <= r < abs(rhs)`.
1911 This function will panic if `rhs` is 0.
1918 #![feature(euclidean_division)]
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 #[unstable(feature = "euclidean_division", issue = "49048")]
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 fn abs(self) -> Self {
1969 if self.is_negative() {
1970 // Note that the #[inline] above means that the overflow
1971 // semantics of this negation depend on the crate we're being
1981 concat!("Returns a number representing sign of `self`.
1983 - `0` if the number is zero
1984 - `1` if the number is positive
1985 - `-1` if the number is negative
1992 ", $Feature, "assert_eq!(10", stringify!($SelfT), ".signum(), 1);
1993 assert_eq!(0", stringify!($SelfT), ".signum(), 0);
1994 assert_eq!((-10", stringify!($SelfT), ").signum(), -1);",
1997 #[stable(feature = "rust1", since = "1.0.0")]
1999 pub fn signum(self) -> Self {
2009 concat!("Returns `true` if `self` is positive and `false` if the number is zero or
2017 ", $Feature, "assert!(10", stringify!($SelfT), ".is_positive());
2018 assert!(!(-10", stringify!($SelfT), ").is_positive());",
2021 #[stable(feature = "rust1", since = "1.0.0")]
2023 pub const fn is_positive(self) -> bool { self > 0 }
2027 concat!("Returns `true` if `self` is negative and `false` if the number is zero or
2035 ", $Feature, "assert!((-10", stringify!($SelfT), ").is_negative());
2036 assert!(!10", stringify!($SelfT), ".is_negative());",
2039 #[stable(feature = "rust1", since = "1.0.0")]
2041 pub const fn is_negative(self) -> bool { self < 0 }
2045 concat!("Return the memory representation of this integer as a byte array in
2046 big-endian (network) byte order.
2053 let bytes = ", $swap_op, stringify!($SelfT), ".to_be_bytes();
2054 assert_eq!(bytes, ", $be_bytes, ");
2056 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2057 #[rustc_const_unstable(feature = "const_int_conversion")]
2059 pub const fn to_be_bytes(self) -> [u8; mem::size_of::<Self>()] {
2060 self.to_be().to_ne_bytes()
2065 concat!("Return the memory representation of this integer as a byte array in
2066 little-endian byte order.
2073 let bytes = ", $swap_op, stringify!($SelfT), ".to_le_bytes();
2074 assert_eq!(bytes, ", $le_bytes, ");
2076 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2077 #[rustc_const_unstable(feature = "const_int_conversion")]
2079 pub const fn to_le_bytes(self) -> [u8; mem::size_of::<Self>()] {
2080 self.to_le().to_ne_bytes()
2086 Return the memory representation of this integer as a byte array in
2089 As the target platform's native endianness is used, portable code
2090 should use [`to_be_bytes`] or [`to_le_bytes`], as appropriate,
2095 [`to_be_bytes`]: #method.to_be_bytes
2096 [`to_le_bytes`]: #method.to_le_bytes
2101 let bytes = ", $swap_op, stringify!($SelfT), ".to_ne_bytes();
2102 assert_eq!(bytes, if cfg!(target_endian = \"big\") {
2108 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2109 #[rustc_const_unstable(feature = "const_int_conversion")]
2111 pub const fn to_ne_bytes(self) -> [u8; mem::size_of::<Self>()] {
2112 unsafe { mem::transmute(self) }
2117 concat!("Create an integer value from its representation as a byte array in
2125 let value = ", stringify!($SelfT), "::from_be_bytes(", $be_bytes, ");
2126 assert_eq!(value, ", $swap_op, ");
2129 When starting from a slice rather than an array, fallible conversion APIs can be used:
2132 use std::convert::TryInto;
2134 fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
2135 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
2137 ", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
2140 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2141 #[rustc_const_unstable(feature = "const_int_conversion")]
2143 pub const fn from_be_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
2144 Self::from_be(Self::from_ne_bytes(bytes))
2150 Create an integer value from its representation as a byte array in
2158 let value = ", stringify!($SelfT), "::from_le_bytes(", $le_bytes, ");
2159 assert_eq!(value, ", $swap_op, ");
2162 When starting from a slice rather than an array, fallible conversion APIs can be used:
2165 use std::convert::TryInto;
2167 fn read_le_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
2168 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
2170 ", stringify!($SelfT), "::from_le_bytes(int_bytes.try_into().unwrap())
2173 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2174 #[rustc_const_unstable(feature = "const_int_conversion")]
2176 pub const fn from_le_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
2177 Self::from_le(Self::from_ne_bytes(bytes))
2182 concat!("Create an integer value from its memory representation as a byte
2183 array in native endianness.
2185 As the target platform's native endianness is used, portable code
2186 likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as
2187 appropriate instead.
2189 [`from_be_bytes`]: #method.from_be_bytes
2190 [`from_le_bytes`]: #method.from_le_bytes
2197 let value = ", stringify!($SelfT), "::from_ne_bytes(if cfg!(target_endian = \"big\") {
2202 assert_eq!(value, ", $swap_op, ");
2205 When starting from a slice rather than an array, fallible conversion APIs can be used:
2208 use std::convert::TryInto;
2210 fn read_ne_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
2211 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
2213 ", stringify!($SelfT), "::from_ne_bytes(int_bytes.try_into().unwrap())
2216 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
2217 #[rustc_const_unstable(feature = "const_int_conversion")]
2219 pub const fn from_ne_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
2220 unsafe { mem::transmute(bytes) }
2228 int_impl! { i8, i8, u8, 8, -128, 127, "", "", 2, "-0x7e", "0xa", "0x12", "0x12", "0x48",
2229 "[0x12]", "[0x12]", "", "" }
2234 int_impl! { i16, i16, u16, 16, -32768, 32767, "", "", 4, "-0x5ffd", "0x3a", "0x1234", "0x3412",
2235 "0x2c48", "[0x34, 0x12]", "[0x12, 0x34]", "", "" }
2240 int_impl! { i32, i32, u32, 32, -2147483648, 2147483647, "", "", 8, "0x10000b3", "0xb301",
2241 "0x12345678", "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]",
2242 "[0x12, 0x34, 0x56, 0x78]", "", "" }
2247 int_impl! { i64, i64, u64, 64, -9223372036854775808, 9223372036854775807, "", "", 12,
2248 "0xaa00000000006e1", "0x6e10aa", "0x1234567890123456", "0x5634129078563412",
2249 "0x6a2c48091e6a2c48", "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
2250 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]", "", "" }
2255 int_impl! { i128, i128, u128, 128, -170141183460469231731687303715884105728,
2256 170141183460469231731687303715884105727, "", "", 16,
2257 "0x13f40000000000000000000000004f76", "0x4f7613f4", "0x12345678901234567890123456789012",
2258 "0x12907856341290785634129078563412", "0x48091e6a2c48091e6a2c48091e6a2c48",
2259 "[0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, \
2260 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
2261 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, \
2262 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12]", "", "" }
2265 #[cfg(target_pointer_width = "16")]
2268 int_impl! { isize, i16, u16, 16, -32768, 32767, "", "", 4, "-0x5ffd", "0x3a", "0x1234",
2269 "0x3412", "0x2c48", "[0x34, 0x12]", "[0x12, 0x34]",
2270 usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
2273 #[cfg(target_pointer_width = "32")]
2276 int_impl! { isize, i32, u32, 32, -2147483648, 2147483647, "", "", 8, "0x10000b3", "0xb301",
2277 "0x12345678", "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]",
2278 "[0x12, 0x34, 0x56, 0x78]",
2279 usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
2282 #[cfg(target_pointer_width = "64")]
2285 int_impl! { isize, i64, u64, 64, -9223372036854775808, 9223372036854775807, "", "",
2286 12, "0xaa00000000006e1", "0x6e10aa", "0x1234567890123456", "0x5634129078563412",
2287 "0x6a2c48091e6a2c48", "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
2288 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]",
2289 usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
2292 // `Int` + `UnsignedInt` implemented for unsigned integers
2293 macro_rules! uint_impl {
2294 ($SelfT:ty, $ActualT:ty, $BITS:expr, $MaxV:expr, $Feature:expr, $EndFeature:expr,
2295 $rot:expr, $rot_op:expr, $rot_result:expr, $swap_op:expr, $swapped:expr,
2296 $reversed:expr, $le_bytes:expr, $be_bytes:expr,
2297 $to_xe_bytes_doc:expr, $from_xe_bytes_doc:expr) => {
2299 concat!("Returns the smallest value that can be represented by this integer type.
2306 ", $Feature, "assert_eq!(", stringify!($SelfT), "::min_value(), 0);", $EndFeature, "
2308 #[stable(feature = "rust1", since = "1.0.0")]
2311 pub const fn min_value() -> Self { 0 }
2315 concat!("Returns the largest value that can be represented by this integer type.
2322 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value(), ",
2323 stringify!($MaxV), ");", $EndFeature, "
2325 #[stable(feature = "rust1", since = "1.0.0")]
2328 pub const fn max_value() -> Self { !0 }
2332 concat!("Converts a string slice in a given base to an integer.
2334 The string is expected to be an optional `+` sign
2336 Leading and trailing whitespace represent an error.
2337 Digits are a subset of these characters, depending on `radix`:
2345 This function panics if `radix` is not in the range from 2 to 36.
2352 ", $Feature, "assert_eq!(", stringify!($SelfT), "::from_str_radix(\"A\", 16), Ok(10));",
2355 #[stable(feature = "rust1", since = "1.0.0")]
2356 pub fn from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError> {
2357 from_str_radix(src, radix)
2362 concat!("Returns the number of ones in the binary representation of `self`.
2369 ", $Feature, "let n = 0b01001100", stringify!($SelfT), ";
2371 assert_eq!(n.count_ones(), 3);", $EndFeature, "
2373 #[stable(feature = "rust1", since = "1.0.0")]
2375 pub const fn count_ones(self) -> u32 {
2376 intrinsics::ctpop(self as $ActualT) as u32
2381 concat!("Returns the number of zeros in the binary representation of `self`.
2388 ", $Feature, "assert_eq!(", stringify!($SelfT), "::max_value().count_zeros(), 0);", $EndFeature, "
2390 #[stable(feature = "rust1", since = "1.0.0")]
2392 pub const fn count_zeros(self) -> u32 {
2393 (!self).count_ones()
2398 concat!("Returns the number of leading zeros in the binary representation of `self`.
2405 ", $Feature, "let n = ", stringify!($SelfT), "::max_value() >> 2;
2407 assert_eq!(n.leading_zeros(), 2);", $EndFeature, "
2409 #[stable(feature = "rust1", since = "1.0.0")]
2411 pub const fn leading_zeros(self) -> u32 {
2412 intrinsics::ctlz(self as $ActualT) as u32
2417 concat!("Returns the number of trailing zeros in the binary representation
2425 ", $Feature, "let n = 0b0101000", stringify!($SelfT), ";
2427 assert_eq!(n.trailing_zeros(), 3);", $EndFeature, "
2429 #[stable(feature = "rust1", since = "1.0.0")]
2431 pub const fn trailing_zeros(self) -> u32 {
2432 intrinsics::cttz(self) as u32
2437 concat!("Shifts the bits to the left by a specified amount, `n`,
2438 wrapping the truncated bits to the end of the resulting integer.
2440 Please note this isn't the same operation as the `<<` shifting operator!
2447 let n = ", $rot_op, stringify!($SelfT), ";
2448 let m = ", $rot_result, ";
2450 assert_eq!(n.rotate_left(", $rot, "), m);
2452 #[stable(feature = "rust1", since = "1.0.0")]
2453 #[must_use = "this returns the result of the operation, \
2454 without modifying the original"]
2456 pub const fn rotate_left(self, n: u32) -> Self {
2457 intrinsics::rotate_left(self, n as $SelfT)
2462 concat!("Shifts the bits to the right by a specified amount, `n`,
2463 wrapping the truncated bits to the beginning of the resulting
2466 Please note this isn't the same operation as the `>>` shifting operator!
2473 let n = ", $rot_result, stringify!($SelfT), ";
2474 let m = ", $rot_op, ";
2476 assert_eq!(n.rotate_right(", $rot, "), m);
2478 #[stable(feature = "rust1", since = "1.0.0")]
2479 #[must_use = "this returns the result of the operation, \
2480 without modifying the original"]
2482 pub const fn rotate_right(self, n: u32) -> Self {
2483 intrinsics::rotate_right(self, n as $SelfT)
2489 Reverses the byte order of the integer.
2496 let n = ", $swap_op, stringify!($SelfT), ";
2497 let m = n.swap_bytes();
2499 assert_eq!(m, ", $swapped, ");
2501 #[stable(feature = "rust1", since = "1.0.0")]
2503 pub const fn swap_bytes(self) -> Self {
2504 intrinsics::bswap(self as $ActualT) as Self
2509 concat!("Reverses the bit pattern of the integer.
2516 #![feature(reverse_bits)]
2518 let n = ", $swap_op, stringify!($SelfT), ";
2519 let m = n.reverse_bits();
2521 assert_eq!(m, ", $reversed, ");
2523 #[unstable(feature = "reverse_bits", issue = "48763")]
2526 pub const fn reverse_bits(self) -> Self {
2527 intrinsics::bitreverse(self as $ActualT) as Self
2532 concat!("Converts an integer from big endian to the target's endianness.
2534 On big endian this is a no-op. On little endian the bytes are
2542 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2544 if cfg!(target_endian = \"big\") {
2545 assert_eq!(", stringify!($SelfT), "::from_be(n), n)
2547 assert_eq!(", stringify!($SelfT), "::from_be(n), n.swap_bytes())
2550 #[stable(feature = "rust1", since = "1.0.0")]
2552 pub const fn from_be(x: Self) -> Self {
2553 #[cfg(target_endian = "big")]
2557 #[cfg(not(target_endian = "big"))]
2565 concat!("Converts an integer from little endian to the target's endianness.
2567 On little endian this is a no-op. On big endian the bytes are
2575 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2577 if cfg!(target_endian = \"little\") {
2578 assert_eq!(", stringify!($SelfT), "::from_le(n), n)
2580 assert_eq!(", stringify!($SelfT), "::from_le(n), n.swap_bytes())
2583 #[stable(feature = "rust1", since = "1.0.0")]
2585 pub const fn from_le(x: Self) -> Self {
2586 #[cfg(target_endian = "little")]
2590 #[cfg(not(target_endian = "little"))]
2598 concat!("Converts `self` to big endian from the target's endianness.
2600 On big endian this is a no-op. On little endian the bytes are
2608 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2610 if cfg!(target_endian = \"big\") {
2611 assert_eq!(n.to_be(), n)
2613 assert_eq!(n.to_be(), n.swap_bytes())
2616 #[stable(feature = "rust1", since = "1.0.0")]
2618 pub const fn to_be(self) -> Self { // or not to be?
2619 #[cfg(target_endian = "big")]
2623 #[cfg(not(target_endian = "big"))]
2631 concat!("Converts `self` to little endian from the target's endianness.
2633 On little endian this is a no-op. On big endian the bytes are
2641 ", $Feature, "let n = 0x1A", stringify!($SelfT), ";
2643 if cfg!(target_endian = \"little\") {
2644 assert_eq!(n.to_le(), n)
2646 assert_eq!(n.to_le(), n.swap_bytes())
2649 #[stable(feature = "rust1", since = "1.0.0")]
2651 pub const fn to_le(self) -> Self {
2652 #[cfg(target_endian = "little")]
2656 #[cfg(not(target_endian = "little"))]
2664 concat!("Checked integer addition. Computes `self + rhs`, returning `None`
2665 if overflow occurred.
2672 ", $Feature, "assert_eq!((", stringify!($SelfT), "::max_value() - 2).checked_add(1), ",
2673 "Some(", stringify!($SelfT), "::max_value() - 1));
2674 assert_eq!((", stringify!($SelfT), "::max_value() - 2).checked_add(3), None);", $EndFeature, "
2676 #[stable(feature = "rust1", since = "1.0.0")]
2677 #[must_use = "this returns the result of the operation, \
2678 without modifying the original"]
2680 pub fn checked_add(self, rhs: Self) -> Option<Self> {
2681 let (a, b) = self.overflowing_add(rhs);
2682 if b {None} else {Some(a)}
2687 concat!("Checked integer subtraction. Computes `self - rhs`, returning
2688 `None` if overflow occurred.
2695 ", $Feature, "assert_eq!(1", stringify!($SelfT), ".checked_sub(1), Some(0));
2696 assert_eq!(0", stringify!($SelfT), ".checked_sub(1), None);", $EndFeature, "
2698 #[stable(feature = "rust1", since = "1.0.0")]
2699 #[must_use = "this returns the result of the operation, \
2700 without modifying the original"]
2702 pub fn checked_sub(self, rhs: Self) -> Option<Self> {
2703 let (a, b) = self.overflowing_sub(rhs);
2704 if b {None} else {Some(a)}
2709 concat!("Checked integer multiplication. Computes `self * rhs`, returning
2710 `None` if overflow occurred.
2717 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".checked_mul(1), Some(5));
2718 assert_eq!(", stringify!($SelfT), "::max_value().checked_mul(2), None);", $EndFeature, "
2720 #[stable(feature = "rust1", since = "1.0.0")]
2721 #[must_use = "this returns the result of the operation, \
2722 without modifying the original"]
2724 pub fn checked_mul(self, rhs: Self) -> Option<Self> {
2725 let (a, b) = self.overflowing_mul(rhs);
2726 if b {None} else {Some(a)}
2731 concat!("Checked integer division. Computes `self / rhs`, returning `None`
2739 ", $Feature, "assert_eq!(128", stringify!($SelfT), ".checked_div(2), Some(64));
2740 assert_eq!(1", stringify!($SelfT), ".checked_div(0), None);", $EndFeature, "
2742 #[stable(feature = "rust1", since = "1.0.0")]
2743 #[must_use = "this returns the result of the operation, \
2744 without modifying the original"]
2746 pub fn checked_div(self, rhs: Self) -> Option<Self> {
2749 rhs => Some(unsafe { intrinsics::unchecked_div(self, rhs) }),
2755 concat!("Checked Euclidean division. Computes `self.div_euclid(rhs)`, returning `None`
2763 #![feature(euclidean_division)]
2764 assert_eq!(128", stringify!($SelfT), ".checked_div_euclid(2), Some(64));
2765 assert_eq!(1", stringify!($SelfT), ".checked_div_euclid(0), None);
2767 #[unstable(feature = "euclidean_division", issue = "49048")]
2768 #[must_use = "this returns the result of the operation, \
2769 without modifying the original"]
2771 pub fn checked_div_euclid(self, rhs: Self) -> Option<Self> {
2775 Some(self.div_euclid(rhs))
2782 concat!("Checked integer remainder. Computes `self % rhs`, returning `None`
2790 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".checked_rem(2), Some(1));
2791 assert_eq!(5", stringify!($SelfT), ".checked_rem(0), None);", $EndFeature, "
2793 #[stable(feature = "wrapping", since = "1.7.0")]
2794 #[must_use = "this returns the result of the operation, \
2795 without modifying the original"]
2797 pub fn checked_rem(self, rhs: Self) -> Option<Self> {
2801 Some(unsafe { intrinsics::unchecked_rem(self, rhs) })
2807 concat!("Checked Euclidean modulo. Computes `self.rem_euclid(rhs)`, returning `None`
2815 #![feature(euclidean_division)]
2816 assert_eq!(5", stringify!($SelfT), ".checked_rem_euclid(2), Some(1));
2817 assert_eq!(5", stringify!($SelfT), ".checked_rem_euclid(0), None);
2819 #[unstable(feature = "euclidean_division", issue = "49048")]
2820 #[must_use = "this returns the result of the operation, \
2821 without modifying the original"]
2823 pub fn checked_rem_euclid(self, rhs: Self) -> Option<Self> {
2827 Some(self.rem_euclid(rhs))
2833 concat!("Checked negation. Computes `-self`, returning `None` unless `self ==
2836 Note that negating any positive integer will overflow.
2843 ", $Feature, "assert_eq!(0", stringify!($SelfT), ".checked_neg(), Some(0));
2844 assert_eq!(1", stringify!($SelfT), ".checked_neg(), None);", $EndFeature, "
2846 #[stable(feature = "wrapping", since = "1.7.0")]
2848 pub fn checked_neg(self) -> Option<Self> {
2849 let (a, b) = self.overflowing_neg();
2850 if b {None} else {Some(a)}
2855 concat!("Checked shift left. Computes `self << rhs`, returning `None`
2856 if `rhs` is larger than or equal to the number of bits in `self`.
2863 ", $Feature, "assert_eq!(0x1", stringify!($SelfT), ".checked_shl(4), Some(0x10));
2864 assert_eq!(0x10", stringify!($SelfT), ".checked_shl(129), None);", $EndFeature, "
2866 #[stable(feature = "wrapping", since = "1.7.0")]
2867 #[must_use = "this returns the result of the operation, \
2868 without modifying the original"]
2870 pub fn checked_shl(self, rhs: u32) -> Option<Self> {
2871 let (a, b) = self.overflowing_shl(rhs);
2872 if b {None} else {Some(a)}
2877 concat!("Checked shift right. Computes `self >> rhs`, returning `None`
2878 if `rhs` is larger than or equal to the number of bits in `self`.
2885 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".checked_shr(4), Some(0x1));
2886 assert_eq!(0x10", stringify!($SelfT), ".checked_shr(129), None);", $EndFeature, "
2888 #[stable(feature = "wrapping", since = "1.7.0")]
2889 #[must_use = "this returns the result of the operation, \
2890 without modifying the original"]
2892 pub fn checked_shr(self, rhs: u32) -> Option<Self> {
2893 let (a, b) = self.overflowing_shr(rhs);
2894 if b {None} else {Some(a)}
2899 concat!("Checked exponentiation. Computes `self.pow(exp)`, returning `None` if
2907 ", $Feature, "assert_eq!(2", stringify!($SelfT), ".checked_pow(5), Some(32));
2908 assert_eq!(", stringify!($SelfT), "::max_value().checked_pow(2), None);", $EndFeature, "
2910 #[stable(feature = "no_panic_pow", since = "1.34.0")]
2911 #[must_use = "this returns the result of the operation, \
2912 without modifying the original"]
2914 pub fn checked_pow(self, mut exp: u32) -> Option<Self> {
2915 let mut base = self;
2916 let mut acc: Self = 1;
2920 acc = acc.checked_mul(base)?;
2923 base = base.checked_mul(base)?;
2926 // Deal with the final bit of the exponent separately, since
2927 // squaring the base afterwards is not necessary and may cause a
2928 // needless overflow.
2930 acc = acc.checked_mul(base)?;
2938 concat!("Saturating integer addition. Computes `self + rhs`, saturating at
2939 the numeric bounds instead of overflowing.
2946 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_add(1), 101);
2947 assert_eq!(200u8.saturating_add(127), 255);", $EndFeature, "
2950 #[stable(feature = "rust1", since = "1.0.0")]
2951 #[must_use = "this returns the result of the operation, \
2952 without modifying the original"]
2953 #[rustc_const_unstable(feature = "const_saturating_int_methods")]
2955 pub const fn saturating_add(self, rhs: Self) -> Self {
2956 intrinsics::saturating_add(self, rhs)
2961 concat!("Saturating integer subtraction. Computes `self - rhs`, saturating
2962 at the numeric bounds instead of overflowing.
2969 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".saturating_sub(27), 73);
2970 assert_eq!(13", stringify!($SelfT), ".saturating_sub(127), 0);", $EndFeature, "
2972 #[stable(feature = "rust1", since = "1.0.0")]
2973 #[must_use = "this returns the result of the operation, \
2974 without modifying the original"]
2975 #[rustc_const_unstable(feature = "const_saturating_int_methods")]
2977 pub const fn saturating_sub(self, rhs: Self) -> Self {
2978 intrinsics::saturating_sub(self, rhs)
2983 concat!("Saturating integer multiplication. Computes `self * rhs`,
2984 saturating at the numeric bounds instead of overflowing.
2991 ", $Feature, "use std::", stringify!($SelfT), ";
2993 assert_eq!(2", stringify!($SelfT), ".saturating_mul(10), 20);
2994 assert_eq!((", stringify!($SelfT), "::MAX).saturating_mul(10), ", stringify!($SelfT),
2995 "::MAX);", $EndFeature, "
2997 #[stable(feature = "wrapping", since = "1.7.0")]
2998 #[must_use = "this returns the result of the operation, \
2999 without modifying the original"]
3001 pub fn saturating_mul(self, rhs: Self) -> Self {
3002 self.checked_mul(rhs).unwrap_or(Self::max_value())
3007 concat!("Saturating integer exponentiation. Computes `self.pow(exp)`,
3008 saturating at the numeric bounds instead of overflowing.
3015 ", $Feature, "use std::", stringify!($SelfT), ";
3017 assert_eq!(4", stringify!($SelfT), ".saturating_pow(3), 64);
3018 assert_eq!(", stringify!($SelfT), "::MAX.saturating_pow(2), ", stringify!($SelfT), "::MAX);",
3021 #[stable(feature = "no_panic_pow", since = "1.34.0")]
3022 #[must_use = "this returns the result of the operation, \
3023 without modifying the original"]
3025 pub fn saturating_pow(self, exp: u32) -> Self {
3026 match self.checked_pow(exp) {
3028 None => Self::max_value(),
3034 concat!("Wrapping (modular) addition. Computes `self + rhs`,
3035 wrapping around at the boundary of the type.
3042 ", $Feature, "assert_eq!(200", stringify!($SelfT), ".wrapping_add(55), 255);
3043 assert_eq!(200", stringify!($SelfT), ".wrapping_add(", stringify!($SelfT), "::max_value()), 199);",
3046 #[stable(feature = "rust1", since = "1.0.0")]
3047 #[must_use = "this returns the result of the operation, \
3048 without modifying the original"]
3050 pub const fn wrapping_add(self, rhs: Self) -> Self {
3051 intrinsics::overflowing_add(self, rhs)
3056 concat!("Wrapping (modular) subtraction. Computes `self - rhs`,
3057 wrapping around at the boundary of the type.
3064 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_sub(100), 0);
3065 assert_eq!(100", stringify!($SelfT), ".wrapping_sub(", stringify!($SelfT), "::max_value()), 101);",
3068 #[stable(feature = "rust1", since = "1.0.0")]
3069 #[must_use = "this returns the result of the operation, \
3070 without modifying the original"]
3072 pub const fn wrapping_sub(self, rhs: Self) -> Self {
3073 intrinsics::overflowing_sub(self, rhs)
3077 /// Wrapping (modular) multiplication. Computes `self *
3078 /// rhs`, wrapping around at the boundary of the type.
3084 /// Please note that this example is shared between integer types.
3085 /// Which explains why `u8` is used here.
3088 /// assert_eq!(10u8.wrapping_mul(12), 120);
3089 /// assert_eq!(25u8.wrapping_mul(12), 44);
3091 #[stable(feature = "rust1", since = "1.0.0")]
3092 #[must_use = "this returns the result of the operation, \
3093 without modifying the original"]
3095 pub const fn wrapping_mul(self, rhs: Self) -> Self {
3096 intrinsics::overflowing_mul(self, rhs)
3100 concat!("Wrapping (modular) division. Computes `self / rhs`.
3101 Wrapped division on unsigned types is just normal division.
3102 There's no way wrapping could ever happen.
3103 This function exists, so that all operations
3104 are accounted for in the wrapping operations.
3111 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_div(10), 10);", $EndFeature, "
3113 #[stable(feature = "num_wrapping", since = "1.2.0")]
3114 #[must_use = "this returns the result of the operation, \
3115 without modifying the original"]
3117 pub fn wrapping_div(self, rhs: Self) -> Self {
3123 concat!("Wrapping Euclidean division. Computes `self.div_euclid(rhs)`.
3124 Wrapped division on unsigned types is just normal division.
3125 There's no way wrapping could ever happen.
3126 This function exists, so that all operations
3127 are accounted for in the wrapping operations.
3128 Since, for the positive integers, all common
3129 definitions of division are equal, this
3130 is exactly equal to `self.wrapping_div(rhs)`.
3137 #![feature(euclidean_division)]
3138 assert_eq!(100", stringify!($SelfT), ".wrapping_div_euclid(10), 10);
3140 #[unstable(feature = "euclidean_division", issue = "49048")]
3141 #[must_use = "this returns the result of the operation, \
3142 without modifying the original"]
3144 pub fn wrapping_div_euclid(self, rhs: Self) -> Self {
3150 concat!("Wrapping (modular) remainder. Computes `self % rhs`.
3151 Wrapped remainder calculation on unsigned types is
3152 just the regular remainder calculation.
3153 There's no way wrapping could ever happen.
3154 This function exists, so that all operations
3155 are accounted for in the wrapping operations.
3162 ", $Feature, "assert_eq!(100", stringify!($SelfT), ".wrapping_rem(10), 0);", $EndFeature, "
3164 #[stable(feature = "num_wrapping", since = "1.2.0")]
3165 #[must_use = "this returns the result of the operation, \
3166 without modifying the original"]
3168 pub fn wrapping_rem(self, rhs: Self) -> Self {
3174 concat!("Wrapping Euclidean modulo. Computes `self.rem_euclid(rhs)`.
3175 Wrapped modulo calculation on unsigned types is
3176 just the regular remainder calculation.
3177 There's no way wrapping could ever happen.
3178 This function exists, so that all operations
3179 are accounted for in the wrapping operations.
3180 Since, for the positive integers, all common
3181 definitions of division are equal, this
3182 is exactly equal to `self.wrapping_rem(rhs)`.
3189 #![feature(euclidean_division)]
3190 assert_eq!(100", stringify!($SelfT), ".wrapping_rem_euclid(10), 0);
3192 #[unstable(feature = "euclidean_division", issue = "49048")]
3193 #[must_use = "this returns the result of the operation, \
3194 without modifying the original"]
3196 pub fn wrapping_rem_euclid(self, rhs: Self) -> Self {
3201 /// Wrapping (modular) negation. Computes `-self`,
3202 /// wrapping around at the boundary of the type.
3204 /// Since unsigned types do not have negative equivalents
3205 /// all applications of this function will wrap (except for `-0`).
3206 /// For values smaller than the corresponding signed type's maximum
3207 /// the result is the same as casting the corresponding signed value.
3208 /// Any larger values are equivalent to `MAX + 1 - (val - MAX - 1)` where
3209 /// `MAX` is the corresponding signed type's maximum.
3215 /// Please note that this example is shared between integer types.
3216 /// Which explains why `i8` is used here.
3219 /// assert_eq!(100i8.wrapping_neg(), -100);
3220 /// assert_eq!((-128i8).wrapping_neg(), -128);
3222 #[stable(feature = "num_wrapping", since = "1.2.0")]
3224 pub const fn wrapping_neg(self) -> Self {
3225 self.overflowing_neg().0
3229 concat!("Panic-free bitwise shift-left; yields `self << mask(rhs)`,
3230 where `mask` removes any high-order bits of `rhs` that
3231 would cause the shift to exceed the bitwidth of the type.
3233 Note that this is *not* the same as a rotate-left; the
3234 RHS of a wrapping shift-left is restricted to the range
3235 of the type, rather than the bits shifted out of the LHS
3236 being returned to the other end. The primitive integer
3237 types all implement a `rotate_left` function, which may
3238 be what you want instead.
3245 ", $Feature, "assert_eq!(1", stringify!($SelfT), ".wrapping_shl(7), 128);
3246 assert_eq!(1", stringify!($SelfT), ".wrapping_shl(128), 1);", $EndFeature, "
3248 #[stable(feature = "num_wrapping", since = "1.2.0")]
3249 #[must_use = "this returns the result of the operation, \
3250 without modifying the original"]
3252 pub const fn wrapping_shl(self, rhs: u32) -> Self {
3254 intrinsics::unchecked_shl(self, (rhs & ($BITS - 1)) as $SelfT)
3260 concat!("Panic-free bitwise shift-right; yields `self >> mask(rhs)`,
3261 where `mask` removes any high-order bits of `rhs` that
3262 would cause the shift to exceed the bitwidth of the type.
3264 Note that this is *not* the same as a rotate-right; the
3265 RHS of a wrapping shift-right is restricted to the range
3266 of the type, rather than the bits shifted out of the LHS
3267 being returned to the other end. The primitive integer
3268 types all implement a `rotate_right` function, which may
3269 be what you want instead.
3276 ", $Feature, "assert_eq!(128", stringify!($SelfT), ".wrapping_shr(7), 1);
3277 assert_eq!(128", stringify!($SelfT), ".wrapping_shr(128), 128);", $EndFeature, "
3279 #[stable(feature = "num_wrapping", since = "1.2.0")]
3280 #[must_use = "this returns the result of the operation, \
3281 without modifying the original"]
3283 pub const fn wrapping_shr(self, rhs: u32) -> Self {
3285 intrinsics::unchecked_shr(self, (rhs & ($BITS - 1)) as $SelfT)
3291 concat!("Wrapping (modular) exponentiation. Computes `self.pow(exp)`,
3292 wrapping around at the boundary of the type.
3299 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".wrapping_pow(5), 243);
3300 assert_eq!(3u8.wrapping_pow(6), 217);", $EndFeature, "
3302 #[stable(feature = "no_panic_pow", since = "1.34.0")]
3303 #[must_use = "this returns the result of the operation, \
3304 without modifying the original"]
3306 pub fn wrapping_pow(self, mut exp: u32) -> Self {
3307 let mut base = self;
3308 let mut acc: Self = 1;
3312 acc = acc.wrapping_mul(base);
3315 base = base.wrapping_mul(base);
3318 // Deal with the final bit of the exponent separately, since
3319 // squaring the base afterwards is not necessary and may cause a
3320 // needless overflow.
3322 acc = acc.wrapping_mul(base);
3330 concat!("Calculates `self` + `rhs`
3332 Returns a tuple of the addition along with a boolean indicating
3333 whether an arithmetic overflow would occur. If an overflow would
3334 have occurred then the wrapped value is returned.
3341 ", $Feature, "use std::", stringify!($SelfT), ";
3343 assert_eq!(5", stringify!($SelfT), ".overflowing_add(2), (7, false));
3344 assert_eq!(", stringify!($SelfT), "::MAX.overflowing_add(1), (0, true));", $EndFeature, "
3346 #[stable(feature = "wrapping", since = "1.7.0")]
3347 #[must_use = "this returns the result of the operation, \
3348 without modifying the original"]
3350 pub const fn overflowing_add(self, rhs: Self) -> (Self, bool) {
3351 let (a, b) = intrinsics::add_with_overflow(self as $ActualT, rhs as $ActualT);
3357 concat!("Calculates `self` - `rhs`
3359 Returns a tuple of the subtraction along with a boolean indicating
3360 whether an arithmetic overflow would occur. If an overflow would
3361 have occurred then the wrapped value is returned.
3368 ", $Feature, "use std::", stringify!($SelfT), ";
3370 assert_eq!(5", stringify!($SelfT), ".overflowing_sub(2), (3, false));
3371 assert_eq!(0", stringify!($SelfT), ".overflowing_sub(1), (", stringify!($SelfT), "::MAX, true));",
3374 #[stable(feature = "wrapping", since = "1.7.0")]
3375 #[must_use = "this returns the result of the operation, \
3376 without modifying the original"]
3378 pub const fn overflowing_sub(self, rhs: Self) -> (Self, bool) {
3379 let (a, b) = intrinsics::sub_with_overflow(self as $ActualT, rhs as $ActualT);
3384 /// Calculates the multiplication of `self` and `rhs`.
3386 /// Returns a tuple of the multiplication along with a boolean
3387 /// indicating whether an arithmetic overflow would occur. If an
3388 /// overflow would have occurred then the wrapped value is returned.
3394 /// Please note that this example is shared between integer types.
3395 /// Which explains why `u32` is used here.
3398 /// assert_eq!(5u32.overflowing_mul(2), (10, false));
3399 /// assert_eq!(1_000_000_000u32.overflowing_mul(10), (1410065408, true));
3401 #[stable(feature = "wrapping", since = "1.7.0")]
3402 #[must_use = "this returns the result of the operation, \
3403 without modifying the original"]
3405 pub const fn overflowing_mul(self, rhs: Self) -> (Self, bool) {
3406 let (a, b) = intrinsics::mul_with_overflow(self as $ActualT, rhs as $ActualT);
3411 concat!("Calculates the divisor when `self` is divided by `rhs`.
3413 Returns a tuple of the divisor along with a boolean indicating
3414 whether an arithmetic overflow would occur. Note that for unsigned
3415 integers overflow never occurs, so the second value is always
3420 This function will panic if `rhs` is 0.
3427 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".overflowing_div(2), (2, false));", $EndFeature, "
3430 #[stable(feature = "wrapping", since = "1.7.0")]
3431 #[must_use = "this returns the result of the operation, \
3432 without modifying the original"]
3433 pub fn overflowing_div(self, rhs: Self) -> (Self, bool) {
3439 concat!("Calculates the quotient of Euclidean division `self.div_euclid(rhs)`.
3441 Returns a tuple of the divisor along with a boolean indicating
3442 whether an arithmetic overflow would occur. Note that for unsigned
3443 integers overflow never occurs, so the second value is always
3445 Since, for the positive integers, all common
3446 definitions of division are equal, this
3447 is exactly equal to `self.overflowing_div(rhs)`.
3451 This function will panic if `rhs` is 0.
3458 #![feature(euclidean_division)]
3459 assert_eq!(5", stringify!($SelfT), ".overflowing_div_euclid(2), (2, false));
3462 #[unstable(feature = "euclidean_division", issue = "49048")]
3463 #[must_use = "this returns the result of the operation, \
3464 without modifying the original"]
3465 pub fn overflowing_div_euclid(self, rhs: Self) -> (Self, bool) {
3471 concat!("Calculates the remainder when `self` is divided by `rhs`.
3473 Returns a tuple of the remainder after dividing along with a boolean
3474 indicating whether an arithmetic overflow would occur. Note that for
3475 unsigned integers overflow never occurs, so the second value is
3480 This function will panic if `rhs` is 0.
3487 ", $Feature, "assert_eq!(5", stringify!($SelfT), ".overflowing_rem(2), (1, false));", $EndFeature, "
3490 #[stable(feature = "wrapping", since = "1.7.0")]
3491 #[must_use = "this returns the result of the operation, \
3492 without modifying the original"]
3493 pub fn overflowing_rem(self, rhs: Self) -> (Self, bool) {
3499 concat!("Calculates the remainder `self.rem_euclid(rhs)` as if by Euclidean division.
3501 Returns a tuple of the modulo after dividing along with a boolean
3502 indicating whether an arithmetic overflow would occur. Note that for
3503 unsigned integers overflow never occurs, so the second value is
3505 Since, for the positive integers, all common
3506 definitions of division are equal, this operation
3507 is exactly equal to `self.overflowing_rem(rhs)`.
3511 This function will panic if `rhs` is 0.
3518 #![feature(euclidean_division)]
3519 assert_eq!(5", stringify!($SelfT), ".overflowing_rem_euclid(2), (1, false));
3522 #[unstable(feature = "euclidean_division", issue = "49048")]
3523 #[must_use = "this returns the result of the operation, \
3524 without modifying the original"]
3525 pub fn overflowing_rem_euclid(self, rhs: Self) -> (Self, bool) {
3531 concat!("Negates self in an overflowing fashion.
3533 Returns `!self + 1` using wrapping operations to return the value
3534 that represents the negation of this unsigned value. Note that for
3535 positive unsigned values overflow always occurs, but negating 0 does
3543 ", $Feature, "assert_eq!(0", stringify!($SelfT), ".overflowing_neg(), (0, false));
3544 assert_eq!(2", stringify!($SelfT), ".overflowing_neg(), (-2i32 as ", stringify!($SelfT),
3545 ", true));", $EndFeature, "
3548 #[stable(feature = "wrapping", since = "1.7.0")]
3549 pub const fn overflowing_neg(self) -> (Self, bool) {
3550 ((!self).wrapping_add(1), self != 0)
3555 concat!("Shifts self left by `rhs` bits.
3557 Returns a tuple of the shifted version of self along with a boolean
3558 indicating whether the shift value was larger than or equal to the
3559 number of bits. If the shift value is too large, then value is
3560 masked (N-1) where N is the number of bits, and this value is then
3561 used to perform the shift.
3568 ", $Feature, "assert_eq!(0x1", stringify!($SelfT), ".overflowing_shl(4), (0x10, false));
3569 assert_eq!(0x1", stringify!($SelfT), ".overflowing_shl(132), (0x10, true));", $EndFeature, "
3571 #[stable(feature = "wrapping", since = "1.7.0")]
3572 #[must_use = "this returns the result of the operation, \
3573 without modifying the original"]
3575 pub const fn overflowing_shl(self, rhs: u32) -> (Self, bool) {
3576 (self.wrapping_shl(rhs), (rhs > ($BITS - 1)))
3581 concat!("Shifts self right by `rhs` bits.
3583 Returns a tuple of the shifted version of self along with a boolean
3584 indicating whether the shift value was larger than or equal to the
3585 number of bits. If the shift value is too large, then value is
3586 masked (N-1) where N is the number of bits, and this value is then
3587 used to perform the shift.
3594 ", $Feature, "assert_eq!(0x10", stringify!($SelfT), ".overflowing_shr(4), (0x1, false));
3595 assert_eq!(0x10", stringify!($SelfT), ".overflowing_shr(132), (0x1, true));", $EndFeature, "
3597 #[stable(feature = "wrapping", since = "1.7.0")]
3598 #[must_use = "this returns the result of the operation, \
3599 without modifying the original"]
3601 pub const fn overflowing_shr(self, rhs: u32) -> (Self, bool) {
3602 (self.wrapping_shr(rhs), (rhs > ($BITS - 1)))
3607 concat!("Raises self to the power of `exp`, using exponentiation by squaring.
3609 Returns a tuple of the exponentiation along with a bool indicating
3610 whether an overflow happened.
3617 ", $Feature, "assert_eq!(3", stringify!($SelfT), ".overflowing_pow(5), (243, false));
3618 assert_eq!(3u8.overflowing_pow(6), (217, true));", $EndFeature, "
3620 #[stable(feature = "no_panic_pow", since = "1.34.0")]
3621 #[must_use = "this returns the result of the operation, \
3622 without modifying the original"]
3624 pub fn overflowing_pow(self, mut exp: u32) -> (Self, bool) {
3625 let mut base = self;
3626 let mut acc: Self = 1;
3627 let mut overflown = false;
3628 // Scratch space for storing results of overflowing_mul.
3633 r = acc.overflowing_mul(base);
3638 r = base.overflowing_mul(base);
3643 // Deal with the final bit of the exponent separately, since
3644 // squaring the base afterwards is not necessary and may cause a
3645 // needless overflow.
3647 r = acc.overflowing_mul(base);
3657 concat!("Raises self to the power of `exp`, using exponentiation by squaring.
3664 ", $Feature, "assert_eq!(2", stringify!($SelfT), ".pow(5), 32);", $EndFeature, "
3666 #[stable(feature = "rust1", since = "1.0.0")]
3667 #[must_use = "this returns the result of the operation, \
3668 without modifying the original"]
3670 #[rustc_inherit_overflow_checks]
3671 pub fn pow(self, mut exp: u32) -> Self {
3672 let mut base = self;
3683 // Deal with the final bit of the exponent separately, since
3684 // squaring the base afterwards is not necessary and may cause a
3685 // needless overflow.
3695 concat!("Performs Euclidean division.
3697 Since, for the positive integers, all common
3698 definitions of division are equal, this
3699 is exactly equal to `self / rhs`.
3706 #![feature(euclidean_division)]
3707 assert_eq!(7", stringify!($SelfT), ".div_euclid(4), 1); // or any other integer type
3709 #[unstable(feature = "euclidean_division", issue = "49048")]
3710 #[must_use = "this returns the result of the operation, \
3711 without modifying the original"]
3713 #[rustc_inherit_overflow_checks]
3714 pub fn div_euclid(self, rhs: Self) -> Self {
3721 concat!("Calculates the least remainder of `self (mod rhs)`.
3723 Since, for the positive integers, all common
3724 definitions of division are equal, this
3725 is exactly equal to `self % rhs`.
3732 #![feature(euclidean_division)]
3733 assert_eq!(7", stringify!($SelfT), ".rem_euclid(4), 3); // or any other integer type
3735 #[unstable(feature = "euclidean_division", issue = "49048")]
3736 #[must_use = "this returns the result of the operation, \
3737 without modifying the original"]
3739 #[rustc_inherit_overflow_checks]
3740 pub fn rem_euclid(self, rhs: Self) -> Self {
3746 concat!("Returns `true` if and only if `self == 2^k` for some `k`.
3753 ", $Feature, "assert!(16", stringify!($SelfT), ".is_power_of_two());
3754 assert!(!10", stringify!($SelfT), ".is_power_of_two());", $EndFeature, "
3756 #[stable(feature = "rust1", since = "1.0.0")]
3758 pub fn is_power_of_two(self) -> bool {
3759 (self.wrapping_sub(1)) & self == 0 && !(self == 0)
3763 // Returns one less than next power of two.
3764 // (For 8u8 next power of two is 8u8 and for 6u8 it is 8u8)
3766 // 8u8.one_less_than_next_power_of_two() == 7
3767 // 6u8.one_less_than_next_power_of_two() == 7
3769 // This method cannot overflow, as in the `next_power_of_two`
3770 // overflow cases it instead ends up returning the maximum value
3771 // of the type, and can return 0 for 0.
3773 fn one_less_than_next_power_of_two(self) -> Self {
3774 if self <= 1 { return 0; }
3776 // Because `p > 0`, it cannot consist entirely of leading zeros.
3777 // That means the shift is always in-bounds, and some processors
3778 // (such as intel pre-haswell) have more efficient ctlz
3779 // intrinsics when the argument is non-zero.
3781 let z = unsafe { intrinsics::ctlz_nonzero(p) };
3782 <$SelfT>::max_value() >> z
3786 concat!("Returns the smallest power of two greater than or equal to `self`.
3788 When return value overflows (i.e., `self > (1 << (N-1))` for type
3789 `uN`), it panics in debug mode and return value is wrapped to 0 in
3790 release mode (the only situation in which method can return 0).
3797 ", $Feature, "assert_eq!(2", stringify!($SelfT), ".next_power_of_two(), 2);
3798 assert_eq!(3", stringify!($SelfT), ".next_power_of_two(), 4);", $EndFeature, "
3800 #[stable(feature = "rust1", since = "1.0.0")]
3802 pub fn next_power_of_two(self) -> Self {
3803 // Call the trait to get overflow checks
3804 ops::Add::add(self.one_less_than_next_power_of_two(), 1)
3809 concat!("Returns the smallest power of two greater than or equal to `n`. If
3810 the next power of two is greater than the type's maximum value,
3811 `None` is returned, otherwise the power of two is wrapped in `Some`.
3818 ", $Feature, "assert_eq!(2", stringify!($SelfT),
3819 ".checked_next_power_of_two(), Some(2));
3820 assert_eq!(3", stringify!($SelfT), ".checked_next_power_of_two(), Some(4));
3821 assert_eq!(", stringify!($SelfT), "::max_value().checked_next_power_of_two(), None);",
3825 #[stable(feature = "rust1", since = "1.0.0")]
3826 pub fn checked_next_power_of_two(self) -> Option<Self> {
3827 self.one_less_than_next_power_of_two().checked_add(1)
3832 concat!("Returns the smallest power of two greater than or equal to `n`. If
3833 the next power of two is greater than the type's maximum value,
3834 the return value is wrapped to `0`.
3841 #![feature(wrapping_next_power_of_two)]
3843 assert_eq!(2", stringify!($SelfT), ".wrapping_next_power_of_two(), 2);
3844 assert_eq!(3", stringify!($SelfT), ".wrapping_next_power_of_two(), 4);
3845 assert_eq!(", stringify!($SelfT), "::max_value().wrapping_next_power_of_two(), 0);",
3848 #[unstable(feature = "wrapping_next_power_of_two", issue = "32463",
3849 reason = "needs decision on wrapping behaviour")]
3850 pub fn wrapping_next_power_of_two(self) -> Self {
3851 self.one_less_than_next_power_of_two().wrapping_add(1)
3856 concat!("Return the memory representation of this integer as a byte array in
3857 big-endian (network) byte order.
3864 let bytes = ", $swap_op, stringify!($SelfT), ".to_be_bytes();
3865 assert_eq!(bytes, ", $be_bytes, ");
3867 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3868 #[rustc_const_unstable(feature = "const_int_conversion")]
3870 pub const fn to_be_bytes(self) -> [u8; mem::size_of::<Self>()] {
3871 self.to_be().to_ne_bytes()
3876 concat!("Return the memory representation of this integer as a byte array in
3877 little-endian byte order.
3884 let bytes = ", $swap_op, stringify!($SelfT), ".to_le_bytes();
3885 assert_eq!(bytes, ", $le_bytes, ");
3887 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3888 #[rustc_const_unstable(feature = "const_int_conversion")]
3890 pub const fn to_le_bytes(self) -> [u8; mem::size_of::<Self>()] {
3891 self.to_le().to_ne_bytes()
3897 Return the memory representation of this integer as a byte array in
3900 As the target platform's native endianness is used, portable code
3901 should use [`to_be_bytes`] or [`to_le_bytes`], as appropriate,
3906 [`to_be_bytes`]: #method.to_be_bytes
3907 [`to_le_bytes`]: #method.to_le_bytes
3912 let bytes = ", $swap_op, stringify!($SelfT), ".to_ne_bytes();
3913 assert_eq!(bytes, if cfg!(target_endian = \"big\") {
3919 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3920 #[rustc_const_unstable(feature = "const_int_conversion")]
3922 pub const fn to_ne_bytes(self) -> [u8; mem::size_of::<Self>()] {
3923 unsafe { mem::transmute(self) }
3928 concat!("Create an integer value from its representation as a byte array in
3936 let value = ", stringify!($SelfT), "::from_be_bytes(", $be_bytes, ");
3937 assert_eq!(value, ", $swap_op, ");
3940 When starting from a slice rather than an array, fallible conversion APIs can be used:
3943 use std::convert::TryInto;
3945 fn read_be_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
3946 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
3948 ", stringify!($SelfT), "::from_be_bytes(int_bytes.try_into().unwrap())
3951 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3952 #[rustc_const_unstable(feature = "const_int_conversion")]
3954 pub const fn from_be_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
3955 Self::from_be(Self::from_ne_bytes(bytes))
3961 Create an integer value from its representation as a byte array in
3969 let value = ", stringify!($SelfT), "::from_le_bytes(", $le_bytes, ");
3970 assert_eq!(value, ", $swap_op, ");
3973 When starting from a slice rather than an array, fallible conversion APIs can be used:
3976 use std::convert::TryInto;
3978 fn read_le_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
3979 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
3981 ", stringify!($SelfT), "::from_le_bytes(int_bytes.try_into().unwrap())
3984 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
3985 #[rustc_const_unstable(feature = "const_int_conversion")]
3987 pub const fn from_le_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
3988 Self::from_le(Self::from_ne_bytes(bytes))
3993 concat!("Create an integer value from its memory representation as a byte
3994 array in native endianness.
3996 As the target platform's native endianness is used, portable code
3997 likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as
3998 appropriate instead.
4000 [`from_be_bytes`]: #method.from_be_bytes
4001 [`from_le_bytes`]: #method.from_le_bytes
4008 let value = ", stringify!($SelfT), "::from_ne_bytes(if cfg!(target_endian = \"big\") {
4013 assert_eq!(value, ", $swap_op, ");
4016 When starting from a slice rather than an array, fallible conversion APIs can be used:
4019 use std::convert::TryInto;
4021 fn read_ne_", stringify!($SelfT), "(input: &mut &[u8]) -> ", stringify!($SelfT), " {
4022 let (int_bytes, rest) = input.split_at(std::mem::size_of::<", stringify!($SelfT), ">());
4024 ", stringify!($SelfT), "::from_ne_bytes(int_bytes.try_into().unwrap())
4027 #[stable(feature = "int_to_from_bytes", since = "1.32.0")]
4028 #[rustc_const_unstable(feature = "const_int_conversion")]
4030 pub const fn from_ne_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self {
4031 unsafe { mem::transmute(bytes) }
4039 uint_impl! { u8, u8, 8, 255, "", "", 2, "0x82", "0xa", "0x12", "0x12", "0x48", "[0x12]",
4043 /// Checks if the value is within the ASCII range.
4048 /// let ascii = 97u8;
4049 /// let non_ascii = 150u8;
4051 /// assert!(ascii.is_ascii());
4052 /// assert!(!non_ascii.is_ascii());
4054 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4056 pub fn is_ascii(&self) -> bool {
4060 /// Makes a copy of the value in its ASCII upper case equivalent.
4062 /// ASCII letters 'a' to 'z' are mapped to 'A' to 'Z',
4063 /// but non-ASCII letters are unchanged.
4065 /// To uppercase the value in-place, use [`make_ascii_uppercase`].
4070 /// let lowercase_a = 97u8;
4072 /// assert_eq!(65, lowercase_a.to_ascii_uppercase());
4075 /// [`make_ascii_uppercase`]: #method.make_ascii_uppercase
4076 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4078 pub fn to_ascii_uppercase(&self) -> u8 {
4079 // Unset the fith bit if this is a lowercase letter
4080 *self & !((self.is_ascii_lowercase() as u8) << 5)
4083 /// Makes a copy of the value in its ASCII lower case equivalent.
4085 /// ASCII letters 'A' to 'Z' are mapped to 'a' to 'z',
4086 /// but non-ASCII letters are unchanged.
4088 /// To lowercase the value in-place, use [`make_ascii_lowercase`].
4093 /// let uppercase_a = 65u8;
4095 /// assert_eq!(97, uppercase_a.to_ascii_lowercase());
4098 /// [`make_ascii_lowercase`]: #method.make_ascii_lowercase
4099 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4101 pub fn to_ascii_lowercase(&self) -> u8 {
4102 // Set the fith bit if this is an uppercase letter
4103 *self | ((self.is_ascii_uppercase() as u8) << 5)
4106 /// Checks that two values are an ASCII case-insensitive match.
4108 /// This is equivalent to `to_ascii_lowercase(a) == to_ascii_lowercase(b)`.
4113 /// let lowercase_a = 97u8;
4114 /// let uppercase_a = 65u8;
4116 /// assert!(lowercase_a.eq_ignore_ascii_case(&uppercase_a));
4118 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4120 pub fn eq_ignore_ascii_case(&self, other: &u8) -> bool {
4121 self.to_ascii_lowercase() == other.to_ascii_lowercase()
4124 /// Converts this value to its ASCII upper case equivalent in-place.
4126 /// ASCII letters 'a' to 'z' are mapped to 'A' to 'Z',
4127 /// but non-ASCII letters are unchanged.
4129 /// To return a new uppercased value without modifying the existing one, use
4130 /// [`to_ascii_uppercase`].
4135 /// let mut byte = b'a';
4137 /// byte.make_ascii_uppercase();
4139 /// assert_eq!(b'A', byte);
4142 /// [`to_ascii_uppercase`]: #method.to_ascii_uppercase
4143 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4145 pub fn make_ascii_uppercase(&mut self) {
4146 *self = self.to_ascii_uppercase();
4149 /// Converts this value to its ASCII lower case equivalent in-place.
4151 /// ASCII letters 'A' to 'Z' are mapped to 'a' to 'z',
4152 /// but non-ASCII letters are unchanged.
4154 /// To return a new lowercased value without modifying the existing one, use
4155 /// [`to_ascii_lowercase`].
4160 /// let mut byte = b'A';
4162 /// byte.make_ascii_lowercase();
4164 /// assert_eq!(b'a', byte);
4167 /// [`to_ascii_lowercase`]: #method.to_ascii_lowercase
4168 #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")]
4170 pub fn make_ascii_lowercase(&mut self) {
4171 *self = self.to_ascii_lowercase();
4174 /// Checks if the value is an ASCII alphabetic character:
4176 /// - U+0041 'A' ... U+005A 'Z', or
4177 /// - U+0061 'a' ... U+007A 'z'.
4182 /// let uppercase_a = b'A';
4183 /// let uppercase_g = b'G';
4186 /// let zero = b'0';
4187 /// let percent = b'%';
4188 /// let space = b' ';
4190 /// let esc = 0x1b_u8;
4192 /// assert!(uppercase_a.is_ascii_alphabetic());
4193 /// assert!(uppercase_g.is_ascii_alphabetic());
4194 /// assert!(a.is_ascii_alphabetic());
4195 /// assert!(g.is_ascii_alphabetic());
4196 /// assert!(!zero.is_ascii_alphabetic());
4197 /// assert!(!percent.is_ascii_alphabetic());
4198 /// assert!(!space.is_ascii_alphabetic());
4199 /// assert!(!lf.is_ascii_alphabetic());
4200 /// assert!(!esc.is_ascii_alphabetic());
4202 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4204 pub fn is_ascii_alphabetic(&self) -> bool {
4206 b'A'..=b'Z' | b'a'..=b'z' => true,
4211 /// Checks if the value is an ASCII uppercase character:
4212 /// U+0041 'A' ... U+005A 'Z'.
4217 /// let uppercase_a = b'A';
4218 /// let uppercase_g = b'G';
4221 /// let zero = b'0';
4222 /// let percent = b'%';
4223 /// let space = b' ';
4225 /// let esc = 0x1b_u8;
4227 /// assert!(uppercase_a.is_ascii_uppercase());
4228 /// assert!(uppercase_g.is_ascii_uppercase());
4229 /// assert!(!a.is_ascii_uppercase());
4230 /// assert!(!g.is_ascii_uppercase());
4231 /// assert!(!zero.is_ascii_uppercase());
4232 /// assert!(!percent.is_ascii_uppercase());
4233 /// assert!(!space.is_ascii_uppercase());
4234 /// assert!(!lf.is_ascii_uppercase());
4235 /// assert!(!esc.is_ascii_uppercase());
4237 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4239 pub fn is_ascii_uppercase(&self) -> bool {
4241 b'A'..=b'Z' => true,
4246 /// Checks if the value is an ASCII lowercase character:
4247 /// U+0061 'a' ... U+007A 'z'.
4252 /// let uppercase_a = b'A';
4253 /// let uppercase_g = b'G';
4256 /// let zero = b'0';
4257 /// let percent = b'%';
4258 /// let space = b' ';
4260 /// let esc = 0x1b_u8;
4262 /// assert!(!uppercase_a.is_ascii_lowercase());
4263 /// assert!(!uppercase_g.is_ascii_lowercase());
4264 /// assert!(a.is_ascii_lowercase());
4265 /// assert!(g.is_ascii_lowercase());
4266 /// assert!(!zero.is_ascii_lowercase());
4267 /// assert!(!percent.is_ascii_lowercase());
4268 /// assert!(!space.is_ascii_lowercase());
4269 /// assert!(!lf.is_ascii_lowercase());
4270 /// assert!(!esc.is_ascii_lowercase());
4272 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4274 pub fn is_ascii_lowercase(&self) -> bool {
4276 b'a'..=b'z' => true,
4281 /// Checks if the value is an ASCII alphanumeric character:
4283 /// - U+0041 'A' ... U+005A 'Z', or
4284 /// - U+0061 'a' ... U+007A 'z', or
4285 /// - U+0030 '0' ... U+0039 '9'.
4290 /// let uppercase_a = b'A';
4291 /// let uppercase_g = b'G';
4294 /// let zero = b'0';
4295 /// let percent = b'%';
4296 /// let space = b' ';
4298 /// let esc = 0x1b_u8;
4300 /// assert!(uppercase_a.is_ascii_alphanumeric());
4301 /// assert!(uppercase_g.is_ascii_alphanumeric());
4302 /// assert!(a.is_ascii_alphanumeric());
4303 /// assert!(g.is_ascii_alphanumeric());
4304 /// assert!(zero.is_ascii_alphanumeric());
4305 /// assert!(!percent.is_ascii_alphanumeric());
4306 /// assert!(!space.is_ascii_alphanumeric());
4307 /// assert!(!lf.is_ascii_alphanumeric());
4308 /// assert!(!esc.is_ascii_alphanumeric());
4310 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4312 pub fn is_ascii_alphanumeric(&self) -> bool {
4314 b'0'..=b'9' | b'A'..=b'Z' | b'a'..=b'z' => true,
4319 /// Checks if the value is an ASCII decimal digit:
4320 /// U+0030 '0' ... U+0039 '9'.
4325 /// let uppercase_a = b'A';
4326 /// let uppercase_g = b'G';
4329 /// let zero = b'0';
4330 /// let percent = b'%';
4331 /// let space = b' ';
4333 /// let esc = 0x1b_u8;
4335 /// assert!(!uppercase_a.is_ascii_digit());
4336 /// assert!(!uppercase_g.is_ascii_digit());
4337 /// assert!(!a.is_ascii_digit());
4338 /// assert!(!g.is_ascii_digit());
4339 /// assert!(zero.is_ascii_digit());
4340 /// assert!(!percent.is_ascii_digit());
4341 /// assert!(!space.is_ascii_digit());
4342 /// assert!(!lf.is_ascii_digit());
4343 /// assert!(!esc.is_ascii_digit());
4345 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4347 pub fn is_ascii_digit(&self) -> bool {
4349 b'0'..=b'9' => true,
4354 /// Checks if the value is an ASCII hexadecimal digit:
4356 /// - U+0030 '0' ... U+0039 '9', or
4357 /// - U+0041 'A' ... U+0046 'F', or
4358 /// - U+0061 'a' ... U+0066 'f'.
4363 /// let uppercase_a = b'A';
4364 /// let uppercase_g = b'G';
4367 /// let zero = b'0';
4368 /// let percent = b'%';
4369 /// let space = b' ';
4371 /// let esc = 0x1b_u8;
4373 /// assert!(uppercase_a.is_ascii_hexdigit());
4374 /// assert!(!uppercase_g.is_ascii_hexdigit());
4375 /// assert!(a.is_ascii_hexdigit());
4376 /// assert!(!g.is_ascii_hexdigit());
4377 /// assert!(zero.is_ascii_hexdigit());
4378 /// assert!(!percent.is_ascii_hexdigit());
4379 /// assert!(!space.is_ascii_hexdigit());
4380 /// assert!(!lf.is_ascii_hexdigit());
4381 /// assert!(!esc.is_ascii_hexdigit());
4383 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4385 pub fn is_ascii_hexdigit(&self) -> bool {
4387 b'0'..=b'9' | b'A'..=b'F' | b'a'..=b'f' => true,
4392 /// Checks if the value is an ASCII punctuation character:
4394 /// - U+0021 ... U+002F `! " # $ % & ' ( ) * + , - . /`, or
4395 /// - U+003A ... U+0040 `: ; < = > ? @`, or
4396 /// - U+005B ... U+0060 ``[ \ ] ^ _ ` ``, or
4397 /// - U+007B ... U+007E `{ | } ~`
4402 /// let uppercase_a = b'A';
4403 /// let uppercase_g = b'G';
4406 /// let zero = b'0';
4407 /// let percent = b'%';
4408 /// let space = b' ';
4410 /// let esc = 0x1b_u8;
4412 /// assert!(!uppercase_a.is_ascii_punctuation());
4413 /// assert!(!uppercase_g.is_ascii_punctuation());
4414 /// assert!(!a.is_ascii_punctuation());
4415 /// assert!(!g.is_ascii_punctuation());
4416 /// assert!(!zero.is_ascii_punctuation());
4417 /// assert!(percent.is_ascii_punctuation());
4418 /// assert!(!space.is_ascii_punctuation());
4419 /// assert!(!lf.is_ascii_punctuation());
4420 /// assert!(!esc.is_ascii_punctuation());
4422 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4424 pub fn is_ascii_punctuation(&self) -> bool {
4426 b'!'..=b'/' | b':'..=b'@' | b'['..=b'`' | b'{'..=b'~' => true,
4431 /// Checks if the value is an ASCII graphic character:
4432 /// U+0021 '!' ... U+007E '~'.
4437 /// let uppercase_a = b'A';
4438 /// let uppercase_g = b'G';
4441 /// let zero = b'0';
4442 /// let percent = b'%';
4443 /// let space = b' ';
4445 /// let esc = 0x1b_u8;
4447 /// assert!(uppercase_a.is_ascii_graphic());
4448 /// assert!(uppercase_g.is_ascii_graphic());
4449 /// assert!(a.is_ascii_graphic());
4450 /// assert!(g.is_ascii_graphic());
4451 /// assert!(zero.is_ascii_graphic());
4452 /// assert!(percent.is_ascii_graphic());
4453 /// assert!(!space.is_ascii_graphic());
4454 /// assert!(!lf.is_ascii_graphic());
4455 /// assert!(!esc.is_ascii_graphic());
4457 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4459 pub fn is_ascii_graphic(&self) -> bool {
4461 b'!'..=b'~' => true,
4466 /// Checks if the value is an ASCII whitespace character:
4467 /// U+0020 SPACE, U+0009 HORIZONTAL TAB, U+000A LINE FEED,
4468 /// U+000C FORM FEED, or U+000D CARRIAGE RETURN.
4470 /// Rust uses the WhatWG Infra Standard's [definition of ASCII
4471 /// whitespace][infra-aw]. There are several other definitions in
4472 /// wide use. For instance, [the POSIX locale][pct] includes
4473 /// U+000B VERTICAL TAB as well as all the above characters,
4474 /// but—from the very same specification—[the default rule for
4475 /// "field splitting" in the Bourne shell][bfs] considers *only*
4476 /// SPACE, HORIZONTAL TAB, and LINE FEED as whitespace.
4478 /// If you are writing a program that will process an existing
4479 /// file format, check what that format's definition of whitespace is
4480 /// before using this function.
4482 /// [infra-aw]: https://infra.spec.whatwg.org/#ascii-whitespace
4483 /// [pct]: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_01
4484 /// [bfs]: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05
4489 /// let uppercase_a = b'A';
4490 /// let uppercase_g = b'G';
4493 /// let zero = b'0';
4494 /// let percent = b'%';
4495 /// let space = b' ';
4497 /// let esc = 0x1b_u8;
4499 /// assert!(!uppercase_a.is_ascii_whitespace());
4500 /// assert!(!uppercase_g.is_ascii_whitespace());
4501 /// assert!(!a.is_ascii_whitespace());
4502 /// assert!(!g.is_ascii_whitespace());
4503 /// assert!(!zero.is_ascii_whitespace());
4504 /// assert!(!percent.is_ascii_whitespace());
4505 /// assert!(space.is_ascii_whitespace());
4506 /// assert!(lf.is_ascii_whitespace());
4507 /// assert!(!esc.is_ascii_whitespace());
4509 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4511 pub fn is_ascii_whitespace(&self) -> bool {
4513 b'\t' | b'\n' | b'\x0C' | b'\r' | b' ' => true,
4518 /// Checks if the value is an ASCII control character:
4519 /// U+0000 NUL ... U+001F UNIT SEPARATOR, or U+007F DELETE.
4520 /// Note that most ASCII whitespace characters are control
4521 /// characters, but SPACE is not.
4526 /// let uppercase_a = b'A';
4527 /// let uppercase_g = b'G';
4530 /// let zero = b'0';
4531 /// let percent = b'%';
4532 /// let space = b' ';
4534 /// let esc = 0x1b_u8;
4536 /// assert!(!uppercase_a.is_ascii_control());
4537 /// assert!(!uppercase_g.is_ascii_control());
4538 /// assert!(!a.is_ascii_control());
4539 /// assert!(!g.is_ascii_control());
4540 /// assert!(!zero.is_ascii_control());
4541 /// assert!(!percent.is_ascii_control());
4542 /// assert!(!space.is_ascii_control());
4543 /// assert!(lf.is_ascii_control());
4544 /// assert!(esc.is_ascii_control());
4546 #[stable(feature = "ascii_ctype_on_intrinsics", since = "1.24.0")]
4548 pub fn is_ascii_control(&self) -> bool {
4550 b'\0'..=b'\x1F' | b'\x7F' => true,
4558 uint_impl! { u16, u16, 16, 65535, "", "", 4, "0xa003", "0x3a", "0x1234", "0x3412", "0x2c48",
4559 "[0x34, 0x12]", "[0x12, 0x34]", "", "" }
4564 uint_impl! { u32, u32, 32, 4294967295, "", "", 8, "0x10000b3", "0xb301", "0x12345678",
4565 "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]", "[0x12, 0x34, 0x56, 0x78]", "", "" }
4570 uint_impl! { u64, u64, 64, 18446744073709551615, "", "", 12, "0xaa00000000006e1", "0x6e10aa",
4571 "0x1234567890123456", "0x5634129078563412", "0x6a2c48091e6a2c48",
4572 "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
4573 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]",
4579 uint_impl! { u128, u128, 128, 340282366920938463463374607431768211455, "", "", 16,
4580 "0x13f40000000000000000000000004f76", "0x4f7613f4", "0x12345678901234567890123456789012",
4581 "0x12907856341290785634129078563412", "0x48091e6a2c48091e6a2c48091e6a2c48",
4582 "[0x12, 0x90, 0x78, 0x56, 0x34, 0x12, 0x90, 0x78, \
4583 0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
4584 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56, \
4585 0x78, 0x90, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12]",
4589 #[cfg(target_pointer_width = "16")]
4592 uint_impl! { usize, u16, 16, 65535, "", "", 4, "0xa003", "0x3a", "0x1234", "0x3412", "0x2c48",
4593 "[0x34, 0x12]", "[0x12, 0x34]",
4594 usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
4596 #[cfg(target_pointer_width = "32")]
4599 uint_impl! { usize, u32, 32, 4294967295, "", "", 8, "0x10000b3", "0xb301", "0x12345678",
4600 "0x78563412", "0x1e6a2c48", "[0x78, 0x56, 0x34, 0x12]", "[0x12, 0x34, 0x56, 0x78]",
4601 usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
4604 #[cfg(target_pointer_width = "64")]
4607 uint_impl! { usize, u64, 64, 18446744073709551615, "", "", 12, "0xaa00000000006e1", "0x6e10aa",
4608 "0x1234567890123456", "0x5634129078563412", "0x6a2c48091e6a2c48",
4609 "[0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12]",
4610 "[0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]",
4611 usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() }
4614 /// A classification of floating point numbers.
4616 /// This `enum` is used as the return type for [`f32::classify`] and [`f64::classify`]. See
4617 /// their documentation for more.
4619 /// [`f32::classify`]: ../../std/primitive.f32.html#method.classify
4620 /// [`f64::classify`]: ../../std/primitive.f64.html#method.classify
4625 /// use std::num::FpCategory;
4628 /// let num = 12.4_f32;
4629 /// let inf = f32::INFINITY;
4630 /// let zero = 0f32;
4631 /// let sub: f32 = 1.1754942e-38;
4632 /// let nan = f32::NAN;
4634 /// assert_eq!(num.classify(), FpCategory::Normal);
4635 /// assert_eq!(inf.classify(), FpCategory::Infinite);
4636 /// assert_eq!(zero.classify(), FpCategory::Zero);
4637 /// assert_eq!(nan.classify(), FpCategory::Nan);
4638 /// assert_eq!(sub.classify(), FpCategory::Subnormal);
4640 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
4641 #[stable(feature = "rust1", since = "1.0.0")]
4642 pub enum FpCategory {
4643 /// "Not a Number", often obtained by dividing by zero.
4644 #[stable(feature = "rust1", since = "1.0.0")]
4647 /// Positive or negative infinity.
4648 #[stable(feature = "rust1", since = "1.0.0")]
4651 /// Positive or negative zero.
4652 #[stable(feature = "rust1", since = "1.0.0")]
4655 /// De-normalized floating point representation (less precise than `Normal`).
4656 #[stable(feature = "rust1", since = "1.0.0")]
4659 /// A regular floating point number.
4660 #[stable(feature = "rust1", since = "1.0.0")]
4664 macro_rules! from_str_radix_int_impl {
4666 #[stable(feature = "rust1", since = "1.0.0")]
4667 impl FromStr for $t {
4668 type Err = ParseIntError;
4669 fn from_str(src: &str) -> Result<Self, ParseIntError> {
4670 from_str_radix(src, 10)
4675 from_str_radix_int_impl! { isize i8 i16 i32 i64 i128 usize u8 u16 u32 u64 u128 }
4677 /// The error type returned when a checked integral type conversion fails.
4678 #[stable(feature = "try_from", since = "1.34.0")]
4679 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
4680 pub struct TryFromIntError(());
4682 impl TryFromIntError {
4683 #[unstable(feature = "int_error_internals",
4684 reason = "available through Error trait and this method should \
4685 not be exposed publicly",
4688 pub fn __description(&self) -> &str {
4689 "out of range integral type conversion attempted"
4693 #[stable(feature = "try_from", since = "1.34.0")]
4694 impl fmt::Display for TryFromIntError {
4695 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
4696 self.__description().fmt(fmt)
4700 #[stable(feature = "try_from", since = "1.34.0")]
4701 impl From<Infallible> for TryFromIntError {
4702 fn from(x: Infallible) -> TryFromIntError {
4707 #[unstable(feature = "never_type", issue = "35121")]
4708 impl From<!> for TryFromIntError {
4709 fn from(never: !) -> TryFromIntError {
4710 // Match rather than coerce to make sure that code like
4711 // `From<Infallible> for TryFromIntError` above will keep working
4712 // when `Infallible` becomes an alias to `!`.
4717 // no possible bounds violation
4718 macro_rules! try_from_unbounded {
4719 ($source:ty, $($target:ty),*) => {$(
4720 #[stable(feature = "try_from", since = "1.34.0")]
4721 impl TryFrom<$source> for $target {
4722 type Error = TryFromIntError;
4724 /// Try to create the target number type from a source
4725 /// number type. This returns an error if the source value
4726 /// is outside of the range of the target type.
4728 fn try_from(value: $source) -> Result<Self, Self::Error> {
4729 Ok(value as $target)
4735 // only negative bounds
4736 macro_rules! try_from_lower_bounded {
4737 ($source:ty, $($target:ty),*) => {$(
4738 #[stable(feature = "try_from", since = "1.34.0")]
4739 impl TryFrom<$source> for $target {
4740 type Error = TryFromIntError;
4742 /// Try to create the target number type from a source
4743 /// number type. This returns an error if the source value
4744 /// is outside of the range of the target type.
4746 fn try_from(u: $source) -> Result<$target, TryFromIntError> {
4750 Err(TryFromIntError(()))
4757 // unsigned to signed (only positive bound)
4758 macro_rules! try_from_upper_bounded {
4759 ($source:ty, $($target:ty),*) => {$(
4760 #[stable(feature = "try_from", since = "1.34.0")]
4761 impl TryFrom<$source> for $target {
4762 type Error = TryFromIntError;
4764 /// Try to create the target number type from a source
4765 /// number type. This returns an error if the source value
4766 /// is outside of the range of the target type.
4768 fn try_from(u: $source) -> Result<$target, TryFromIntError> {
4769 if u > (<$target>::max_value() as $source) {
4770 Err(TryFromIntError(()))
4780 macro_rules! try_from_both_bounded {
4781 ($source:ty, $($target:ty),*) => {$(
4782 #[stable(feature = "try_from", since = "1.34.0")]
4783 impl TryFrom<$source> for $target {
4784 type Error = TryFromIntError;
4786 /// Try to create the target number type from a source
4787 /// number type. This returns an error if the source value
4788 /// is outside of the range of the target type.
4790 fn try_from(u: $source) -> Result<$target, TryFromIntError> {
4791 let min = <$target>::min_value() as $source;
4792 let max = <$target>::max_value() as $source;
4793 if u < min || u > max {
4794 Err(TryFromIntError(()))
4804 ($mac:ident, $source:ty, $($target:ty),*) => {$(
4805 $mac!($target, $source);
4809 // intra-sign conversions
4810 try_from_upper_bounded!(u16, u8);
4811 try_from_upper_bounded!(u32, u16, u8);
4812 try_from_upper_bounded!(u64, u32, u16, u8);
4813 try_from_upper_bounded!(u128, u64, u32, u16, u8);
4815 try_from_both_bounded!(i16, i8);
4816 try_from_both_bounded!(i32, i16, i8);
4817 try_from_both_bounded!(i64, i32, i16, i8);
4818 try_from_both_bounded!(i128, i64, i32, i16, i8);
4820 // unsigned-to-signed
4821 try_from_upper_bounded!(u8, i8);
4822 try_from_upper_bounded!(u16, i8, i16);
4823 try_from_upper_bounded!(u32, i8, i16, i32);
4824 try_from_upper_bounded!(u64, i8, i16, i32, i64);
4825 try_from_upper_bounded!(u128, i8, i16, i32, i64, i128);
4827 // signed-to-unsigned
4828 try_from_lower_bounded!(i8, u8, u16, u32, u64, u128);
4829 try_from_lower_bounded!(i16, u16, u32, u64, u128);
4830 try_from_lower_bounded!(i32, u32, u64, u128);
4831 try_from_lower_bounded!(i64, u64, u128);
4832 try_from_lower_bounded!(i128, u128);
4833 try_from_both_bounded!(i16, u8);
4834 try_from_both_bounded!(i32, u16, u8);
4835 try_from_both_bounded!(i64, u32, u16, u8);
4836 try_from_both_bounded!(i128, u64, u32, u16, u8);
4839 try_from_upper_bounded!(usize, isize);
4840 try_from_lower_bounded!(isize, usize);
4842 #[cfg(target_pointer_width = "16")]
4843 mod ptr_try_from_impls {
4844 use super::TryFromIntError;
4845 use crate::convert::TryFrom;
4847 try_from_upper_bounded!(usize, u8);
4848 try_from_unbounded!(usize, u16, u32, u64, u128);
4849 try_from_upper_bounded!(usize, i8, i16);
4850 try_from_unbounded!(usize, i32, i64, i128);
4852 try_from_both_bounded!(isize, u8);
4853 try_from_lower_bounded!(isize, u16, u32, u64, u128);
4854 try_from_both_bounded!(isize, i8);
4855 try_from_unbounded!(isize, i16, i32, i64, i128);
4857 rev!(try_from_upper_bounded, usize, u32, u64, u128);
4858 rev!(try_from_lower_bounded, usize, i8, i16);
4859 rev!(try_from_both_bounded, usize, i32, i64, i128);
4861 rev!(try_from_upper_bounded, isize, u16, u32, u64, u128);
4862 rev!(try_from_both_bounded, isize, i32, i64, i128);
4865 #[cfg(target_pointer_width = "32")]
4866 mod ptr_try_from_impls {
4867 use super::TryFromIntError;
4868 use crate::convert::TryFrom;
4870 try_from_upper_bounded!(usize, u8, u16);
4871 try_from_unbounded!(usize, u32, u64, u128);
4872 try_from_upper_bounded!(usize, i8, i16, i32);
4873 try_from_unbounded!(usize, i64, i128);
4875 try_from_both_bounded!(isize, u8, u16);
4876 try_from_lower_bounded!(isize, u32, u64, u128);
4877 try_from_both_bounded!(isize, i8, i16);
4878 try_from_unbounded!(isize, i32, i64, i128);
4880 rev!(try_from_unbounded, usize, u32);
4881 rev!(try_from_upper_bounded, usize, u64, u128);
4882 rev!(try_from_lower_bounded, usize, i8, i16, i32);
4883 rev!(try_from_both_bounded, usize, i64, i128);
4885 rev!(try_from_unbounded, isize, u16);
4886 rev!(try_from_upper_bounded, isize, u32, u64, u128);
4887 rev!(try_from_unbounded, isize, i32);
4888 rev!(try_from_both_bounded, isize, i64, i128);
4891 #[cfg(target_pointer_width = "64")]
4892 mod ptr_try_from_impls {
4893 use super::TryFromIntError;
4894 use crate::convert::TryFrom;
4896 try_from_upper_bounded!(usize, u8, u16, u32);
4897 try_from_unbounded!(usize, u64, u128);
4898 try_from_upper_bounded!(usize, i8, i16, i32, i64);
4899 try_from_unbounded!(usize, i128);
4901 try_from_both_bounded!(isize, u8, u16, u32);
4902 try_from_lower_bounded!(isize, u64, u128);
4903 try_from_both_bounded!(isize, i8, i16, i32);
4904 try_from_unbounded!(isize, i64, i128);
4906 rev!(try_from_unbounded, usize, u32, u64);
4907 rev!(try_from_upper_bounded, usize, u128);
4908 rev!(try_from_lower_bounded, usize, i8, i16, i32, i64);
4909 rev!(try_from_both_bounded, usize, i128);
4911 rev!(try_from_unbounded, isize, u16, u32);
4912 rev!(try_from_upper_bounded, isize, u64, u128);
4913 rev!(try_from_unbounded, isize, i32, i64);
4914 rev!(try_from_both_bounded, isize, i128);
4918 trait FromStrRadixHelper: PartialOrd + Copy {
4919 fn min_value() -> Self;
4920 fn max_value() -> Self;
4921 fn from_u32(u: u32) -> Self;
4922 fn checked_mul(&self, other: u32) -> Option<Self>;
4923 fn checked_sub(&self, other: u32) -> Option<Self>;
4924 fn checked_add(&self, other: u32) -> Option<Self>;
4928 ($($t:ty)*) => ($(impl FromStrRadixHelper for $t {
4930 fn min_value() -> Self { Self::min_value() }
4932 fn max_value() -> Self { Self::max_value() }
4934 fn from_u32(u: u32) -> Self { u as Self }
4936 fn checked_mul(&self, other: u32) -> Option<Self> {
4937 Self::checked_mul(*self, other as Self)
4940 fn checked_sub(&self, other: u32) -> Option<Self> {
4941 Self::checked_sub(*self, other as Self)
4944 fn checked_add(&self, other: u32) -> Option<Self> {
4945 Self::checked_add(*self, other as Self)
4949 doit! { i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize }
4951 fn from_str_radix<T: FromStrRadixHelper>(src: &str, radix: u32) -> Result<T, ParseIntError> {
4952 use self::IntErrorKind::*;
4953 use self::ParseIntError as PIE;
4955 assert!(radix >= 2 && radix <= 36,
4956 "from_str_radix_int: must lie in the range `[2, 36]` - found {}",
4960 return Err(PIE { kind: Empty });
4963 let is_signed_ty = T::from_u32(0) > T::min_value();
4965 // all valid digits are ascii, so we will just iterate over the utf8 bytes
4966 // and cast them to chars. .to_digit() will safely return None for anything
4967 // other than a valid ascii digit for the given radix, including the first-byte
4968 // of multi-byte sequences
4969 let src = src.as_bytes();
4971 let (is_positive, digits) = match src[0] {
4972 b'+' => (true, &src[1..]),
4973 b'-' if is_signed_ty => (false, &src[1..]),
4977 if digits.is_empty() {
4978 return Err(PIE { kind: Empty });
4981 let mut result = T::from_u32(0);
4983 // The number is positive
4985 let x = match (c as char).to_digit(radix) {
4987 None => return Err(PIE { kind: InvalidDigit }),
4989 result = match result.checked_mul(radix) {
4990 Some(result) => result,
4991 None => return Err(PIE { kind: Overflow }),
4993 result = match result.checked_add(x) {
4994 Some(result) => result,
4995 None => return Err(PIE { kind: Overflow }),
4999 // The number is negative
5001 let x = match (c as char).to_digit(radix) {
5003 None => return Err(PIE { kind: InvalidDigit }),
5005 result = match result.checked_mul(radix) {
5006 Some(result) => result,
5007 None => return Err(PIE { kind: Underflow }),
5009 result = match result.checked_sub(x) {
5010 Some(result) => result,
5011 None => return Err(PIE { kind: Underflow }),
5018 /// An error which can be returned when parsing an integer.
5020 /// This error is used as the error type for the `from_str_radix()` functions
5021 /// on the primitive integer types, such as [`i8::from_str_radix`].
5023 /// # Potential causes
5025 /// Among other causes, `ParseIntError` can be thrown because of leading or trailing whitespace
5026 /// in the string e.g., when it is obtained from the standard input.
5027 /// Using the [`str.trim()`] method ensures that no whitespace remains before parsing.
5029 /// [`str.trim()`]: ../../std/primitive.str.html#method.trim
5030 /// [`i8::from_str_radix`]: ../../std/primitive.i8.html#method.from_str_radix
5031 #[derive(Debug, Clone, PartialEq, Eq)]
5032 #[stable(feature = "rust1", since = "1.0.0")]
5033 pub struct ParseIntError {
5037 /// Enum to store the various types of errors that can cause parsing an integer to fail.
5038 #[unstable(feature = "int_error_matching",
5039 reason = "it can be useful to match errors when making error messages \
5040 for integer parsing",
5042 #[derive(Debug, Clone, PartialEq, Eq)]
5044 pub enum IntErrorKind {
5045 /// Value being parsed is empty.
5047 /// Among other causes, this variant will be constructed when parsing an empty string.
5049 /// Contains an invalid digit.
5051 /// Among other causes, this variant will be constructed when parsing a string that
5052 /// contains a letter.
5054 /// Integer is too large to store in target integer type.
5056 /// Integer is too small to store in target integer type.
5060 /// This variant will be emitted when the parsing string has a value of zero, which
5061 /// would be illegal for non-zero types.
5065 impl ParseIntError {
5066 /// Outputs the detailed cause of parsing an integer failing.
5067 #[unstable(feature = "int_error_matching",
5068 reason = "it can be useful to match errors when making error messages \
5069 for integer parsing",
5071 pub fn kind(&self) -> &IntErrorKind {
5074 #[unstable(feature = "int_error_internals",
5075 reason = "available through Error trait and this method should \
5076 not be exposed publicly",
5079 pub fn __description(&self) -> &str {
5081 IntErrorKind::Empty => "cannot parse integer from empty string",
5082 IntErrorKind::InvalidDigit => "invalid digit found in string",
5083 IntErrorKind::Overflow => "number too large to fit in target type",
5084 IntErrorKind::Underflow => "number too small to fit in target type",
5085 IntErrorKind::Zero => "number would be zero for non-zero type",
5090 #[stable(feature = "rust1", since = "1.0.0")]
5091 impl fmt::Display for ParseIntError {
5092 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
5093 self.__description().fmt(f)
5097 #[stable(feature = "rust1", since = "1.0.0")]
5098 pub use crate::num::dec2flt::ParseFloatError;
5100 // Conversion traits for primitive integer and float types
5101 // Conversions T -> T are covered by a blanket impl and therefore excluded
5102 // Some conversions from and to usize/isize are not implemented due to portability concerns
5103 macro_rules! impl_from {
5104 ($Small: ty, $Large: ty, #[$attr:meta], $doc: expr) => {
5107 impl From<$Small> for $Large {
5109 fn from(small: $Small) -> $Large {
5114 ($Small: ty, $Large: ty, #[$attr:meta]) => {
5118 concat!("Converts `",
5126 macro_rules! impl_from_bool {
5127 ($target: ty, #[$attr:meta]) => {
5128 impl_from!(bool, $target, #[$attr], concat!("Converts a `bool` to a `",
5129 stringify!($target), "`. The resulting value is `0` for `false` and `1` for `true`
5135 assert_eq!(", stringify!($target), "::from(true), 1);
5136 assert_eq!(", stringify!($target), "::from(false), 0);
5142 impl_from_bool! { u8, #[stable(feature = "from_bool", since = "1.28.0")] }
5143 impl_from_bool! { u16, #[stable(feature = "from_bool", since = "1.28.0")] }
5144 impl_from_bool! { u32, #[stable(feature = "from_bool", since = "1.28.0")] }
5145 impl_from_bool! { u64, #[stable(feature = "from_bool", since = "1.28.0")] }
5146 impl_from_bool! { u128, #[stable(feature = "from_bool", since = "1.28.0")] }
5147 impl_from_bool! { usize, #[stable(feature = "from_bool", since = "1.28.0")] }
5148 impl_from_bool! { i8, #[stable(feature = "from_bool", since = "1.28.0")] }
5149 impl_from_bool! { i16, #[stable(feature = "from_bool", since = "1.28.0")] }
5150 impl_from_bool! { i32, #[stable(feature = "from_bool", since = "1.28.0")] }
5151 impl_from_bool! { i64, #[stable(feature = "from_bool", since = "1.28.0")] }
5152 impl_from_bool! { i128, #[stable(feature = "from_bool", since = "1.28.0")] }
5153 impl_from_bool! { isize, #[stable(feature = "from_bool", since = "1.28.0")] }
5155 // Unsigned -> Unsigned
5156 impl_from! { u8, u16, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5157 impl_from! { u8, u32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5158 impl_from! { u8, u64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5159 impl_from! { u8, u128, #[stable(feature = "i128", since = "1.26.0")] }
5160 impl_from! { u8, usize, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5161 impl_from! { u16, u32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5162 impl_from! { u16, u64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5163 impl_from! { u16, u128, #[stable(feature = "i128", since = "1.26.0")] }
5164 impl_from! { u32, u64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5165 impl_from! { u32, u128, #[stable(feature = "i128", since = "1.26.0")] }
5166 impl_from! { u64, u128, #[stable(feature = "i128", since = "1.26.0")] }
5169 impl_from! { i8, i16, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5170 impl_from! { i8, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5171 impl_from! { i8, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5172 impl_from! { i8, i128, #[stable(feature = "i128", since = "1.26.0")] }
5173 impl_from! { i8, isize, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5174 impl_from! { i16, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5175 impl_from! { i16, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5176 impl_from! { i16, i128, #[stable(feature = "i128", since = "1.26.0")] }
5177 impl_from! { i32, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5178 impl_from! { i32, i128, #[stable(feature = "i128", since = "1.26.0")] }
5179 impl_from! { i64, i128, #[stable(feature = "i128", since = "1.26.0")] }
5181 // Unsigned -> Signed
5182 impl_from! { u8, i16, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5183 impl_from! { u8, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5184 impl_from! { u8, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5185 impl_from! { u8, i128, #[stable(feature = "i128", since = "1.26.0")] }
5186 impl_from! { u16, i32, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5187 impl_from! { u16, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5188 impl_from! { u16, i128, #[stable(feature = "i128", since = "1.26.0")] }
5189 impl_from! { u32, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")] }
5190 impl_from! { u32, i128, #[stable(feature = "i128", since = "1.26.0")] }
5191 impl_from! { u64, i128, #[stable(feature = "i128", since = "1.26.0")] }
5193 // The C99 standard defines bounds on INTPTR_MIN, INTPTR_MAX, and UINTPTR_MAX
5194 // which imply that pointer-sized integers must be at least 16 bits:
5195 // https://port70.net/~nsz/c/c99/n1256.html#7.18.2.4
5196 impl_from! { u16, usize, #[stable(feature = "lossless_iusize_conv", since = "1.26.0")] }
5197 impl_from! { u8, isize, #[stable(feature = "lossless_iusize_conv", since = "1.26.0")] }
5198 impl_from! { i16, isize, #[stable(feature = "lossless_iusize_conv", since = "1.26.0")] }
5200 // RISC-V defines the possibility of a 128-bit address space (RV128).
5202 // CHERI proposes 256-bit “capabilities”. Unclear if this would be relevant to usize/isize.
5203 // https://www.cl.cam.ac.uk/research/security/ctsrd/pdfs/20171017a-cheri-poster.pdf
5204 // http://www.csl.sri.com/users/neumann/2012resolve-cheri.pdf
5207 // Note: integers can only be represented with full precision in a float if
5208 // they fit in the significand, which is 24 bits in f32 and 53 bits in f64.
5209 // Lossy float conversions are not implemented at this time.
5212 impl_from! { i8, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5213 impl_from! { i8, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5214 impl_from! { i16, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5215 impl_from! { i16, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5216 impl_from! { i32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5218 // Unsigned -> Float
5219 impl_from! { u8, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5220 impl_from! { u8, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5221 impl_from! { u16, f32, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5222 impl_from! { u16, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5223 impl_from! { u32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }
5226 impl_from! { f32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0")] }