@@ -2447,7 +2447,7 @@ macro_rules! uint_impl {
2447
2447
}
2448
2448
2449
2449
/// 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) .
2451
2451
///
2452
2452
/// Performs "ternary addition" of two integer operands and a carry-in
2453
2453
/// bit, and returns an output integer and a carry-out bit. This allows
@@ -2465,8 +2465,6 @@ macro_rules! uint_impl {
2465
2465
/// # Examples
2466
2466
///
2467
2467
/// ```
2468
- /// #![feature(bigint_helper_methods)]
2469
- ///
2470
2468
#[ doc = concat!( "// 3 MAX (a = 3 × 2^" , stringify!( $BITS) , " + 2^" , stringify!( $BITS) , " - 1)" ) ]
2471
2469
#[ doc = concat!( "// + 5 7 (b = 5 × 2^" , stringify!( $BITS) , " + 7)" ) ]
2472
2470
/// // ---------
@@ -2483,7 +2481,7 @@ macro_rules! uint_impl {
2483
2481
///
2484
2482
/// assert_eq!((sum1, sum0), (9, 6));
2485
2483
/// ```
2486
- #[ unstable ( feature = "bigint_helper_methods " , issue = "85532 " ) ]
2484
+ #[ stable ( feature = "unsigned_bigint_helpers " , since = "CURRENT_RUSTC_VERSION " ) ]
2487
2485
#[ rustc_const_unstable( feature = "bigint_helper_methods" , issue = "85532" ) ]
2488
2486
#[ must_use = "this returns the result of the operation, \
2489
2487
without modifying the original"]
@@ -2559,8 +2557,6 @@ macro_rules! uint_impl {
2559
2557
/// # Examples
2560
2558
///
2561
2559
/// ```
2562
- /// #![feature(bigint_helper_methods)]
2563
- ///
2564
2560
#[ doc = concat!( "// 9 6 (a = 9 × 2^" , stringify!( $BITS) , " + 6)" ) ]
2565
2561
#[ doc = concat!( "// - 5 7 (b = 5 × 2^" , stringify!( $BITS) , " + 7)" ) ]
2566
2562
/// // ---------
@@ -2577,7 +2573,7 @@ macro_rules! uint_impl {
2577
2573
///
2578
2574
#[ doc = concat!( "assert_eq!((diff1, diff0), (3, " , stringify!( $SelfT) , "::MAX));" ) ]
2579
2575
/// ```
2580
- #[ unstable ( feature = "bigint_helper_methods " , issue = "85532 " ) ]
2576
+ #[ stable ( feature = "unsigned_bigint_helpers " , since = "CURRENT_RUSTC_VERSION " ) ]
2581
2577
#[ rustc_const_unstable( feature = "bigint_helper_methods" , issue = "85532" ) ]
2582
2578
#[ must_use = "this returns the result of the operation, \
2583
2579
without modifying the original"]
@@ -2651,10 +2647,12 @@ macro_rules! uint_impl {
2651
2647
/// indicating whether an arithmetic overflow would occur. If an
2652
2648
/// overflow would have occurred then the wrapped value is returned.
2653
2649
///
2650
+ /// If you want the *value* of the overflow, rather than just *whether*
2651
+ /// an overflow occurred, see [`Self::carrying_mul`].
2652
+ ///
2654
2653
/// # Examples
2655
2654
///
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.
2658
2656
///
2659
2657
/// ```
2660
2658
/// assert_eq!(5u32.overflowing_mul(2), (10, false));
@@ -2670,16 +2668,38 @@ macro_rules! uint_impl {
2670
2668
( a as Self , b)
2671
2669
}
2672
2670
2673
- /// Calculates the complete product `self * rhs` without the possibility to overflow .
2671
+ /// Calculates the complete double-width product `self * rhs`.
2674
2672
///
2675
2673
/// 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.
2677
2679
///
2678
2680
/// If you also need to add a carry to the wide result, then you want
2679
2681
/// [`Self::carrying_mul`] instead.
2680
2682
///
2683
+ /// If you just want to know *whether* the multiplication overflowed, then you
2684
+ /// want [`Self::overflowing_mul`] instead.
2685
+ ///
2681
2686
/// # Examples
2682
2687
///
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
+ ///
2683
2703
/// Please note that this example is shared among integer types, which is why `u32` is used.
2684
2704
///
2685
2705
/// ```
@@ -2706,14 +2726,13 @@ macro_rules! uint_impl {
2706
2726
/// additional amount of overflow. This allows for chaining together multiple
2707
2727
/// multiplications to create "big integers" which represent larger values.
2708
2728
///
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`] .
2710
2730
///
2711
2731
/// # Examples
2712
2732
///
2713
2733
/// Please note that this example is shared among integer types, which is why `u32` is used.
2714
2734
///
2715
2735
/// ```
2716
- /// #![feature(bigint_helper_methods)]
2717
2736
/// assert_eq!(5u32.carrying_mul(2, 0), (10, 0));
2718
2737
/// assert_eq!(5u32.carrying_mul(2, 10), (20, 0));
2719
2738
/// assert_eq!(1_000_000_000u32.carrying_mul(10, 0), (1410065408, 2));
@@ -2771,7 +2790,7 @@ macro_rules! uint_impl {
2771
2790
/// 789_u16.wrapping_mul(456).wrapping_add(123),
2772
2791
/// );
2773
2792
/// ```
2774
- #[ unstable ( feature = "bigint_helper_methods " , issue = "85532 " ) ]
2793
+ #[ stable ( feature = "unsigned_bigint_helpers " , since = "CURRENT_RUSTC_VERSION " ) ]
2775
2794
#[ rustc_const_unstable( feature = "bigint_helper_methods" , issue = "85532" ) ]
2776
2795
#[ must_use = "this returns the result of the operation, \
2777
2796
without modifying the original"]
@@ -2780,26 +2799,27 @@ macro_rules! uint_impl {
2780
2799
Self :: carrying_mul_add( self , rhs, carry, 0 )
2781
2800
}
2782
2801
2783
- /// Calculates the "full multiplication" `self * rhs + carry1 + carry2`
2784
- /// without the possibility to overflow.
2802
+ /// Calculates the "full multiplication" `self * rhs + carry1 + carry2`.
2785
2803
///
2786
2804
/// This returns the low-order (wrapping) bits and the high-order (overflow) bits
2787
2805
/// of the result as two separate values, in that order.
2788
2806
///
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
+ ///
2789
2811
/// Performs "long multiplication" which takes in an extra amount to add, and may return an
2790
2812
/// additional amount of overflow. This allows for chaining together multiple
2791
2813
/// multiplications to create "big integers" which represent larger values.
2792
2814
///
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.
2795
2816
///
2796
2817
/// # Examples
2797
2818
///
2798
2819
/// Please note that this example is shared between integer types,
2799
2820
/// which explains why `u32` is used here.
2800
2821
///
2801
2822
/// ```
2802
- /// #![feature(bigint_helper_methods)]
2803
2823
/// assert_eq!(5u32.carrying_mul_add(2, 0, 0), (10, 0));
2804
2824
/// assert_eq!(5u32.carrying_mul_add(2, 10, 10), (30, 0));
2805
2825
/// assert_eq!(1_000_000_000u32.carrying_mul_add(10, 0, 0), (1410065408, 2));
@@ -2816,8 +2836,6 @@ macro_rules! uint_impl {
2816
2836
/// using `u8` for simplicity of the demonstration.
2817
2837
///
2818
2838
/// ```
2819
- /// #![feature(bigint_helper_methods)]
2820
- ///
2821
2839
/// fn quadratic_mul<const N: usize>(a: [u8; N], b: [u8; N]) -> [u8; N] {
2822
2840
/// let mut out = [0; N];
2823
2841
/// for j in 0..N {
@@ -2832,13 +2850,13 @@ macro_rules! uint_impl {
2832
2850
/// // -1 * -1 == 1
2833
2851
/// assert_eq!(quadratic_mul([0xFF; 3], [0xFF; 3]), [1, 0, 0]);
2834
2852
///
2835
- /// assert_eq!(u32::wrapping_mul(0x9e3779b9, 0x7f4a7c15), 0xCFFC982D );
2853
+ /// assert_eq!(u32::wrapping_mul(0x9e3779b9, 0x7f4a7c15), 0xcffc982d );
2836
2854
/// assert_eq!(
2837
2855
/// quadratic_mul(u32::to_le_bytes(0x9e3779b9), u32::to_le_bytes(0x7f4a7c15)),
2838
- /// u32::to_le_bytes(0xCFFC982D )
2856
+ /// u32::to_le_bytes(0xcffc982d )
2839
2857
/// );
2840
2858
/// ```
2841
- #[ unstable ( feature = "bigint_helper_methods " , issue = "85532 " ) ]
2859
+ #[ stable ( feature = "unsigned_bigint_helpers " , since = "CURRENT_RUSTC_VERSION " ) ]
2842
2860
#[ rustc_const_unstable( feature = "bigint_helper_methods" , issue = "85532" ) ]
2843
2861
#[ must_use = "this returns the result of the operation, \
2844
2862
without modifying the original"]
0 commit comments