indvec/lib.rs
1#![no_std]
2
3#[doc(hidden)]
4pub extern crate alloc;
5
6#[doc(hidden)]
7#[macro_export]
8macro_rules! seq_ident {
9 ($($ident:ident),*) => {
10 {
11 let mut counter = 0usize;
12 $(
13 let $ident = counter;
14 counter += 1usize;
15 )*
16 [$($ident),*]
17 }
18 }
19}
20
21/// A [`Vec`][alloc::vec::Vec] literal that assigns item indices.
22///
23/// ```
24/// use indvec::indvec;
25///
26/// indvec![vec =
27/// a = "foo",
28/// b = "bar",
29/// _c = "qux",
30/// d = "corge",
31/// ];
32///
33/// assert_eq!(a, 0usize);
34/// assert_eq!(b, 1usize);
35/// assert_eq!(d, 3usize);
36///
37/// assert_eq!(vec[a], "foo");
38/// assert_eq!(vec[b], "bar");
39/// assert_eq!(vec[d], "corge");
40/// ```
41#[macro_export]
42macro_rules! indvec {
43 ($vec:pat = $($ident:ident = $expr:expr),* $(,)?) => {
44 #[allow(unused_assignments)]
45 let [$($ident),*] = $crate::seq_ident!($($ident),*);
46 let $vec = $crate::alloc::vec![$($expr),*];
47 }
48}