bounded_vector/
macros.rs

1/// Macro similar to vec!
2///
3///
4/// Examples
5///
6/// Creating BoundedVec from elements
7/// ```rust
8/// # use std::error::Error;
9/// # use bounded_vector::{BoundedVec, bvec};
10/// #
11/// # fn main() -> Result<(), Box<dyn Error>> {
12/// let bvec: BoundedVec<i32, 0, 3> = bvec![1, 2, 3]?;
13/// assert_eq!(vec![1,2,3], bvec.to_vec());
14/// # Ok(())
15/// # }
16/// ```
17///
18/// Creating BoundedVec from n same elements(must have clone trait)
19/// ```rust
20/// # use std::error::Error;
21/// # use bounded_vector::{BoundedVec, bvec};
22/// #
23/// # fn main() -> Result<(), Box<dyn Error>> {
24/// let bvec: BoundedVec<i32, 0, 3> = bvec![1; 3]?;
25/// assert_eq!(vec![1,1,1], bvec.to_vec());
26/// # Ok(())
27/// # }
28/// ```
29///
30/// Macro gives Error for first two usages if element count don't fit bounds
31/// ```rust
32/// # use std::error;
33/// # use bounded_vector::{BoundedVec, bvec, Error};
34/// #
35/// # fn main() -> Result<(), Box<dyn error::Error>> {
36/// let bvec: Result<BoundedVec<i32, 0, 0>, _> = bvec![1];
37/// assert_eq!(bvec, Err(Error::OutOfBoundsVec));
38/// # Ok(())
39/// # }
40/// ```
41///
42/// Creating empty BoundedVec<_, 0, _>. This usage does not return Result because it ensures correct
43/// bounds at the compile time
44/// ```rust
45/// # use std::error::Error;
46/// # use bounded_vector::{BoundedVec, bvec};
47/// #
48/// # fn main() -> Result<(), Box<dyn Error>> {
49/// let bvec: BoundedVec<i32, 0, 0> = bvec![];
50/// assert_eq!(BoundedVec::new(), bvec);
51/// # Ok(())
52/// # }
53/// ```
54#[macro_export]
55macro_rules! bvec {
56	() => {{
57		$crate::BoundedVec::new()
58	}};
59
60	($elem:expr; $n:expr) => {
61		$crate::BoundedVec::from_elem($elem, $n)
62	};
63
64	($($x:expr),+ $(,)?) => {
65        $crate::BoundedVec::try_from(<[_]>::into_vec(Box::new([$($x),+])))
66	};
67}
68
69#[cfg(test)]
70mod tests {
71	use crate::*;
72
73	#[test]
74	fn empty() {
75		let vec_from_macro: BoundedVec<i32, 0, 0> = bvec![];
76		let vec = BoundedVec::<i32, 0, 0>::new();
77		assert_eq!(vec_from_macro, vec);
78	}
79
80	#[test]
81	fn from_elements() {
82		let vec_from_macro: BoundedVec<_, 3, 3> = bvec![1, 2, 3].unwrap();
83		assert_eq!(vec_from_macro.to_vec(), vec![1, 2, 3]);
84
85		let vec_from_macro: Result<BoundedVec<_, 0, 0>, _> = bvec![1, 2, 3];
86		assert_eq!(vec_from_macro, Err(Error::OutOfBoundsVec));
87	}
88
89	#[test]
90	fn n_elements() {
91		let vec_from_macro: BoundedVec<_, 3, 3> = bvec![2u8; 3].unwrap();
92		assert_eq!(vec_from_macro.to_vec(), vec![2, 2, 2]);
93
94		let vec_from_macro: Result<BoundedVec<_, 0, 0>, _> = bvec![2u8; 3];
95		assert_eq!(vec_from_macro, Err(Error::OutOfBoundsVec));
96	}
97}