single_utilities/traits/
mod.rs

1use std::fmt::Debug;
2use std::iter::Sum;
3use num_traits::{Bounded, FromPrimitive, NumCast, One, ToPrimitive, Zero};
4#[cfg(feature="simd")]
5use simba::{scalar::RealField, simd::SimdRealField};
6use std::ops::{Add, AddAssign, MulAssign, SubAssign};
7use num_traits::float::FloatCore;
8
9pub trait NumericOps:
10    Zero + One + NumCast + Copy + AddAssign + MulAssign + SubAssign + PartialOrd + Bounded + Add<Output = Self> + Sum + Debug + Default
11{
12}
13impl<
14    T: Zero + One + NumCast + Copy + AddAssign + MulAssign + SubAssign + PartialOrd + Bounded + Add<Output = Self> + Sum + Debug + Default,
15> NumericOps for T
16{
17}
18
19pub trait NumericOpsTS: NumericOps + Send + Sync {}
20
21impl<T: NumericOps + Send + Sync> NumericOpsTS for T {}
22
23pub trait FloatOps: NumericOps + num_traits::Float + FromPrimitive + ToPrimitive + FloatCore {}
24
25impl<T: NumericOps + num_traits::Float + FromPrimitive + ToPrimitive + FloatCore> FloatOps for T {}
26
27pub trait FloatOpsTS: FloatOps + Sync + Send {}
28
29impl<T: FloatOps + Send + Sync> FloatOpsTS for T {}
30
31#[cfg(feature="simd")]
32pub trait FloatOpsTSSimba: FloatOpsTS + SimdRealField + RealField {}
33
34#[cfg(feature="simd")]
35impl<T: FloatOpsTS + SimdRealField + RealField> FloatOpsTSSimba for T {}
36
37// Define a type alias for our numeric constraints
38pub trait NumericNormalize:
39    num_traits::Float + std::ops::AddAssign + std::iter::Sum + num_traits::NumCast
40{
41}
42
43// Blanket implementation for any type that satisfies the bounds
44impl<T> NumericNormalize for T where
45    T: num_traits::Float + std::ops::AddAssign + std::iter::Sum + num_traits::NumCast
46{
47}
48
49pub trait ZeroVec {
50    fn zero_len(&mut self, len: usize);
51}
52
53impl<T: Default + Clone> ZeroVec for Vec<T> {
54    fn zero_len(&mut self, len: usize) {
55        self.clear();
56        self.reserve(len);
57        self.extend(std::iter::repeat_n(T::default(), len));
58    }
59}