vectora/types/
macros.rs

1//! Macros.
2
3/// Returns a [`crate::Vector`] with scalar data contents and order as defined in
4/// the numeric type arguments.
5///
6/// This macro supports standard library [`array`]-like initialization syntax of
7/// a [`crate::Vector`] with the numeric type and length defined by the macro arguments.
8///
9/// Import the macro before use with:
10///
11/// ```
12/// use vectora::vector;
13/// ```
14///
15/// # Examples
16///
17/// ## Integer types
18///
19/// ```
20/// use vectora::{vector, Vector};
21///
22/// let v_i32_1 = vector![1_i32, 2_i32, 3_i32];
23/// let v_i32_2: Vector<i32, 3> = vector![1, 2, 3];
24/// let v_i32_3: Vector<i32, 3> = vector![10; 3];
25///
26/// assert_eq!(v_i32_1[0], 1_i32);
27/// assert_eq!(v_i32_1[1], 2_i32);
28/// assert_eq!(v_i32_1[2], 3_i32);
29///
30/// assert_eq!(v_i32_2[0], 1_i32);
31/// assert_eq!(v_i32_2[1], 2_i32);
32/// assert_eq!(v_i32_2[2], 3_i32);
33///
34/// assert_eq!(v_i32_3[0], 10_i32);
35/// assert_eq!(v_i32_3[1], 10_i32);
36/// assert_eq!(v_i32_3[2], 10_i32);
37/// ```
38///
39/// ## Floating point types
40///
41/// ```
42/// use vectora::{vector, Vector};
43///
44/// use approx::assert_relative_eq;
45///
46/// let v_f64_1 = vector![1.0_f64, 2.0_f64, 3.0_f64];
47/// let v_f64_2: Vector<f64, 3> = vector![1.0, 2.0, 3.0];
48/// let v_f64_3: Vector<f64, 3> = vector![10.0; 3];
49///
50/// assert_relative_eq!(v_f64_1[0], 1.0_f64);
51/// assert_relative_eq!(v_f64_1[1], 2.0_f64);
52/// assert_relative_eq!(v_f64_1[2], 3.0_f64);
53///
54/// assert_relative_eq!(v_f64_2[0], 1.0_f64);
55/// assert_relative_eq!(v_f64_2[1], 2.0_f64);
56/// assert_relative_eq!(v_f64_2[2], 3.0_f64);
57///
58/// assert_relative_eq!(v_f64_3[0], 10.0_f64);
59/// assert_relative_eq!(v_f64_3[1], 10.0_f64);
60/// assert_relative_eq!(v_f64_3[2], 10.0_f64);
61/// ```
62///
63/// ## Complex number types
64///
65/// ```
66/// use vectora::{vector, Vector};
67///
68/// use approx::assert_relative_eq;
69/// use num::Complex;
70///
71/// let v_complex = vector![Complex::new(1.0_f64, 2.0_f64), Complex::new(-1.0_f64, -2.0_f64)];
72///
73/// assert_relative_eq!(v_complex[0].re, 1.0_f64);
74/// assert_relative_eq!(v_complex[0].im, 2.0_f64);
75/// assert_relative_eq!(v_complex[1].re, -1.0_f64);
76/// assert_relative_eq!(v_complex[1].im, -2.0_f64);
77/// ```
78#[macro_export]
79macro_rules! vector {
80    ($elem:expr; $n:expr) => (
81        $crate::types::vector::Vector::from([$elem; $n])
82    );
83    ($($x:expr),+ $(,)?) => (
84        $crate::types::vector::Vector::from([$($x),+])
85    );
86}
87
88/// Returns a [`crate::Vector`] with scalar data contents and order as defined in a supported
89/// fallible numeric data collection type argument.
90///
91/// This macro can be used with supported types that may not have known length at compile
92/// time (e.g., [`Vec`] and [`slice`]).  The macro takes a single numeric data collection
93/// type argument.
94///
95/// Import the macro before use with:
96///
97/// ```
98/// use vectora::try_vector;
99/// ```
100///
101/// # Errors
102///
103/// The macro returns an error if the length of the argument data collection type differs from the
104/// requested [`crate::Vector`] length.  Errors are also propagated from argument data types. Please review
105/// the crate `TryFrom` trait implementation documentation for additional details.
106///
107/// ```
108/// use vectora::{try_vector, Vector};
109///
110/// let stdlib_vec_too_long = vec![1, 2, 3, 4, 5];
111/// let res: Result<Vector<i32, 3>, _> = try_vector!(stdlib_vec_too_long);
112///
113/// assert!(res.is_err());
114/// ```
115///
116/// ```
117/// use vectora::{try_vector, Vector};
118///
119/// let stdlib_vec_too_short = vec![1, 2];
120/// let res: Result<Vector<i32, 3>, _> = try_vector!(stdlib_vec_too_short);
121///
122/// assert!(res.is_err());
123/// ```
124///
125/// # Examples
126///
127/// ## Integer types
128///
129/// ```
130/// use vectora::{try_vector, Vector};
131///
132/// let stdlib_vec_i32 = vec![1_i32, 2_i32, 3_i32];
133/// let v_i32: Vector<i32, 3> = try_vector!(stdlib_vec_i32).unwrap();
134///
135/// assert_eq!(v_i32[0], 1_i32);
136/// assert_eq!(v_i32[1], 2_i32);
137/// assert_eq!(v_i32[2], 3_i32);
138/// ```
139///
140/// ## Floating point types
141///
142/// ```
143/// use vectora::{try_vector, Vector};
144///
145/// use approx::assert_relative_eq;
146///
147/// let stdlib_vec_f64 = vec![1.0_f64, 2.0_f64, 3.0_f64];
148/// let v_f64: Vector<f64, 3> = try_vector!(stdlib_vec_f64).unwrap();
149///
150/// assert_relative_eq!(v_f64[0], 1.0_f64);
151/// assert_relative_eq!(v_f64[1], 2.0_f64);
152/// assert_relative_eq!(v_f64[2], 3.0_f64);
153/// ```
154///
155/// ## Complex number types
156///
157/// ```
158/// use vectora::{try_vector, Vector};
159///
160/// use approx::assert_relative_eq;
161/// use num::Complex;
162///
163/// let stdlib_vec_complex = vec![Complex::new(1.0_f64, 2.0_f64), Complex::new(3.0_f64, 4.0_f64)];
164/// let v_complex_f64: Vector<Complex<f64>, 2> = try_vector!(stdlib_vec_complex).unwrap();
165///
166/// assert_relative_eq!(v_complex_f64[0].re, 1.0_f64);
167/// assert_relative_eq!(v_complex_f64[0].im, 2.0_f64);
168/// assert_relative_eq!(v_complex_f64[1].re, 3.0_f64);
169/// assert_relative_eq!(v_complex_f64[1].im, 4.0_f64);
170/// ```
171#[macro_export]
172macro_rules! try_vector {
173    ($elem:expr) => {
174        $crate::types::vector::Vector::try_from($elem)
175    };
176}
177
178#[cfg(test)]
179mod tests {
180    use crate::Vector;
181    #[allow(unused_imports)]
182    use approx::{assert_relative_eq, assert_relative_ne};
183    #[allow(unused_imports)]
184    use num::complex::Complex;
185    #[allow(unused_imports)]
186    use pretty_assertions::{assert_eq, assert_ne};
187
188    #[test]
189    fn macro_vector_usize() {
190        let v1 = vector![1 as usize, 2 as usize, 3 as usize];
191        let v2: Vector<usize, 3> = vector![1, 2, 3];
192        let v3: Vector<usize, 3> = vector![1; 3];
193
194        assert_eq!(v1.len(), 3);
195        assert_eq!(v1[0], 1 as usize);
196        assert_eq!(v1[1], 2 as usize);
197        assert_eq!(v1[2], 3 as usize);
198
199        assert_eq!(v2.len(), 3);
200        assert_eq!(v2[0], 1 as usize);
201        assert_eq!(v2[1], 2 as usize);
202        assert_eq!(v2[2], 3 as usize);
203
204        assert_eq!(v3.len(), 3);
205        assert_eq!(v3[0], 1 as usize);
206        assert_eq!(v3[1], 1 as usize);
207        assert_eq!(v3[2], 1 as usize);
208    }
209
210    #[test]
211    fn macro_vector_u8() {
212        let v1 = vector![1 as u8, 2 as u8, 3 as u8];
213        let v2: Vector<u8, 3> = vector![1, 2, 3];
214        let v3: Vector<u8, 3> = vector![1; 3];
215
216        assert_eq!(v1.len(), 3);
217        assert_eq!(v1[0], 1 as u8);
218        assert_eq!(v1[1], 2 as u8);
219        assert_eq!(v1[2], 3 as u8);
220
221        assert_eq!(v2.len(), 3);
222        assert_eq!(v2[0], 1 as u8);
223        assert_eq!(v2[1], 2 as u8);
224        assert_eq!(v2[2], 3 as u8);
225
226        assert_eq!(v3.len(), 3);
227        assert_eq!(v3[0], 1 as u8);
228        assert_eq!(v3[1], 1 as u8);
229        assert_eq!(v3[2], 1 as u8);
230    }
231
232    #[test]
233    fn macro_vector_u16() {
234        let v1 = vector![1 as u16, 2 as u16, 3 as u16];
235        let v2: Vector<u16, 3> = vector![1, 2, 3];
236        let v3: Vector<u16, 3> = vector![1; 3];
237
238        assert_eq!(v1.len(), 3);
239        assert_eq!(v1[0], 1 as u16);
240        assert_eq!(v1[1], 2 as u16);
241        assert_eq!(v1[2], 3 as u16);
242
243        assert_eq!(v2.len(), 3);
244        assert_eq!(v2[0], 1 as u16);
245        assert_eq!(v2[1], 2 as u16);
246        assert_eq!(v2[2], 3 as u16);
247
248        assert_eq!(v3.len(), 3);
249        assert_eq!(v3[0], 1 as u16);
250        assert_eq!(v3[1], 1 as u16);
251        assert_eq!(v3[2], 1 as u16);
252    }
253
254    #[test]
255    fn macro_vector_u32() {
256        let v1 = vector![1 as u32, 2 as u32, 3 as u32];
257        let v2: Vector<u32, 3> = vector![1, 2, 3];
258        let v3: Vector<u32, 3> = vector![1; 3];
259
260        assert_eq!(v1.len(), 3);
261        assert_eq!(v1[0], 1 as u32);
262        assert_eq!(v1[1], 2 as u32);
263        assert_eq!(v1[2], 3 as u32);
264
265        assert_eq!(v2.len(), 3);
266        assert_eq!(v2[0], 1 as u32);
267        assert_eq!(v2[1], 2 as u32);
268        assert_eq!(v2[2], 3 as u32);
269
270        assert_eq!(v3.len(), 3);
271        assert_eq!(v3[0], 1 as u32);
272        assert_eq!(v3[1], 1 as u32);
273        assert_eq!(v3[2], 1 as u32);
274    }
275
276    #[test]
277    fn macro_vector_u64() {
278        let v1 = vector![1 as u64, 2 as u64, 3 as u64];
279        let v2: Vector<u64, 3> = vector![1, 2, 3];
280        let v3: Vector<u64, 3> = vector![1; 3];
281
282        assert_eq!(v1.len(), 3);
283        assert_eq!(v1[0], 1 as u64);
284        assert_eq!(v1[1], 2 as u64);
285        assert_eq!(v1[2], 3 as u64);
286
287        assert_eq!(v2.len(), 3);
288        assert_eq!(v2[0], 1 as u64);
289        assert_eq!(v2[1], 2 as u64);
290        assert_eq!(v2[2], 3 as u64);
291
292        assert_eq!(v3.len(), 3);
293        assert_eq!(v3[0], 1 as u64);
294        assert_eq!(v3[1], 1 as u64);
295        assert_eq!(v3[2], 1 as u64);
296    }
297
298    #[test]
299    fn macro_vector_u128() {
300        let v1 = vector![1 as u128, 2 as u128, 3 as u128];
301        let v2: Vector<u128, 3> = vector![1, 2, 3];
302        let v3: Vector<u128, 3> = vector![1; 3];
303
304        assert_eq!(v1.len(), 3);
305        assert_eq!(v1[0], 1 as u128);
306        assert_eq!(v1[1], 2 as u128);
307        assert_eq!(v1[2], 3 as u128);
308
309        assert_eq!(v2.len(), 3);
310        assert_eq!(v2[0], 1 as u128);
311        assert_eq!(v2[1], 2 as u128);
312        assert_eq!(v2[2], 3 as u128);
313
314        assert_eq!(v3.len(), 3);
315        assert_eq!(v3[0], 1 as u128);
316        assert_eq!(v3[1], 1 as u128);
317        assert_eq!(v3[2], 1 as u128);
318    }
319
320    #[test]
321    fn macro_vector_isize() {
322        let v1 = vector![1 as isize, 2 as isize, 3 as isize];
323        let v2: Vector<isize, 3> = vector![1, 2, 3];
324        let v3: Vector<isize, 3> = vector![1; 3];
325
326        assert_eq!(v1.len(), 3);
327        assert_eq!(v1[0], 1 as isize);
328        assert_eq!(v1[1], 2 as isize);
329        assert_eq!(v1[2], 3 as isize);
330
331        assert_eq!(v2.len(), 3);
332        assert_eq!(v2[0], 1 as isize);
333        assert_eq!(v2[1], 2 as isize);
334        assert_eq!(v2[2], 3 as isize);
335
336        assert_eq!(v3.len(), 3);
337        assert_eq!(v3[0], 1 as isize);
338        assert_eq!(v3[1], 1 as isize);
339        assert_eq!(v3[2], 1 as isize);
340    }
341
342    #[test]
343    fn macro_vector_i8() {
344        let v1 = vector![1 as i8, 2 as i8, 3 as i8];
345        let v2: Vector<i8, 3> = vector![1, 2, 3];
346        let v3: Vector<i8, 3> = vector![1; 3];
347
348        assert_eq!(v1.len(), 3);
349        assert_eq!(v1[0], 1 as i8);
350        assert_eq!(v1[1], 2 as i8);
351        assert_eq!(v1[2], 3 as i8);
352
353        assert_eq!(v2.len(), 3);
354        assert_eq!(v2[0], 1 as i8);
355        assert_eq!(v2[1], 2 as i8);
356        assert_eq!(v2[2], 3 as i8);
357
358        assert_eq!(v3.len(), 3);
359        assert_eq!(v3[0], 1 as i8);
360        assert_eq!(v3[1], 1 as i8);
361        assert_eq!(v3[2], 1 as i8);
362    }
363
364    #[test]
365    fn macro_vector_i16() {
366        let v1 = vector![1 as i16, 2 as i16, 3 as i16];
367        let v2: Vector<i16, 3> = vector![1, 2, 3];
368        let v3: Vector<i16, 3> = vector![1; 3];
369
370        assert_eq!(v1.len(), 3);
371        assert_eq!(v1[0], 1 as i16);
372        assert_eq!(v1[1], 2 as i16);
373        assert_eq!(v1[2], 3 as i16);
374
375        assert_eq!(v2.len(), 3);
376        assert_eq!(v2[0], 1 as i16);
377        assert_eq!(v2[1], 2 as i16);
378        assert_eq!(v2[2], 3 as i16);
379
380        assert_eq!(v3.len(), 3);
381        assert_eq!(v3[0], 1 as i16);
382        assert_eq!(v3[1], 1 as i16);
383        assert_eq!(v3[2], 1 as i16);
384    }
385
386    #[test]
387    fn macro_vector_i32() {
388        let v1 = vector![1 as i32, 2 as i32, 3 as i32];
389        let v2: Vector<i32, 3> = vector![1, 2, 3];
390        let v3: Vector<i32, 3> = vector![1; 3];
391
392        assert_eq!(v1.len(), 3);
393        assert_eq!(v1[0], 1 as i32);
394        assert_eq!(v1[1], 2 as i32);
395        assert_eq!(v1[2], 3 as i32);
396
397        assert_eq!(v2.len(), 3);
398        assert_eq!(v2[0], 1 as i32);
399        assert_eq!(v2[1], 2 as i32);
400        assert_eq!(v2[2], 3 as i32);
401
402        assert_eq!(v3.len(), 3);
403        assert_eq!(v3[0], 1 as i32);
404        assert_eq!(v3[1], 1 as i32);
405        assert_eq!(v3[2], 1 as i32);
406    }
407
408    #[test]
409    fn macro_vector_i64() {
410        let v1 = vector![1 as i64, 2 as i64, 3 as i64];
411        let v2: Vector<i64, 3> = vector![1, 2, 3];
412        let v3: Vector<i64, 3> = vector![1; 3];
413
414        assert_eq!(v1.len(), 3);
415        assert_eq!(v1[0], 1 as i64);
416        assert_eq!(v1[1], 2 as i64);
417        assert_eq!(v1[2], 3 as i64);
418
419        assert_eq!(v2.len(), 3);
420        assert_eq!(v2[0], 1 as i64);
421        assert_eq!(v2[1], 2 as i64);
422        assert_eq!(v2[2], 3 as i64);
423
424        assert_eq!(v3.len(), 3);
425        assert_eq!(v3[0], 1 as i64);
426        assert_eq!(v3[1], 1 as i64);
427        assert_eq!(v3[2], 1 as i64);
428    }
429
430    #[test]
431    fn macro_vector_i128() {
432        let v1 = vector![1 as i128, 2 as i128, 3 as i128];
433        let v2: Vector<i128, 3> = vector![1, 2, 3];
434        let v3: Vector<i128, 3> = vector![1; 3];
435
436        assert_eq!(v1.len(), 3);
437        assert_eq!(v1[0], 1 as i128);
438        assert_eq!(v1[1], 2 as i128);
439        assert_eq!(v1[2], 3 as i128);
440
441        assert_eq!(v2.len(), 3);
442        assert_eq!(v2[0], 1 as i128);
443        assert_eq!(v2[1], 2 as i128);
444        assert_eq!(v2[2], 3 as i128);
445
446        assert_eq!(v3.len(), 3);
447        assert_eq!(v3[0], 1 as i128);
448        assert_eq!(v3[1], 1 as i128);
449        assert_eq!(v3[2], 1 as i128);
450    }
451
452    #[test]
453    fn macro_vector_f32() {
454        let v1 = vector![1. as f32, 2. as f32, 3. as f32];
455        let v2: Vector<f32, 3> = vector![1., 2., 3.];
456        let v3: Vector<f32, 3> = vector![1.; 3];
457
458        assert_eq!(v1.len(), 3);
459        assert_relative_eq!(v1[0], 1.0 as f32);
460        assert_relative_eq!(v1[1], 2.0 as f32);
461        assert_relative_eq!(v1[2], 3.0 as f32);
462
463        assert_eq!(v2.len(), 3);
464        assert_relative_eq!(v2[0], 1.0 as f32);
465        assert_relative_eq!(v2[1], 2.0 as f32);
466        assert_relative_eq!(v2[2], 3.0 as f32);
467
468        assert_eq!(v3.len(), 3);
469        assert_relative_eq!(v3[0], 1.0 as f32);
470        assert_relative_eq!(v3[1], 1.0 as f32);
471        assert_relative_eq!(v3[2], 1.0 as f32);
472    }
473
474    #[test]
475    fn macro_vector_f64() {
476        let v1 = vector![1. as f64, 2. as f64, 3. as f64];
477        let v2: Vector<f64, 3> = vector![1., 2., 3.];
478        let v3: Vector<f64, 3> = vector![1.; 3];
479
480        assert_eq!(v1.len(), 3);
481        assert_relative_eq!(v1[0], 1.0 as f64);
482        assert_relative_eq!(v1[1], 2.0 as f64);
483        assert_relative_eq!(v1[2], 3.0 as f64);
484
485        assert_eq!(v2.len(), 3);
486        assert_relative_eq!(v2[0], 1.0 as f64);
487        assert_relative_eq!(v2[1], 2.0 as f64);
488        assert_relative_eq!(v2[2], 3.0 as f64);
489
490        assert_eq!(v3.len(), 3);
491        assert_relative_eq!(v3[0], 1.0 as f64);
492        assert_relative_eq!(v3[1], 1.0 as f64);
493        assert_relative_eq!(v3[2], 1.0 as f64);
494    }
495
496    #[test]
497    fn macro_vector_complex_i32() {
498        let v1 = vector![Complex::new(1 as i32, -2 as i32), Complex::new(-1 as i32, 2 as i32)];
499        let v2: Vector<Complex<i32>, 2> = vector![Complex::new(1, -2), Complex::new(-1, 2)];
500        let v3: Vector<Complex<i32>, 2> = vector![Complex::new(1, -2); 2];
501
502        assert_eq!(v1.len(), 2);
503        assert_eq!(v1[0].re, 1 as i32);
504        assert_eq!(v1[0].im, -2 as i32);
505        assert_eq!(v1[1].re, -1 as i32);
506        assert_eq!(v1[1].im, 2 as i32);
507
508        assert_eq!(v2.len(), 2);
509        assert_eq!(v2[0].re, 1 as i32);
510        assert_eq!(v2[0].im, -2 as i32);
511        assert_eq!(v2[1].re, -1 as i32);
512        assert_eq!(v2[1].im, 2 as i32);
513
514        assert_eq!(v3.len(), 2);
515        assert_eq!(v3[0].re, 1 as i32);
516        assert_eq!(v3[0].im, -2 as i32);
517        assert_eq!(v3[1].re, 1 as i32);
518        assert_eq!(v3[1].im, -2 as i32);
519    }
520
521    #[test]
522    fn macro_vector_complex_f64() {
523        let v1 = vector![Complex::new(1. as f64, -2. as f64), Complex::new(-1. as f64, 2. as f64)];
524        let v2: Vector<Complex<f64>, 2> = vector![Complex::new(1., -2.), Complex::new(-1., 2.)];
525        let v3: Vector<Complex<f64>, 2> = vector![Complex::new(1., -2.); 2];
526
527        assert_eq!(v1.len(), 2);
528        assert_relative_eq!(v1[0].re, 1. as f64);
529        assert_relative_eq!(v1[0].im, -2. as f64);
530        assert_relative_eq!(v1[1].re, -1. as f64);
531        assert_relative_eq!(v1[1].im, 2. as f64);
532
533        assert_eq!(v2.len(), 2);
534        assert_relative_eq!(v2[0].re, 1. as f64);
535        assert_relative_eq!(v2[0].im, -2. as f64);
536        assert_relative_eq!(v2[1].re, -1. as f64);
537        assert_relative_eq!(v2[1].im, 2. as f64);
538
539        assert_eq!(v3.len(), 2);
540        assert_relative_eq!(v3[0].re, 1. as f64);
541        assert_relative_eq!(v3[0].im, -2. as f64);
542        assert_relative_eq!(v3[1].re, 1. as f64);
543        assert_relative_eq!(v3[1].im, -2. as f64);
544    }
545
546    #[test]
547    fn macro_try_vector_i32() {
548        let slv = vec![1_i32, 2_i32, 3_i32];
549        let v: Vector<i32, 3> = try_vector!(slv).unwrap();
550
551        assert_eq!(v[0], 1_i32);
552        assert_eq!(v[1], 2_i32);
553        assert_eq!(v[2], 3_i32);
554
555        let slv = vec![1_i32, 2_i32, 3_i32];
556        let v: Vector<i32, 3> = try_vector!(&slv).unwrap();
557
558        assert_eq!(v[0], 1_i32);
559        assert_eq!(v[1], 2_i32);
560        assert_eq!(v[2], 3_i32);
561
562        let slv = vec![1_i32, 2_i32, 3_i32];
563        let v: Vector<i32, 3> = try_vector!(&slv[..]).unwrap();
564
565        assert_eq!(v[0], 1_i32);
566        assert_eq!(v[1], 2_i32);
567        assert_eq!(v[2], 3_i32);
568    }
569
570    #[test]
571    fn macro_try_vector_f64() {
572        let slv = vec![1.0_f64, 2.0_f64, 3.0_f64];
573        let v: Vector<f64, 3> = try_vector!(slv).unwrap();
574
575        assert_relative_eq!(v[0], 1.0_f64);
576        assert_relative_eq!(v[1], 2.0_f64);
577        assert_relative_eq!(v[2], 3.0_f64);
578
579        let slv = vec![1.0_f64, 2.0_f64, 3.0_f64];
580        let v: Vector<f64, 3> = try_vector!(&slv).unwrap();
581
582        assert_relative_eq!(v[0], 1.0_f64);
583        assert_relative_eq!(v[1], 2.0_f64);
584        assert_relative_eq!(v[2], 3.0_f64);
585
586        let slv = vec![1.0_f64, 2.0_f64, 3.0_f64];
587        let v: Vector<f64, 3> = try_vector!(&slv[..]).unwrap();
588
589        assert_relative_eq!(v[0], 1.0_f64);
590        assert_relative_eq!(v[1], 2.0_f64);
591        assert_relative_eq!(v[2], 3.0_f64);
592    }
593
594    #[test]
595    fn macro_try_vector_complex_i32() {
596        let slv = vec![Complex::new(1_i32, 2_i32), Complex::new(3_i32, 4_i32)];
597        let v: Vector<Complex<i32>, 2> = try_vector!(slv).unwrap();
598
599        assert_eq!(v[0].re, 1_i32);
600        assert_eq!(v[0].im, 2_i32);
601        assert_eq!(v[1].re, 3_i32);
602        assert_eq!(v[1].im, 4_i32);
603
604        let slv = vec![Complex::new(1_i32, 2_i32), Complex::new(3_i32, 4_i32)];
605        let v: Vector<Complex<i32>, 2> = try_vector!(&slv).unwrap();
606
607        assert_eq!(v[0].re, 1_i32);
608        assert_eq!(v[0].im, 2_i32);
609        assert_eq!(v[1].re, 3_i32);
610        assert_eq!(v[1].im, 4_i32);
611
612        let slv = vec![Complex::new(1_i32, 2_i32), Complex::new(3_i32, 4_i32)];
613        let v: Vector<Complex<i32>, 2> = try_vector!(&slv[..]).unwrap();
614
615        assert_eq!(v[0].re, 1_i32);
616        assert_eq!(v[0].im, 2_i32);
617        assert_eq!(v[1].re, 3_i32);
618        assert_eq!(v[1].im, 4_i32);
619    }
620
621    #[test]
622    fn macro_try_vector_complex_f64() {
623        let slv = vec![Complex::new(1.0_f64, 2.0_f64), Complex::new(3.0_f64, 4.0_f64)];
624        let v: Vector<Complex<f64>, 2> = try_vector!(slv).unwrap();
625
626        assert_relative_eq!(v[0].re, 1.0_f64);
627        assert_relative_eq!(v[0].im, 2.0_f64);
628        assert_relative_eq!(v[1].re, 3.0_f64);
629        assert_relative_eq!(v[1].im, 4.0_f64);
630
631        let slv = vec![Complex::new(1.0_f64, 2.0_f64), Complex::new(3.0_f64, 4.0_f64)];
632        let v: Vector<Complex<f64>, 2> = try_vector!(&slv).unwrap();
633
634        assert_relative_eq!(v[0].re, 1.0_f64);
635        assert_relative_eq!(v[0].im, 2.0_f64);
636        assert_relative_eq!(v[1].re, 3.0_f64);
637        assert_relative_eq!(v[1].im, 4.0_f64);
638
639        let slv = vec![Complex::new(1.0_f64, 2.0_f64), Complex::new(3.0_f64, 4.0_f64)];
640        let v: Vector<Complex<f64>, 2> = try_vector!(&slv[..]).unwrap();
641
642        assert_relative_eq!(v[0].re, 1.0_f64);
643        assert_relative_eq!(v[0].im, 2.0_f64);
644        assert_relative_eq!(v[1].re, 3.0_f64);
645        assert_relative_eq!(v[1].im, 4.0_f64);
646    }
647}