Add leading_ones and trailing_ones to PrimInt

This commit is contained in:
ltdk
2021-03-14 19:02:34 -04:00
parent 00d3cdcac0
commit d989634fda
2 changed files with 46 additions and 0 deletions
+2
View File
@@ -16,5 +16,7 @@ fn main() {
"has_to_int_unchecked",
);
ac.emit_expression_cfg("1u32.trailing_ones()", "has_leading_trailing_ones");
autocfg::rerun_path("build.rs");
}
+44
View File
@@ -78,6 +78,22 @@ pub trait PrimInt:
/// ```
fn count_zeros(self) -> u32;
/// Returns the number of leading ones in the binary representation
/// of `self`.
///
/// # Examples
///
/// ```
/// use num_traits::PrimInt;
///
/// let n = 0xF00Du16;
///
/// assert_eq!(n.leading_ones(), 4);
/// ```
fn leading_ones(self) -> u32 {
(!self).leading_zeros()
}
/// Returns the number of leading zeros in the binary representation
/// of `self`.
///
@@ -92,6 +108,22 @@ pub trait PrimInt:
/// ```
fn leading_zeros(self) -> u32;
/// Returns the number of trailing ones in the binary representation
/// of `self`.
///
/// # Examples
///
/// ```
/// use num_traits::PrimInt;
///
/// let n = 0xBEEFu16;
///
/// assert_eq!(n.trailing_ones(), 4);
/// ```
fn trailing_ones(self) -> u32 {
(!self).trailing_zeros()
}
/// Returns the number of trailing zeros in the binary representation
/// of `self`.
///
@@ -319,11 +351,23 @@ macro_rules! prim_int_impl {
<$T>::count_zeros(self)
}
#[cfg(has_leading_leading_ones)]
#[inline]
fn leading_ones(self) -> u32 {
<$T>::leading_ones(self)
}
#[inline]
fn leading_zeros(self) -> u32 {
<$T>::leading_zeros(self)
}
#[cfg(has_leading_trailing_ones)]
#[inline]
fn trailing_ones(self) -> u32 {
<$T>::trailing_ones(self)
}
#[inline]
fn trailing_zeros(self) -> u32 {
<$T>::trailing_zeros(self)