Skip to content

Commit 95a383b

Browse files
committed
Implement midpoint for all unsigned NonZeroU{8,16,32,64,128,size}
1 parent bf73234 commit 95a383b

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

library/core/src/num/nonzero.rs

+37
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)