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}