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