Skip to main content

geo_nd/
farray.rs

1//a Imports
2use serde::{Deserialize, Serialize};
3
4use super::vector;
5use super::{Float, Vector};
6
7//a Macros
8//a FArray
9//tp FArray
10/// The [FArray] is a wrapper around a `D` sized array of [Float]s.
11///
12/// It provides implementations of the traits required for a [Vector]
13/// trait, hence it can be used for a [Vector] of any size `D`.
14///
15/// Default must be provided separately as it is only implemented
16/// for \[F; D\] up to D=32
17#[derive(Clone, Copy, Debug, PartialEq)]
18#[repr(transparent)]
19pub struct FArray<F: Float, const D: usize> {
20    data: [F; D],
21}
22
23//a Macros to implement the traits
24//mi farray_basic_traits!
25macro_rules! farray_basic_traits {
26    { $f:ty,  $e:expr, $ty:ty } => {
27
28        //ip Default for FArray
29        impl std::default::Default for $ty {
30            fn default() -> Self {
31                Self {
32                    data: vector::zero(),
33                }
34            }
35        }
36
37        //ip Display for FArray
38        impl std::fmt::Display for $ty {
39            fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
40                vector::fmt(f, &self.data)
41            }
42        }
43    }
44}
45
46//mi farray_mul_div_traits
47macro_rules! farray_mul_div_traits {
48    { $f:ty, $e:expr, $ty:ty,
49      $trait_op:ident, $fn_op:ident, $op:tt,
50      $trait_assign_op:ident, $fn_assign_op:ident, $op_assign:tt  } => {
51
52        // Mul/Div by  $f  for Self
53        impl std::ops::$trait_op<$f> for $ty {
54            type Output = $ty;
55            fn $fn_op(mut self, other: $f) -> $ty {
56                for i in 0..$e {
57                    self.data[i] $op_assign other;
58                }
59                self
60            }
61        }
62
63        impl std::ops::$trait_assign_op<$f> for $ty {
64            fn $fn_assign_op(&mut self, other: $f) {
65                for i in 0..$e {self.data[i] $op_assign other;}
66            }
67        }
68
69        // Mul/Div by  & $f  for Self
70        impl <'a> std::ops::$trait_op<&'a $f> for $ty {
71            type Output = $ty;
72            fn $fn_op(mut self, other: &'a $f) -> $ty {
73                for i in 0..$e {
74                    self.data[i] $op_assign other;
75                }
76                self
77            }
78        }
79
80        impl <'a> std::ops::$trait_assign_op<&'a $f> for $ty {
81            fn $fn_assign_op(&mut self, other: &'a $f) {
82                for i in 0..$e {self.data[i] $op_assign other;}
83            }
84        }
85    }
86}
87
88//mi farray_vector_trait
89macro_rules! farray_vector_trait {
90    { $f:ty,  $e:expr, $ty:ty } => {
91
92        impl Vector<$f, $e> for $ty {
93        }
94
95    }
96}
97
98//mi farray_traits
99macro_rules! farray_traits {
100    { $f:ty,  $e:expr, $ty:ty } => {
101
102        farray_basic_traits!{$f, $e, $ty}
103        crate::ref_traits!{$f, $e, $ty}
104        crate::convert_traits!{$f, $e, $ty}
105        crate::unary_traits!{$f, $e, $ty}
106        crate::elementwise_traits!{$f, $e, $ty, Add, add, +, AddAssign, add_assign, +=}
107        crate::elementwise_traits!{$f, $e, $ty, Sub, sub, -, SubAssign, sub_assign, -=}
108        crate::serialize_traits!{$f, $e, $ty}
109        farray_mul_div_traits!{$f, $e, $ty, Mul, mul, *, MulAssign, mul_assign, *=}
110        farray_mul_div_traits!{$f, $e, $ty, Div, div, /, DivAssign, div_assign, /=}
111
112        farray_vector_trait!{$f, $e, $ty}
113    }
114}
115
116//mi Invoke farray_traits!
117farray_traits! { f32, 2, FArray<f32,2> }
118farray_traits! { f32, 3, FArray<f32,3> }
119farray_traits! { f32, 4, FArray<f32,4> }
120farray_traits! { f32, 5, FArray<f32,5> }
121farray_traits! { f32, 6, FArray<f32,6> }
122farray_traits! { f32, 7, FArray<f32,7> }
123farray_traits! { f32, 8, FArray<f32,8> }
124farray_traits! { f32, 9, FArray<f32,9> }
125farray_traits! { f32, 10, FArray<f32,10> }
126farray_traits! { f32, 11, FArray<f32,11> }
127farray_traits! { f32, 12, FArray<f32,12> }
128farray_traits! { f32, 13, FArray<f32,13> }
129farray_traits! { f32, 14, FArray<f32,14> }
130farray_traits! { f32, 15, FArray<f32,15> }
131farray_traits! { f32, 16, FArray<f32,16> }
132
133farray_traits! { f64, 2, FArray<f64,2> }
134farray_traits! { f64, 3, FArray<f64,3> }
135farray_traits! { f64, 4, FArray<f64,4> }
136farray_traits! { f64, 5, FArray<f64,5> }
137farray_traits! { f64, 6, FArray<f64,6> }
138farray_traits! { f64, 7, FArray<f64,7> }
139farray_traits! { f64, 8, FArray<f64,8> }
140farray_traits! { f64, 9, FArray<f64,9> }
141farray_traits! { f64, 10, FArray<f64,10> }
142farray_traits! { f64, 11, FArray<f64,11> }
143farray_traits! { f64, 12, FArray<f64,12> }
144farray_traits! { f64, 13, FArray<f64,13> }
145farray_traits! { f64, 14, FArray<f64,14> }
146farray_traits! { f64, 15, FArray<f64,15> }
147farray_traits! { f64, 16, FArray<f64,16> }