single_utilities/traits/
mod.rs

1use num_traits::float::FloatCore;
2use num_traits::{Bounded, FromPrimitive, NumCast, One, ToPrimitive, Unsigned, Zero};
3#[cfg(feature = "simd")]
4use simba::{scalar::RealField, simd::SimdRealField};
5use std::fmt::Debug;
6use std::iter::Sum;
7use std::ops::{Add, AddAssign, MulAssign, SubAssign};
8
9pub trait NumericOps:
10    Zero
11    + One
12    + NumCast
13    + Copy
14    + AddAssign
15    + MulAssign
16    + SubAssign
17    + PartialOrd
18    + Bounded
19    + Add<Output = Self>
20    + Sum
21    + Debug
22    + Default
23{
24}
25impl<
26    T: Zero
27        + One
28        + NumCast
29        + Copy
30        + AddAssign
31        + MulAssign
32        + SubAssign
33        + PartialOrd
34        + Bounded
35        + Add<Output = Self>
36        + Sum
37        + Debug
38        + Default,
39> NumericOps for T
40{
41}
42
43pub trait NumericOpsTS: NumericOps + Send + Sync {}
44
45impl<T: NumericOps + Send + Sync> NumericOpsTS for T {}
46
47pub trait FloatOps:
48    NumericOps + num_traits::Float + FromPrimitive + ToPrimitive + FloatCore
49{
50}
51
52impl<T: NumericOps + num_traits::Float + FromPrimitive + ToPrimitive + FloatCore> FloatOps for T {}
53
54pub trait FloatOpsTS: FloatOps + Sync + Send {}
55
56impl<T: FloatOps + Send + Sync> FloatOpsTS for T {}
57
58#[cfg(feature = "simd")]
59pub trait FloatOpsTSSimba: FloatOpsTS + SimdRealField + RealField {}
60
61#[cfg(feature = "simd")]
62impl<T: FloatOpsTS + SimdRealField + RealField> FloatOpsTSSimba for T {}
63
64// Define a type alias for our numeric constraints
65pub trait NumericNormalize:
66    num_traits::Float + std::ops::AddAssign + std::iter::Sum + num_traits::NumCast
67{
68}
69
70// Blanket implementation for any type that satisfies the bounds
71impl<T> NumericNormalize for T where
72    T: num_traits::Float + std::ops::AddAssign + std::iter::Sum + num_traits::NumCast
73{
74}
75
76pub trait ZeroVec {
77    fn zero_len(&mut self, len: usize);
78}
79
80impl<T: Default + Clone> ZeroVec for Vec<T> {
81    fn zero_len(&mut self, len: usize) {
82        self.clear();
83        self.reserve(len);
84        self.extend(std::iter::repeat_n(T::default(), len));
85    }
86}
87
88pub trait UIndex:
89    Unsigned + Zero + One + Copy + PartialEq + PartialOrd + From<usize> + Into<usize> + Bounded
90{
91}
92
93impl<I: Unsigned + Zero + One + Copy + PartialEq + PartialOrd + From<usize> + Into<usize> + Bounded>
94    UIndex for I
95{
96}
97
98pub trait Scalar: 'static + Clone + PartialEq + Debug {}
99
100impl<T: 'static + Clone + PartialEq + Debug> Scalar for T {}