@@ -493,6 +493,43 @@ macro_rules! nonzero_unsigned_operations {
493493 pub const fn ilog10( self ) -> u32 {
494494 super :: int_log10:: $Int( self . 0 )
495495 }
496+
497+ /// Calculates the middle point of `self` and `rhs`.
498+ ///
499+ /// `midpoint(a, b)` is `(a + b) >> 1` as if it were performed in a
500+ /// sufficiently-large signed integral type. This implies that the result is
501+ /// always rounded towards negative infinity and that no overflow will ever occur.
502+ ///
503+ /// # Examples
504+ ///
505+ /// ```
506+ /// #![feature(num_midpoint)]
507+ #[ doc = concat!( "# use std::num::" , stringify!( $Ty) , ";" ) ]
508+ ///
509+ /// # fn main() { test().unwrap(); }
510+ /// # fn test() -> Option<()> {
511+ #[ doc = concat!( "let one = " , stringify!( $Ty) , "::new(1)?;" ) ]
512+ #[ doc = concat!( "let two = " , stringify!( $Ty) , "::new(2)?;" ) ]
513+ #[ doc = concat!( "let four = " , stringify!( $Ty) , "::new(4)?;" ) ]
514+ ///
515+ /// assert_eq!(one.midpoint(four), two);
516+ /// assert_eq!(four.midpoint(one), two);
517+ /// # Some(())
518+ /// # }
519+ /// ```
520+ #[ unstable( feature = "num_midpoint" , issue = "110840" ) ]
521+ #[ rustc_const_unstable( feature = "const_num_midpoint" , issue = "110840" ) ]
522+ #[ rustc_allow_const_fn_unstable( const_num_midpoint) ]
523+ #[ must_use = "this returns the result of the operation, \
524+ without modifying the original"]
525+ #[ inline]
526+ pub const fn midpoint( self , rhs: Self ) -> Self {
527+ // SAFETY: The only way to get `0` with midpoint is to have two opposite or
528+ // near opposite numbers: (-5, 5), (0, 1), (0, 0) which is impossible because
529+ // of the unsignedness of this number and also because $Ty is guaranteed to
530+ // never being 0.
531+ unsafe { $Ty:: new_unchecked( self . get( ) . midpoint( rhs. get( ) ) ) }
532+ }
496533 }
497534 ) +
498535 }
0 commit comments