1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/// A trait for vector-like types that can be used with the JIT compiler.
///
/// This trait provides a common interface for different vector implementations,
/// allowing them to be used interchangeably in JIT-compiled functions. It defines
/// core vector operations needed for JIT compilation, including accessing raw data
/// and creating zero-initialized vectors.
///
/// # Examples
///
/// ```rust
/// use evalexpr_jit::prelude::Vector;
///
/// // Create a zero vector
/// let vec: Vec<f64> = Vector::zeros(5);
/// assert_eq!(vec.len(), 5);
///
/// // Access elements
/// let mut vec = vec![1.0, 2.0, 3.0];
/// let slice = vec.as_slice();
/// assert_eq!(slice[0], 1.0);
/// ```
/// Implementation of Vector trait for standard Vec<f64>.
///
/// This implementation provides an interface between the Vector trait and Rust's
/// standard vector type. Vec<f64> already provides slice access, making this
/// implementation straightforward.
///
/// # Examples
///
/// ```rust
/// use evalexpr_jit::prelude::Vector;
///
/// let mut vec = Vec::<f64>::zeros(3);
/// let slice = vec.as_mut_slice();
/// slice[0] = 1.0;
/// assert_eq!(vec[0], 1.0);
/// ```
/// Implementation of Vector trait for ndarray's Array1<f64>.
///
/// This implementation provides an interface between the Vector trait and ndarray's
/// 1-dimensional array type. It handles the conversion between ndarray's internal
/// representation and the slice representation required by the JIT compiler.
///
/// # Examples
///
/// ```rust
/// use evalexpr_jit::prelude::Vector;
/// use ndarray::Array1;
///
/// let mut vec = Array1::<f64>::zeros(3);
/// let slice = vec.as_mut_slice();
/// slice[0] = 1.0;
/// assert!(std::ptr::eq(slice, vec.as_slice().unwrap()));
/// ```
/// Implementation of Vector trait for nalgebra's DVector<f64>.
///
/// This implementation provides an interface between the Vector trait and nalgebra's
/// dynamic vector type. It handles the conversion between nalgebra's internal
/// representation and the slice representation required by the JIT compiler.
///
/// # Examples
///
/// ```rust
/// use evalexpr_jit::prelude::Vector;
/// use nalgebra::DVector;
///
/// let mut vec = DVector::<f64>::zeros(3);
/// let slice = vec.as_mut_slice();
/// slice[0] = 1.0;
/// assert!(std::ptr::eq(slice, vec.as_slice()));
/// ```
/// Implementation of Vector trait for fixed-size arrays.
///
/// This implementation allows fixed-size arrays to be used with the JIT compiler.
/// The array size is specified through the const generic parameter N.
///
/// # Type Parameters
/// * `N` - The fixed size of the array
///
/// # Examples
///
/// ```rust
/// use evalexpr_jit::prelude::Vector;
///
/// let mut arr = <[f64; 3]>::zeros(3);
/// let slice = arr.as_mut_slice();
/// slice[0] = 1.0;
/// assert_eq!(arr[0], 1.0);
/// ```