@@ -2447,7 +2447,7 @@ macro_rules! uint_impl {
24472447 }
24482448
24492449 /// Calculates `self` + `rhs` + `carry` and returns a tuple containing
2450- /// the sum and the output carry.
2450+ /// the sum and the output carry (in that order) .
24512451 ///
24522452 /// Performs "ternary addition" of two integer operands and a carry-in
24532453 /// bit, and returns an output integer and a carry-out bit. This allows
@@ -2465,8 +2465,6 @@ macro_rules! uint_impl {
24652465 /// # Examples
24662466 ///
24672467 /// ```
2468- /// #![feature(bigint_helper_methods)]
2469- ///
24702468 #[ doc = concat!( "// 3 MAX (a = 3 × 2^" , stringify!( $BITS) , " + 2^" , stringify!( $BITS) , " - 1)" ) ]
24712469 #[ doc = concat!( "// + 5 7 (b = 5 × 2^" , stringify!( $BITS) , " + 7)" ) ]
24722470 /// // ---------
@@ -2483,7 +2481,7 @@ macro_rules! uint_impl {
24832481 ///
24842482 /// assert_eq!((sum1, sum0), (9, 6));
24852483 /// ```
2486- #[ unstable ( feature = "bigint_helper_methods " , issue = "85532 " ) ]
2484+ #[ stable ( feature = "unsigned_bigint_helpers " , since = "CURRENT_RUSTC_VERSION " ) ]
24872485 #[ rustc_const_unstable( feature = "bigint_helper_methods" , issue = "85532" ) ]
24882486 #[ must_use = "this returns the result of the operation, \
24892487 without modifying the original"]
@@ -2559,8 +2557,6 @@ macro_rules! uint_impl {
25592557 /// # Examples
25602558 ///
25612559 /// ```
2562- /// #![feature(bigint_helper_methods)]
2563- ///
25642560 #[ doc = concat!( "// 9 6 (a = 9 × 2^" , stringify!( $BITS) , " + 6)" ) ]
25652561 #[ doc = concat!( "// - 5 7 (b = 5 × 2^" , stringify!( $BITS) , " + 7)" ) ]
25662562 /// // ---------
@@ -2577,7 +2573,7 @@ macro_rules! uint_impl {
25772573 ///
25782574 #[ doc = concat!( "assert_eq!((diff1, diff0), (3, " , stringify!( $SelfT) , "::MAX));" ) ]
25792575 /// ```
2580- #[ unstable ( feature = "bigint_helper_methods " , issue = "85532 " ) ]
2576+ #[ stable ( feature = "unsigned_bigint_helpers " , since = "CURRENT_RUSTC_VERSION " ) ]
25812577 #[ rustc_const_unstable( feature = "bigint_helper_methods" , issue = "85532" ) ]
25822578 #[ must_use = "this returns the result of the operation, \
25832579 without modifying the original"]
@@ -2651,10 +2647,12 @@ macro_rules! uint_impl {
26512647 /// indicating whether an arithmetic overflow would occur. If an
26522648 /// overflow would have occurred then the wrapped value is returned.
26532649 ///
2650+ /// If you want the *value* of the overflow, rather than just *whether*
2651+ /// an overflow occurred, see [`Self::carrying_mul`].
2652+ ///
26542653 /// # Examples
26552654 ///
2656- /// Please note that this example is shared among integer types, which is why why `u32`
2657- /// is used.
2655+ /// Please note that this example is shared among integer types, which is why `u32` is used.
26582656 ///
26592657 /// ```
26602658 /// assert_eq!(5u32.overflowing_mul(2), (10, false));
@@ -2670,16 +2668,38 @@ macro_rules! uint_impl {
26702668 ( a as Self , b)
26712669 }
26722670
2673- /// Calculates the complete product `self * rhs` without the possibility to overflow .
2671+ /// Calculates the complete double-width product `self * rhs`.
26742672 ///
26752673 /// This returns the low-order (wrapping) bits and the high-order (overflow) bits
2676- /// of the result as two separate values, in that order.
2674+ /// of the result as two separate values, in that order. As such,
2675+ /// `a.widening_mul(b).0` produces the same result as `a.wrapping_mul(b)`.
2676+ ///
2677+ /// If you also need to add a value and carry to the wide result, then you want
2678+ /// [`Self::carrying_mul_add`] instead.
26772679 ///
26782680 /// If you also need to add a carry to the wide result, then you want
26792681 /// [`Self::carrying_mul`] instead.
26802682 ///
2683+ /// If you just want to know *whether* the multiplication overflowed, then you
2684+ /// want [`Self::overflowing_mul`] instead.
2685+ ///
26812686 /// # Examples
26822687 ///
2688+ /// ```
2689+ /// #![feature(bigint_helper_methods)]
2690+ #[ doc = concat!( "assert_eq!(5_" , stringify!( $SelfT) , ".widening_mul(7), (35, 0));" ) ]
2691+ #[ doc = concat!( "assert_eq!(" , stringify!( $SelfT) , "::MAX.widening_mul(" , stringify!( $SelfT) , "::MAX), (1, " , stringify!( $SelfT) , "::MAX - 1));" ) ]
2692+ /// ```
2693+ ///
2694+ /// Compared to other `*_mul` methods:
2695+ /// ```
2696+ /// #![feature(bigint_helper_methods)]
2697+ #[ doc = concat!( "assert_eq!(" , stringify!( $SelfT) , "::widening_mul(1 << " , stringify!( $BITS_MINUS_ONE) , ", 6), (0, 3));" ) ]
2698+ #[ doc = concat!( "assert_eq!(" , stringify!( $SelfT) , "::overflowing_mul(1 << " , stringify!( $BITS_MINUS_ONE) , ", 6), (0, true));" ) ]
2699+ #[ doc = concat!( "assert_eq!(" , stringify!( $SelfT) , "::wrapping_mul(1 << " , stringify!( $BITS_MINUS_ONE) , ", 6), 0);" ) ]
2700+ #[ doc = concat!( "assert_eq!(" , stringify!( $SelfT) , "::checked_mul(1 << " , stringify!( $BITS_MINUS_ONE) , ", 6), None);" ) ]
2701+ /// ```
2702+ ///
26832703 /// Please note that this example is shared among integer types, which is why `u32` is used.
26842704 ///
26852705 /// ```
@@ -2706,14 +2726,13 @@ macro_rules! uint_impl {
27062726 /// additional amount of overflow. This allows for chaining together multiple
27072727 /// multiplications to create "big integers" which represent larger values.
27082728 ///
2709- /// If you don't need the `carry` , then you can use [`Self::widening_mul`] instead .
2729+ /// If you also need to add a value , then use [`Self::carrying_mul_add`] .
27102730 ///
27112731 /// # Examples
27122732 ///
27132733 /// Please note that this example is shared among integer types, which is why `u32` is used.
27142734 ///
27152735 /// ```
2716- /// #![feature(bigint_helper_methods)]
27172736 /// assert_eq!(5u32.carrying_mul(2, 0), (10, 0));
27182737 /// assert_eq!(5u32.carrying_mul(2, 10), (20, 0));
27192738 /// assert_eq!(1_000_000_000u32.carrying_mul(10, 0), (1410065408, 2));
@@ -2771,7 +2790,7 @@ macro_rules! uint_impl {
27712790 /// 789_u16.wrapping_mul(456).wrapping_add(123),
27722791 /// );
27732792 /// ```
2774- #[ unstable ( feature = "bigint_helper_methods " , issue = "85532 " ) ]
2793+ #[ stable ( feature = "unsigned_bigint_helpers " , since = "CURRENT_RUSTC_VERSION " ) ]
27752794 #[ rustc_const_unstable( feature = "bigint_helper_methods" , issue = "85532" ) ]
27762795 #[ must_use = "this returns the result of the operation, \
27772796 without modifying the original"]
@@ -2780,26 +2799,27 @@ macro_rules! uint_impl {
27802799 Self :: carrying_mul_add( self , rhs, carry, 0 )
27812800 }
27822801
2783- /// Calculates the "full multiplication" `self * rhs + carry1 + carry2`
2784- /// without the possibility to overflow.
2802+ /// Calculates the "full multiplication" `self * rhs + carry1 + carry2`.
27852803 ///
27862804 /// This returns the low-order (wrapping) bits and the high-order (overflow) bits
27872805 /// of the result as two separate values, in that order.
27882806 ///
2807+ /// This cannot overflow, as the double-width result has exactly enough
2808+ /// space for the largest possible result. This is equivalent to how, in
2809+ /// decimal, 9 × 9 + 9 + 9 = 81 + 18 = 99 = 9×10⁰ + 9×10¹ = 10² - 1.
2810+ ///
27892811 /// Performs "long multiplication" which takes in an extra amount to add, and may return an
27902812 /// additional amount of overflow. This allows for chaining together multiple
27912813 /// multiplications to create "big integers" which represent larger values.
27922814 ///
2793- /// If you don't need either `carry`, then you can use [`Self::widening_mul`] instead,
2794- /// and if you only need one `carry`, then you can use [`Self::carrying_mul`] instead.
2815+ /// If you don't need the `add` part, then you can use [`Self::carrying_mul`] instead.
27952816 ///
27962817 /// # Examples
27972818 ///
27982819 /// Please note that this example is shared between integer types,
27992820 /// which explains why `u32` is used here.
28002821 ///
28012822 /// ```
2802- /// #![feature(bigint_helper_methods)]
28032823 /// assert_eq!(5u32.carrying_mul_add(2, 0, 0), (10, 0));
28042824 /// assert_eq!(5u32.carrying_mul_add(2, 10, 10), (30, 0));
28052825 /// assert_eq!(1_000_000_000u32.carrying_mul_add(10, 0, 0), (1410065408, 2));
@@ -2816,8 +2836,6 @@ macro_rules! uint_impl {
28162836 /// using `u8` for simplicity of the demonstration.
28172837 ///
28182838 /// ```
2819- /// #![feature(bigint_helper_methods)]
2820- ///
28212839 /// fn quadratic_mul<const N: usize>(a: [u8; N], b: [u8; N]) -> [u8; N] {
28222840 /// let mut out = [0; N];
28232841 /// for j in 0..N {
@@ -2832,13 +2850,13 @@ macro_rules! uint_impl {
28322850 /// // -1 * -1 == 1
28332851 /// assert_eq!(quadratic_mul([0xFF; 3], [0xFF; 3]), [1, 0, 0]);
28342852 ///
2835- /// assert_eq!(u32::wrapping_mul(0x9e3779b9, 0x7f4a7c15), 0xCFFC982D );
2853+ /// assert_eq!(u32::wrapping_mul(0x9e3779b9, 0x7f4a7c15), 0xcffc982d );
28362854 /// assert_eq!(
28372855 /// quadratic_mul(u32::to_le_bytes(0x9e3779b9), u32::to_le_bytes(0x7f4a7c15)),
2838- /// u32::to_le_bytes(0xCFFC982D )
2856+ /// u32::to_le_bytes(0xcffc982d )
28392857 /// );
28402858 /// ```
2841- #[ unstable ( feature = "bigint_helper_methods " , issue = "85532 " ) ]
2859+ #[ stable ( feature = "unsigned_bigint_helpers " , since = "CURRENT_RUSTC_VERSION " ) ]
28422860 #[ rustc_const_unstable( feature = "bigint_helper_methods" , issue = "85532" ) ]
28432861 #[ must_use = "this returns the result of the operation, \
28442862 without modifying the original"]
0 commit comments