vortex_compute/arithmetic/
mod.rs1use vortex_dtype::half::f16;
7
8mod buffer;
9mod buffer_checked;
10mod pvector;
11mod pvector_checked;
12
13pub trait Arithmetic<Op, Rhs = Self> {
15 type Output;
17
18 fn eval(self, rhs: Rhs) -> Self::Output;
20}
21
22pub trait Operator<T> {
24 fn apply(a: &T, b: &T) -> T;
26}
27
28pub trait CheckedArithmetic<Op, Rhs = Self> {
30 type Output;
32
33 fn checked_eval(self, rhs: Rhs) -> Option<Self::Output>;
36}
37
38pub trait CheckedOperator<T> {
40 fn apply(a: &T, b: &T) -> Option<T>;
42}
43
44pub struct Add;
46pub struct Sub;
48pub struct Mul;
50pub struct Div;
52
53pub struct WrappingAdd;
55pub struct WrappingSub;
57pub struct WrappingMul;
59
60pub struct SaturatingAdd;
62pub struct SaturatingSub;
64pub struct SaturatingMul;
66
67impl<T: num_traits::CheckedAdd> CheckedOperator<T> for Add {
68 #[inline(always)]
69 fn apply(a: &T, b: &T) -> Option<T> {
70 num_traits::CheckedAdd::checked_add(a, b)
71 }
72}
73impl<T: num_traits::CheckedSub> CheckedOperator<T> for Sub {
74 #[inline(always)]
75 fn apply(a: &T, b: &T) -> Option<T> {
76 num_traits::CheckedSub::checked_sub(a, b)
77 }
78}
79impl<T: num_traits::CheckedMul> CheckedOperator<T> for Mul {
80 #[inline(always)]
81 fn apply(a: &T, b: &T) -> Option<T> {
82 num_traits::CheckedMul::checked_mul(a, b)
83 }
84}
85impl<T: num_traits::CheckedDiv> CheckedOperator<T> for Div {
86 #[inline(always)]
87 fn apply(a: &T, b: &T) -> Option<T> {
88 num_traits::CheckedDiv::checked_div(a, b)
89 }
90}
91
92impl<T: num_traits::WrappingAdd> Operator<T> for WrappingAdd {
93 #[inline(always)]
94 fn apply(a: &T, b: &T) -> T {
95 num_traits::WrappingAdd::wrapping_add(a, b)
96 }
97}
98impl<T: num_traits::WrappingSub> Operator<T> for WrappingSub {
99 #[inline(always)]
100 fn apply(a: &T, b: &T) -> T {
101 num_traits::WrappingSub::wrapping_sub(a, b)
102 }
103}
104impl<T: num_traits::WrappingMul> Operator<T> for WrappingMul {
105 #[inline(always)]
106 fn apply(a: &T, b: &T) -> T {
107 num_traits::WrappingMul::wrapping_mul(a, b)
108 }
109}
110
111impl<T: num_traits::SaturatingAdd> Operator<T> for SaturatingAdd {
112 #[inline(always)]
113 fn apply(a: &T, b: &T) -> T {
114 num_traits::SaturatingAdd::saturating_add(a, b)
115 }
116}
117impl<T: num_traits::SaturatingSub> Operator<T> for SaturatingSub {
118 #[inline(always)]
119 fn apply(a: &T, b: &T) -> T {
120 num_traits::SaturatingSub::saturating_sub(a, b)
121 }
122}
123impl<T: num_traits::SaturatingMul> Operator<T> for SaturatingMul {
124 #[inline(always)]
125 fn apply(a: &T, b: &T) -> T {
126 num_traits::SaturatingMul::saturating_mul(a, b)
127 }
128}
129
130macro_rules! impl_float {
135 ($T:ty) => {
136 impl Operator<$T> for Add {
137 #[inline(always)]
138 fn apply(a: &$T, b: &$T) -> $T {
139 a + b
140 }
141 }
142 impl Operator<$T> for Sub {
143 #[inline(always)]
144 fn apply(a: &$T, b: &$T) -> $T {
145 a - b
146 }
147 }
148 impl Operator<$T> for Mul {
149 #[inline(always)]
150 fn apply(a: &$T, b: &$T) -> $T {
151 a * b
152 }
153 }
154 impl Operator<$T> for Div {
155 #[inline(always)]
156 fn apply(a: &$T, b: &$T) -> $T {
157 a / b
158 }
159 }
160 };
161}
162
163impl_float!(f16);
164impl_float!(f32);
165impl_float!(f64);