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}