@@ -2539,6 +2539,117 @@ macro_rules! int_impl {
2539
2539
( a as Self , b)
2540
2540
}
2541
2541
2542
+ /// Calculates the complete product `self * rhs` without the possibility to overflow.
2543
+ ///
2544
+ /// This returns the low-order (wrapping) bits and the high-order (overflow) bits
2545
+ /// of the result as two separate values, in that order.
2546
+ ///
2547
+ /// If you also need to add a carry to the wide result, then you want
2548
+ /// [`Self::carrying_mul`] instead.
2549
+ ///
2550
+ /// # Examples
2551
+ ///
2552
+ /// Basic usage:
2553
+ ///
2554
+ /// Please note that this example is shared between integer types.
2555
+ /// Which explains why `i32` is used here.
2556
+ ///
2557
+ /// ```
2558
+ /// #![feature(bigint_helper_methods)]
2559
+ /// assert_eq!(5i32.widening_mul(-2), (4294967286, -1));
2560
+ /// assert_eq!(1_000_000_000i32.widening_mul(-10), (2884901888, -3));
2561
+ /// ```
2562
+ #[ unstable( feature = "bigint_helper_methods" , issue = "85532" ) ]
2563
+ #[ rustc_const_unstable( feature = "const_bigint_helper_methods" , issue = "85532" ) ]
2564
+ #[ must_use = "this returns the result of the operation, \
2565
+ without modifying the original"]
2566
+ #[ rustc_allow_const_fn_unstable( const_bigint_helper_methods) ]
2567
+ #[ inline]
2568
+ pub const fn widening_mul( self , rhs: Self ) -> ( $UnsignedT, Self ) {
2569
+ self . widening_mul_impl( rhs)
2570
+ }
2571
+
2572
+ /// Calculates the "full multiplication" `self * rhs + carry`
2573
+ /// without the possibility to overflow.
2574
+ ///
2575
+ /// This returns the low-order (wrapping) bits and the high-order (overflow) bits
2576
+ /// of the result as two separate values, in that order.
2577
+ ///
2578
+ /// Performs "long multiplication" which takes in an extra amount to add, and may return an
2579
+ /// additional amount of overflow. This allows for chaining together multiple
2580
+ /// multiplications to create "big integers" which represent larger values.
2581
+ ///
2582
+ /// If you don't need the `carry`, then you can use [`Self::widening_mul`] instead.
2583
+ ///
2584
+ /// # Examples
2585
+ ///
2586
+ /// Basic usage:
2587
+ ///
2588
+ /// Please note that this example is shared between integer types.
2589
+ /// Which explains why `i32` is used here.
2590
+ ///
2591
+ /// ```
2592
+ /// #![feature(bigint_helper_methods)]
2593
+ /// assert_eq!(5i32.carrying_mul(-2, 0), (4294967286, -1));
2594
+ /// assert_eq!(5i32.carrying_mul(-2, 10), (0, 0));
2595
+ /// assert_eq!(1_000_000_000i32.carrying_mul(-10, 0), (2884901888, -3));
2596
+ /// assert_eq!(1_000_000_000i32.carrying_mul(-10, 10), (2884901898, -3));
2597
+ #[ doc = concat!( "assert_eq!(" ,
2598
+ stringify!( $SelfT) , "::MAX.carrying_mul(" , stringify!( $SelfT) , "::MAX, " , stringify!( $SelfT) , "::MAX), " ,
2599
+ "(" , stringify!( $SelfT) , "::MAX.unsigned_abs() + 1, " , stringify!( $SelfT) , "::MAX / 2));"
2600
+ ) ]
2601
+ /// ```
2602
+ #[ unstable( feature = "bigint_helper_methods" , issue = "85532" ) ]
2603
+ #[ rustc_const_unstable( feature = "const_bigint_helper_methods" , issue = "85532" ) ]
2604
+ #[ must_use = "this returns the result of the operation, \
2605
+ without modifying the original"]
2606
+ #[ rustc_allow_const_fn_unstable( const_bigint_helper_methods) ]
2607
+ #[ inline]
2608
+ pub const fn carrying_mul( self , rhs: Self , carry: Self ) -> ( $UnsignedT, Self ) {
2609
+ self . carrying_mul_impl( rhs, carry)
2610
+ }
2611
+
2612
+ /// Calculates the "full multiplication" `self * rhs + carry1 + carry2`
2613
+ /// without the possibility to overflow.
2614
+ ///
2615
+ /// This returns the low-order (wrapping) bits and the high-order (overflow) bits
2616
+ /// of the result as two separate values, in that order.
2617
+ ///
2618
+ /// Performs "long multiplication" which takes in an extra amount to add, and may return an
2619
+ /// additional amount of overflow. This allows for chaining together multiple
2620
+ /// multiplications to create "big integers" which represent larger values.
2621
+ ///
2622
+ /// If you don't need either `carry`, then you can use [`Self::widening_mul`] instead,
2623
+ /// and if you only need one `carry`, then you can use [`Self::carrying_mul`] instead.
2624
+ ///
2625
+ /// # Examples
2626
+ ///
2627
+ /// Basic usage:
2628
+ ///
2629
+ /// Please note that this example is shared between integer types.
2630
+ /// Which explains why `i32` is used here.
2631
+ ///
2632
+ /// ```
2633
+ /// #![feature(bigint_helper_methods)]
2634
+ /// assert_eq!(5i32.carrying2_mul(-2, 0, 0), (4294967286, -1));
2635
+ /// assert_eq!(5i32.carrying2_mul(-2, 10, 10), (10, 0));
2636
+ /// assert_eq!(1_000_000_000i32.carrying2_mul(-10, 0, 0), (2884901888, -3));
2637
+ /// assert_eq!(1_000_000_000i32.carrying2_mul(-10, 10, 10), (2884901908, -3));
2638
+ #[ doc = concat!( "assert_eq!(" ,
2639
+ stringify!( $SelfT) , "::MAX.carrying2_mul(" , stringify!( $SelfT) , "::MAX, " , stringify!( $SelfT) , "::MAX, " , stringify!( $SelfT) , "::MAX), " ,
2640
+ "(" , stringify!( $UnsignedT) , "::MAX, " , stringify!( $SelfT) , "::MAX / 2));"
2641
+ ) ]
2642
+ /// ```
2643
+ #[ unstable( feature = "bigint_helper_methods" , issue = "85532" ) ]
2644
+ #[ rustc_const_unstable( feature = "const_bigint_helper_methods" , issue = "85532" ) ]
2645
+ #[ must_use = "this returns the result of the operation, \
2646
+ without modifying the original"]
2647
+ #[ rustc_allow_const_fn_unstable( const_bigint_helper_methods) ]
2648
+ #[ inline]
2649
+ pub const fn carrying2_mul( self , rhs: Self , carry1: Self , carry2: Self ) -> ( $UnsignedT, Self ) {
2650
+ self . carrying2_mul_impl( rhs, carry1, carry2)
2651
+ }
2652
+
2542
2653
/// Calculates the divisor when `self` is divided by `rhs`.
2543
2654
///
2544
2655
/// Returns a tuple of the divisor along with a boolean indicating whether an arithmetic overflow would
0 commit comments