matreex/
macros.rs

1/// Creates a new [`Matrix<T>`] from literal.
2///
3/// > I witnessed His decree:
4/// >
5/// > > Let there be matrix!
6/// >
7/// > Thus, [`matrix!`] was brought forth into existence.
8///
9/// # Examples
10///
11/// ```
12/// use matreex::{Matrix, matrix};
13///
14/// let foo: Matrix<i32> = matrix![];
15/// let bar = matrix![[0; 3]; 2];
16/// let baz = matrix![[1, 2, 3]; 2];
17/// let qux = matrix![[1, 2, 3], [4, 5, 6]];
18/// ```
19///
20/// [`Matrix<T>`]: crate::Matrix
21/// [`matrix!`]: crate::matrix!
22#[macro_export]
23macro_rules! matrix {
24    [] => {
25        $crate::Matrix::new()
26    };
27
28    [[$elem:expr; $ncols:expr]; $nrows:expr] => {
29        match $crate::Matrix::with_value(($nrows, $ncols), $elem) {
30            Err(error) => ::std::panic!("{error}"),
31            Ok(matrix) => matrix,
32        }
33    };
34
35    [[$($elem:expr),+ $(,)?]; $nrows:expr] => {
36        $crate::Matrix::from(::std::vec![[$($elem),+]; $nrows])
37    };
38
39    [$($row:expr),+ $(,)?] => {
40        $crate::Matrix::from([$($row),+])
41    };
42}
43
44/// Creates a new row vector from literal.
45///
46/// # Examples
47///
48/// ```
49/// use matreex::{Matrix, matrix, row_vec};
50///
51/// let foo: Matrix<i32> = row_vec![];
52/// assert_eq!(foo.nrows(), 1);
53/// assert_eq!(foo.ncols(), 0);
54///
55/// let bar = row_vec![0; 3];
56/// assert_eq!(bar, matrix![[0, 0, 0]]);
57///
58/// let baz = row_vec![0, 1, 2];
59/// assert_eq!(baz, matrix![[0, 1, 2]]);
60/// ```
61#[macro_export]
62macro_rules! row_vec {
63    [] => {
64        $crate::Matrix::from_row(::std::vec::Vec::new());
65    };
66
67    [$elem:expr; $n:expr] => {
68        $crate::Matrix::from_row(::std::vec![$elem; $n])
69    };
70
71    [$($elem:expr),+ $(,)?] => {
72        $crate::Matrix::from_row(::std::vec![$($elem),+])
73    };
74}
75
76/// Creates a new column vector from literal.
77///
78/// # Examples
79///
80/// ```
81/// use matreex::{Matrix, matrix, col_vec};
82///
83/// let foo: Matrix<i32> = col_vec![];
84/// assert_eq!(foo.nrows(), 0);
85/// assert_eq!(foo.ncols(), 1);
86///
87/// let bar = col_vec![0; 3];
88/// assert_eq!(bar, matrix![[0], [0], [0]]);
89///
90/// let baz = col_vec![0, 1, 2];
91/// assert_eq!(baz, matrix![[0], [1], [2]]);
92/// ```
93#[macro_export]
94macro_rules! col_vec {
95    [] => {
96        $crate::Matrix::from_col(::std::vec::Vec::new());
97    };
98
99    [$elem:expr; $n:expr] => {
100        $crate::Matrix::from_col(::std::vec![$elem; $n])
101    };
102
103    [$($elem:expr),+ $(,)?] => {
104        $crate::Matrix::from_col(::std::vec![$($elem),+])
105    };
106}