| /// Creates a [`Vec`] containing the arguments. |
| /// |
| /// `vec!` allows `Vec`s to be defined with the same syntax as array expressions. |
| /// There are two forms of this macro: |
| /// |
| /// - Create a [`Vec`] containing a given list of elements: |
| /// |
| /// ``` |
| /// use allocator_api2::vec; |
| /// let v = vec![1, 2, 3]; |
| /// assert_eq!(v[0], 1); |
| /// assert_eq!(v[1], 2); |
| /// assert_eq!(v[2], 3); |
| /// ``` |
| /// |
| /// |
| /// ``` |
| /// use allocator_api2::{vec, alloc::Global}; |
| /// let v = vec![in Global; 1, 2, 3]; |
| /// assert_eq!(v[0], 1); |
| /// assert_eq!(v[1], 2); |
| /// assert_eq!(v[2], 3); |
| /// ``` |
| /// |
| /// - Create a [`Vec`] from a given element and size: |
| /// |
| /// ``` |
| /// use allocator_api2::vec; |
| /// let v = vec![1; 3]; |
| /// assert_eq!(v, [1, 1, 1]); |
| /// ``` |
| /// |
| /// ``` |
| /// use allocator_api2::{vec, alloc::Global}; |
| /// let v = vec![in Global; 1; 3]; |
| /// assert_eq!(v, [1, 1, 1]); |
| /// ``` |
| /// |
| /// Note that unlike array expressions this syntax supports all elements |
| /// which implement [`Clone`] and the number of elements doesn't have to be |
| /// a constant. |
| /// |
| /// This will use `clone` to duplicate an expression, so one should be careful |
| /// using this with types having a nonstandard `Clone` implementation. For |
| /// example, `vec![Rc::new(1); 5]` will create a vector of five references |
| /// to the same boxed integer value, not five references pointing to independently |
| /// boxed integers. |
| /// |
| /// Also, note that `vec![expr; 0]` is allowed, and produces an empty vector. |
| /// This will still evaluate `expr`, however, and immediately drop the resulting value, so |
| /// be mindful of side effects. |
| /// |
| /// [`Vec`]: crate::vec::Vec |
| #[cfg(not(no_global_oom_handling))] |
| #[macro_export] |
| macro_rules! vec { |
| (in $alloc:expr $(;)?) => ( |
| $crate::vec::Vec::new() |
| ); |
| (in $alloc:expr; $elem:expr; $n:expr) => ( |
| $crate::vec::from_elem_in($elem, $n, $alloc) |
| ); |
| (in $alloc:expr; $($x:expr),+ $(,)?) => ( |
| $crate::boxed::Box::<[_]>::into_vec( |
| $crate::boxed::Box::slice( |
| $crate::boxed::Box::new_in([$($x),+], $alloc) |
| ) |
| ) |
| ); |
| () => ( |
| $crate::vec::Vec::new() |
| ); |
| ($elem:expr; $n:expr) => ( |
| $crate::vec::from_elem($elem, $n) |
| ); |
| ($($x:expr),+ $(,)?) => ( |
| $crate::boxed::Box::<[_]>::into_vec( |
| $crate::boxed::Box::slice( |
| $crate::boxed::Box::new([$($x),+]) |
| ) |
| ) |
| ); |
| } |