bounded_vector/
macros.rs

1/// Macro similar to vec!
2///
3/// Examples
4///
5/// Creating BoundedVec from elements
6/// ```
7/// use bounded_vector::{BoundedVec, bvec};
8///
9/// let bvec: BoundedVec<i32, 0, 3> = bvec![1, 2, 3];
10/// assert_eq!(vec![1,2,3], bvec.to_vec());
11/// ```
12///
13/// Creating BoundedVec from n same elements
14/// ```
15/// use bounded_vector::{BoundedVec, bvec};
16///
17///
18/// let bvec: BoundedVec<i32, 0, 3> = bvec![1; 3];
19/// assert_eq!(vec![1,1,1], bvec.to_vec());
20/// ```
21///
22/// Creating empty BoundedVec<_, 0, _>.
23/// ```
24/// use bounded_vector::{BoundedVec, bvec};
25///
26/// let bvec: BoundedVec<i32, 0, 0> = bvec![];
27/// assert_eq!(BoundedVec::new(), bvec);
28/// ```
29///
30/// Creating BoundedVec from n same elements(runtime)
31/// ```
32/// use bounded_vector::{BoundedVec, bvec};
33///
34/// // bvec![1; 2+1] returns Result because 2+1 isn't literal so it can't be checked at compile time
35/// let bvec: BoundedVec<i32, 0, 3> = bvec![1; 2+1].expect("In range");
36/// assert_eq!(vec![1,1,1], bvec.to_vec());
37/// ```
38///
39#[macro_export]
40macro_rules! bvec {
41	() => {{
42		$crate::BoundedVec::new()
43	}};
44
45	($elem:expr; $n:literal) => {
46		$crate::BoundedVec::from([$elem; $n])
47	};
48
49	($elem:expr; $n:expr) => {
50		$crate::BoundedVec::from_elem($elem, $n)
51	};
52
53	($($x:expr),+ $(,)?) => {
54        $crate::BoundedVec::from(Box::new([$($x),+]))
55	};
56}
57
58#[cfg(test)]
59mod tests {
60	use crate::*;
61
62	#[test]
63	fn empty() {
64		let vec_from_macro: BoundedVec<i32, 0, 0> = bvec![];
65		let vec = BoundedVec::<i32, 0, 0>::new();
66		assert_eq!(vec_from_macro, vec);
67	}
68
69	#[test]
70	fn from_elements() {
71		let vec_from_macro: BoundedVec<_, 3, 3> = bvec![1, 2, 3];
72		assert_eq!(vec_from_macro.to_vec(), vec![1, 2, 3]);
73	}
74
75	#[test]
76	fn n_elements() {
77		// let vec_from_macro: BoundedVec<_, 3, 3> = bvec![2u8; 3].unwrap();
78		// assert_eq!(vec_from_macro.to_vec(), vec![2, 2, 2]);
79
80		// let vec_from_macro: Result<BoundedVec<_, 0, 0>, _> = bvec![2u8; 3];
81		// assert_eq!(vec_from_macro, Err(Error::OutOfBoundsVec));
82	}
83}