ordermap/
macros.rs

1/// Create an [`OrderMap`][crate::OrderMap] from a list of key-value pairs
2/// and a [`BuildHasherDefault`][core::hash::BuildHasherDefault]-wrapped custom hasher.
3///
4/// ## Example
5///
6/// ```
7/// use ordermap::ordermap_with_default;
8/// use fnv::FnvHasher;
9///
10/// let map = ordermap_with_default!{
11///     FnvHasher;
12///     "a" => 1,
13///     "b" => 2,
14/// };
15/// assert_eq!(map["a"], 1);
16/// assert_eq!(map["b"], 2);
17/// assert_eq!(map.get("c"), None);
18///
19/// // "a" is the first key
20/// assert_eq!(map.keys().next(), Some(&"a"));
21/// ```
22#[macro_export]
23macro_rules! ordermap_with_default {
24    ($H:ty; $($key:expr => $value:expr,)+) => { $crate::ordermap_with_default!($H; $($key => $value),+) };
25    ($H:ty; $($key:expr => $value:expr),*) => {{
26        let builder = ::core::hash::BuildHasherDefault::<$H>::default();
27        const CAP: usize = <[()]>::len(&[$({ stringify!($key); }),*]);
28        #[allow(unused_mut)]
29        // Specify your custom `H` (must implement Default + Hasher) as the hasher:
30        let mut map = $crate::OrderMap::with_capacity_and_hasher(CAP, builder);
31        $(
32            map.insert($key, $value);
33        )*
34        map
35    }};
36}
37
38#[cfg(feature = "std")]
39#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
40#[macro_export]
41/// Create an [`OrderMap`][crate::OrderMap] from a list of key-value pairs
42///
43/// ## Example
44///
45/// ```
46/// use ordermap::ordermap;
47///
48/// let map = ordermap!{
49///     "a" => 1,
50///     "b" => 2,
51/// };
52/// assert_eq!(map["a"], 1);
53/// assert_eq!(map["b"], 2);
54/// assert_eq!(map.get("c"), None);
55///
56/// // "a" is the first key
57/// assert_eq!(map.keys().next(), Some(&"a"));
58/// ```
59macro_rules! ordermap {
60    ($($key:expr => $value:expr,)+) => { $crate::ordermap!($($key => $value),+) };
61    ($($key:expr => $value:expr),*) => {
62        {
63            // Note: `stringify!($key)` is just here to consume the repetition,
64            // but we throw away that string literal during constant evaluation.
65            const CAP: usize = <[()]>::len(&[$({ stringify!($key); }),*]);
66            let mut map = $crate::OrderMap::with_capacity(CAP);
67            $(
68                map.insert($key, $value);
69            )*
70            map
71        }
72    };
73}
74
75/// Create an [`OrderSet`][crate::OrderSet] from a list of values
76/// and a [`BuildHasherDefault`][core::hash::BuildHasherDefault]-wrapped custom hasher.
77///
78/// ## Example
79///
80/// ```
81/// use ordermap::orderset_with_default;
82/// use fnv::FnvHasher;
83///
84/// let set = orderset_with_default!{
85///     FnvHasher;
86///     "a",
87///     "b",
88/// };
89/// assert!(set.contains("a"));
90/// assert!(set.contains("b"));
91/// assert!(!set.contains("c"));
92///
93/// // "a" is the first value
94/// assert_eq!(set.iter().next(), Some(&"a"));
95/// ```
96#[macro_export]
97macro_rules! orderset_with_default {
98    ($H:ty; $($value:expr,)+) => { $crate::orderset_with_default!($H; $($value),+) };
99    ($H:ty; $($value:expr),*) => {{
100        let builder = ::core::hash::BuildHasherDefault::<$H>::default();
101        const CAP: usize = <[()]>::len(&[$({ stringify!($value); }),*]);
102        #[allow(unused_mut)]
103        // Specify your custom `H` (must implement Default + Hash) as the hasher:
104        let mut set = $crate::OrderSet::with_capacity_and_hasher(CAP, builder);
105        $(
106            set.insert($value);
107        )*
108        set
109    }};
110}
111
112#[cfg(feature = "std")]
113#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
114#[macro_export]
115/// Create an [`OrderSet`][crate::OrderSet] from a list of values
116///
117/// ## Example
118///
119/// ```
120/// use ordermap::orderset;
121///
122/// let set = orderset!{
123///     "a",
124///     "b",
125/// };
126/// assert!(set.contains("a"));
127/// assert!(set.contains("b"));
128/// assert!(!set.contains("c"));
129///
130/// // "a" is the first value
131/// assert_eq!(set.iter().next(), Some(&"a"));
132/// ```
133macro_rules! orderset {
134    ($($value:expr,)+) => { $crate::orderset!($($value),+) };
135    ($($value:expr),*) => {
136        {
137            // Note: `stringify!($value)` is just here to consume the repetition,
138            // but we throw away that string literal during constant evaluation.
139            const CAP: usize = <[()]>::len(&[$({ stringify!($value); }),*]);
140            let mut set = $crate::OrderSet::with_capacity(CAP);
141            $(
142                set.insert($value);
143            )*
144            set
145        }
146    };
147}