add count_leading_zeros, count_trailing_zeros, and count_ones implementations
[vector-math.git] / src / prim.rs
index 4b3c6ca66f8584adf3e4ed98fb234d0583b2b3e3..7ba23e5b394ba9fe9c9ea1f18a43ee9fbacd9a3b 100644 (file)
@@ -91,6 +91,7 @@ pub trait PrimInt:
     const ONE: Self;
     const MIN: Self;
     const MAX: Self;
+    const BITS: Self;
 }
 
 pub trait PrimUInt: PrimInt + ConvertFrom<Self::SignedType> {
@@ -110,12 +111,14 @@ macro_rules! impl_int {
             const ONE: Self = 1;
             const MIN: Self = 0;
             const MAX: Self = !0;
+            const BITS: Self = (0 as $uint).count_zeros() as $uint;
         }
         impl PrimInt for $sint {
             const ZERO: Self = 0;
             const ONE: Self = 1;
             const MIN: Self = $sint::MIN;
             const MAX: Self = $sint::MAX;
+            const BITS: Self = (0 as $sint).count_zeros() as $sint;
         }
         impl PrimUInt for $uint {
             type SignedType = $sint;
@@ -163,6 +166,8 @@ pub trait PrimFloat:
     fn trunc(self) -> Self;
     /// round to nearest, ties to unspecified
     fn round(self) -> Self;
+    fn floor(self) -> Self;
+    fn ceil(self) -> Self;
     fn copy_sign(self, sign: Self) -> Self;
 }
 
@@ -232,6 +237,18 @@ macro_rules! impl_float {
                 return crate::algorithms::base::round_to_nearest_ties_to_even(Scalar, Value(self))
                     .0;
             }
+            fn floor(self) -> Self {
+                #[cfg(feature = "std")]
+                return $float::floor(self);
+                #[cfg(not(feature = "std"))]
+                return crate::algorithms::base::floor(Scalar, Value(self)).0;
+            }
+            fn ceil(self) -> Self {
+                #[cfg(feature = "std")]
+                return $float::ceil(self);
+                #[cfg(not(feature = "std"))]
+                return crate::algorithms::base::ceil(Scalar, Value(self)).0;
+            }
             fn copy_sign(self, sign: Self) -> Self {
                 #[cfg(feature = "std")]
                 return $float::copysign(self, sign);