Coverage Report

Created: 2025-08-26 07:09

/rust/registry/src/index.crates.io-6f17d22bba15001f/indexmap-2.11.0/src/macros.rs
Line
Count
Source (jump to first uncovered line)
1
/// Create an [`IndexMap`][crate::IndexMap] from a list of key-value pairs
2
/// and a [`BuildHasherDefault`][core::hash::BuildHasherDefault]-wrapped custom hasher.
3
///
4
/// ## Example
5
///
6
/// ```
7
/// use indexmap::indexmap_with_default;
8
/// use fnv::FnvHasher;
9
///
10
/// let map = indexmap_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]
23
macro_rules! indexmap_with_default {
24
    ($H:ty; $($key:expr => $value:expr,)+) => { $crate::indexmap_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::IndexMap::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 [`IndexMap`][crate::IndexMap] from a list of key-value pairs
42
///
43
/// ## Example
44
///
45
/// ```
46
/// use indexmap::indexmap;
47
///
48
/// let map = indexmap!{
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
/// ```
59
macro_rules! indexmap {
60
    ($($key:expr => $value:expr,)+) => { $crate::indexmap!($($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::IndexMap::with_capacity(CAP);
67
            $(
68
                map.insert($key, $value);
69
            )*
70
            map
71
        }
72
    };
73
}
74
75
/// Create an [`IndexSet`][crate::IndexSet] from a list of values
76
/// and a [`BuildHasherDefault`][core::hash::BuildHasherDefault]-wrapped custom hasher.
77
///
78
/// ## Example
79
///
80
/// ```
81
/// use indexmap::indexset_with_default;
82
/// use fnv::FnvHasher;
83
///
84
/// let set = indexset_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]
97
macro_rules! indexset_with_default {
98
    ($H:ty; $($value:expr,)+) => { $crate::indexset_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::IndexSet::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 [`IndexSet`][crate::IndexSet] from a list of values
116
///
117
/// ## Example
118
///
119
/// ```
120
/// use indexmap::indexset;
121
///
122
/// let set = indexset!{
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
/// ```
133
macro_rules! indexset {
134
    ($($value:expr,)+) => { $crate::indexset!($($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::IndexSet::with_capacity(CAP);
141
            $(
142
                set.insert($value);
143
            )*
144
            set
145
        }
146
    };
147
}
148
149
// generate all the Iterator methods by just forwarding to the underlying
150
// self.iter and mapping its element.
151
macro_rules! iterator_methods {
152
    // $map_elt is the mapping function from the underlying iterator's element
153
    // same mapping function for both options and iterators
154
    ($map_elt:expr) => {
155
0
        fn next(&mut self) -> Option<Self::Item> {
156
0
            self.iter.next().map($map_elt)
157
0
        }
Unexecuted instantiation: <indexmap::map::iter::Iter<_, _> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <indexmap::map::iter::IterMut<_, _> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <indexmap::map::iter::IterMut2<_, _> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <indexmap::map::iter::IntoIter<_, _> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <indexmap::map::iter::Drain<_, _> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <indexmap::map::iter::Keys<_, _> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <indexmap::map::iter::IntoKeys<_, _> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <indexmap::map::iter::Values<_, _> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <indexmap::map::iter::ValuesMut<_, _> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <indexmap::map::iter::IntoValues<_, _> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <indexmap::set::iter::Iter<_> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <indexmap::set::iter::IntoIter<_> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <indexmap::set::iter::Drain<_> as core::iter::traits::iterator::Iterator>::next
158
159
0
        fn size_hint(&self) -> (usize, Option<usize>) {
160
0
            self.iter.size_hint()
161
0
        }
Unexecuted instantiation: <indexmap::map::iter::Iter<_, _> as core::iter::traits::iterator::Iterator>::size_hint
Unexecuted instantiation: <indexmap::map::iter::IterMut<_, _> as core::iter::traits::iterator::Iterator>::size_hint
Unexecuted instantiation: <indexmap::map::iter::IterMut2<_, _> as core::iter::traits::iterator::Iterator>::size_hint
Unexecuted instantiation: <indexmap::map::iter::IntoIter<_, _> as core::iter::traits::iterator::Iterator>::size_hint
Unexecuted instantiation: <indexmap::map::iter::Drain<_, _> as core::iter::traits::iterator::Iterator>::size_hint
Unexecuted instantiation: <indexmap::map::iter::Keys<_, _> as core::iter::traits::iterator::Iterator>::size_hint
Unexecuted instantiation: <indexmap::map::iter::IntoKeys<_, _> as core::iter::traits::iterator::Iterator>::size_hint
Unexecuted instantiation: <indexmap::map::iter::Values<_, _> as core::iter::traits::iterator::Iterator>::size_hint
Unexecuted instantiation: <indexmap::map::iter::ValuesMut<_, _> as core::iter::traits::iterator::Iterator>::size_hint
Unexecuted instantiation: <indexmap::map::iter::IntoValues<_, _> as core::iter::traits::iterator::Iterator>::size_hint
Unexecuted instantiation: <indexmap::set::iter::Iter<_> as core::iter::traits::iterator::Iterator>::size_hint
Unexecuted instantiation: <indexmap::set::iter::IntoIter<_> as core::iter::traits::iterator::Iterator>::size_hint
Unexecuted instantiation: <indexmap::set::iter::Drain<_> as core::iter::traits::iterator::Iterator>::size_hint
162
163
0
        fn count(self) -> usize {
164
0
            self.iter.len()
165
0
        }
Unexecuted instantiation: <indexmap::map::iter::Iter<_, _> as core::iter::traits::iterator::Iterator>::count
Unexecuted instantiation: <indexmap::map::iter::IterMut<_, _> as core::iter::traits::iterator::Iterator>::count
Unexecuted instantiation: <indexmap::map::iter::IterMut2<_, _> as core::iter::traits::iterator::Iterator>::count
Unexecuted instantiation: <indexmap::map::iter::IntoIter<_, _> as core::iter::traits::iterator::Iterator>::count
Unexecuted instantiation: <indexmap::map::iter::Drain<_, _> as core::iter::traits::iterator::Iterator>::count
Unexecuted instantiation: <indexmap::map::iter::Keys<_, _> as core::iter::traits::iterator::Iterator>::count
Unexecuted instantiation: <indexmap::map::iter::IntoKeys<_, _> as core::iter::traits::iterator::Iterator>::count
Unexecuted instantiation: <indexmap::map::iter::Values<_, _> as core::iter::traits::iterator::Iterator>::count
Unexecuted instantiation: <indexmap::map::iter::ValuesMut<_, _> as core::iter::traits::iterator::Iterator>::count
Unexecuted instantiation: <indexmap::map::iter::IntoValues<_, _> as core::iter::traits::iterator::Iterator>::count
Unexecuted instantiation: <indexmap::set::iter::Iter<_> as core::iter::traits::iterator::Iterator>::count
Unexecuted instantiation: <indexmap::set::iter::IntoIter<_> as core::iter::traits::iterator::Iterator>::count
Unexecuted instantiation: <indexmap::set::iter::Drain<_> as core::iter::traits::iterator::Iterator>::count
166
167
0
        fn nth(&mut self, n: usize) -> Option<Self::Item> {
168
0
            self.iter.nth(n).map($map_elt)
169
0
        }
Unexecuted instantiation: <indexmap::map::iter::Iter<_, _> as core::iter::traits::iterator::Iterator>::nth
Unexecuted instantiation: <indexmap::map::iter::IterMut<_, _> as core::iter::traits::iterator::Iterator>::nth
Unexecuted instantiation: <indexmap::map::iter::IterMut2<_, _> as core::iter::traits::iterator::Iterator>::nth
Unexecuted instantiation: <indexmap::map::iter::IntoIter<_, _> as core::iter::traits::iterator::Iterator>::nth
Unexecuted instantiation: <indexmap::map::iter::Drain<_, _> as core::iter::traits::iterator::Iterator>::nth
Unexecuted instantiation: <indexmap::map::iter::Keys<_, _> as core::iter::traits::iterator::Iterator>::nth
Unexecuted instantiation: <indexmap::map::iter::IntoKeys<_, _> as core::iter::traits::iterator::Iterator>::nth
Unexecuted instantiation: <indexmap::map::iter::Values<_, _> as core::iter::traits::iterator::Iterator>::nth
Unexecuted instantiation: <indexmap::map::iter::ValuesMut<_, _> as core::iter::traits::iterator::Iterator>::nth
Unexecuted instantiation: <indexmap::map::iter::IntoValues<_, _> as core::iter::traits::iterator::Iterator>::nth
Unexecuted instantiation: <indexmap::set::iter::Iter<_> as core::iter::traits::iterator::Iterator>::nth
Unexecuted instantiation: <indexmap::set::iter::IntoIter<_> as core::iter::traits::iterator::Iterator>::nth
Unexecuted instantiation: <indexmap::set::iter::Drain<_> as core::iter::traits::iterator::Iterator>::nth
170
171
0
        fn last(mut self) -> Option<Self::Item> {
172
0
            self.next_back()
173
0
        }
Unexecuted instantiation: <indexmap::map::iter::Iter<_, _> as core::iter::traits::iterator::Iterator>::last
Unexecuted instantiation: <indexmap::map::iter::IterMut<_, _> as core::iter::traits::iterator::Iterator>::last
Unexecuted instantiation: <indexmap::map::iter::IterMut2<_, _> as core::iter::traits::iterator::Iterator>::last
Unexecuted instantiation: <indexmap::map::iter::IntoIter<_, _> as core::iter::traits::iterator::Iterator>::last
Unexecuted instantiation: <indexmap::map::iter::Drain<_, _> as core::iter::traits::iterator::Iterator>::last
Unexecuted instantiation: <indexmap::map::iter::Keys<_, _> as core::iter::traits::iterator::Iterator>::last
Unexecuted instantiation: <indexmap::map::iter::IntoKeys<_, _> as core::iter::traits::iterator::Iterator>::last
Unexecuted instantiation: <indexmap::map::iter::Values<_, _> as core::iter::traits::iterator::Iterator>::last
Unexecuted instantiation: <indexmap::map::iter::ValuesMut<_, _> as core::iter::traits::iterator::Iterator>::last
Unexecuted instantiation: <indexmap::map::iter::IntoValues<_, _> as core::iter::traits::iterator::Iterator>::last
Unexecuted instantiation: <indexmap::set::iter::Iter<_> as core::iter::traits::iterator::Iterator>::last
Unexecuted instantiation: <indexmap::set::iter::IntoIter<_> as core::iter::traits::iterator::Iterator>::last
Unexecuted instantiation: <indexmap::set::iter::Drain<_> as core::iter::traits::iterator::Iterator>::last
174
175
0
        fn collect<C>(self) -> C
176
0
        where
177
0
            C: FromIterator<Self::Item>,
178
0
        {
179
0
            // NB: forwarding this directly to standard iterators will
180
0
            // allow it to leverage unstable traits like `TrustedLen`.
181
0
            self.iter.map($map_elt).collect()
182
0
        }
Unexecuted instantiation: <indexmap::map::iter::Iter<_, _> as core::iter::traits::iterator::Iterator>::collect::<_>
Unexecuted instantiation: <indexmap::map::iter::IterMut<_, _> as core::iter::traits::iterator::Iterator>::collect::<_>
Unexecuted instantiation: <indexmap::map::iter::IterMut2<_, _> as core::iter::traits::iterator::Iterator>::collect::<_>
Unexecuted instantiation: <indexmap::map::iter::IntoIter<_, _> as core::iter::traits::iterator::Iterator>::collect::<_>
Unexecuted instantiation: <indexmap::map::iter::Drain<_, _> as core::iter::traits::iterator::Iterator>::collect::<_>
Unexecuted instantiation: <indexmap::map::iter::Keys<_, _> as core::iter::traits::iterator::Iterator>::collect::<_>
Unexecuted instantiation: <indexmap::map::iter::IntoKeys<_, _> as core::iter::traits::iterator::Iterator>::collect::<_>
Unexecuted instantiation: <indexmap::map::iter::Values<_, _> as core::iter::traits::iterator::Iterator>::collect::<_>
Unexecuted instantiation: <indexmap::map::iter::ValuesMut<_, _> as core::iter::traits::iterator::Iterator>::collect::<_>
Unexecuted instantiation: <indexmap::map::iter::IntoValues<_, _> as core::iter::traits::iterator::Iterator>::collect::<_>
Unexecuted instantiation: <indexmap::set::iter::Iter<_> as core::iter::traits::iterator::Iterator>::collect::<_>
Unexecuted instantiation: <indexmap::set::iter::IntoIter<_> as core::iter::traits::iterator::Iterator>::collect::<_>
Unexecuted instantiation: <indexmap::set::iter::Drain<_> as core::iter::traits::iterator::Iterator>::collect::<_>
183
    };
184
}
185
186
macro_rules! double_ended_iterator_methods {
187
    // $map_elt is the mapping function from the underlying iterator's element
188
    // same mapping function for both options and iterators
189
    ($map_elt:expr) => {
190
0
        fn next_back(&mut self) -> Option<Self::Item> {
191
0
            self.iter.next_back().map($map_elt)
192
0
        }
Unexecuted instantiation: <indexmap::map::iter::Iter<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
Unexecuted instantiation: <indexmap::map::iter::IterMut<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
Unexecuted instantiation: <indexmap::map::iter::IterMut2<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
Unexecuted instantiation: <indexmap::map::iter::IntoIter<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
Unexecuted instantiation: <indexmap::map::iter::Drain<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
Unexecuted instantiation: <indexmap::map::iter::Keys<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
Unexecuted instantiation: <indexmap::map::iter::IntoKeys<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
Unexecuted instantiation: <indexmap::map::iter::Values<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
Unexecuted instantiation: <indexmap::map::iter::ValuesMut<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
Unexecuted instantiation: <indexmap::map::iter::IntoValues<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
Unexecuted instantiation: <indexmap::set::iter::Iter<_> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
Unexecuted instantiation: <indexmap::set::iter::IntoIter<_> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
Unexecuted instantiation: <indexmap::set::iter::Drain<_> as core::iter::traits::double_ended::DoubleEndedIterator>::next_back
193
194
0
        fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
195
0
            self.iter.nth_back(n).map($map_elt)
196
0
        }
Unexecuted instantiation: <indexmap::map::iter::Iter<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back
Unexecuted instantiation: <indexmap::map::iter::IterMut<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back
Unexecuted instantiation: <indexmap::map::iter::IterMut2<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back
Unexecuted instantiation: <indexmap::map::iter::IntoIter<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back
Unexecuted instantiation: <indexmap::map::iter::Drain<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back
Unexecuted instantiation: <indexmap::map::iter::Keys<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back
Unexecuted instantiation: <indexmap::map::iter::IntoKeys<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back
Unexecuted instantiation: <indexmap::map::iter::Values<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back
Unexecuted instantiation: <indexmap::map::iter::ValuesMut<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back
Unexecuted instantiation: <indexmap::map::iter::IntoValues<_, _> as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back
Unexecuted instantiation: <indexmap::set::iter::Iter<_> as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back
Unexecuted instantiation: <indexmap::set::iter::IntoIter<_> as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back
Unexecuted instantiation: <indexmap::set::iter::Drain<_> as core::iter::traits::double_ended::DoubleEndedIterator>::nth_back
197
    };
198
}
199
200
// generate `ParallelIterator` methods by just forwarding to the underlying
201
// self.entries and mapping its elements.
202
#[cfg(feature = "rayon")]
203
macro_rules! parallel_iterator_methods {
204
    // $map_elt is the mapping function from the underlying iterator's element
205
    ($map_elt:expr) => {
206
        fn drive_unindexed<C>(self, consumer: C) -> C::Result
207
        where
208
            C: UnindexedConsumer<Self::Item>,
209
        {
210
            self.entries
211
                .into_par_iter()
212
                .map($map_elt)
213
                .drive_unindexed(consumer)
214
        }
215
216
        // NB: This allows indexed collection, e.g. directly into a `Vec`, but the
217
        // underlying iterator must really be indexed.  We should remove this if we
218
        // start having tombstones that must be filtered out.
219
        fn opt_len(&self) -> Option<usize> {
220
            Some(self.entries.len())
221
        }
222
    };
223
}
224
225
// generate `IndexedParallelIterator` methods by just forwarding to the underlying
226
// self.entries and mapping its elements.
227
#[cfg(feature = "rayon")]
228
macro_rules! indexed_parallel_iterator_methods {
229
    // $map_elt is the mapping function from the underlying iterator's element
230
    ($map_elt:expr) => {
231
        fn drive<C>(self, consumer: C) -> C::Result
232
        where
233
            C: Consumer<Self::Item>,
234
        {
235
            self.entries.into_par_iter().map($map_elt).drive(consumer)
236
        }
237
238
        fn len(&self) -> usize {
239
            self.entries.len()
240
        }
241
242
        fn with_producer<CB>(self, callback: CB) -> CB::Output
243
        where
244
            CB: ProducerCallback<Self::Item>,
245
        {
246
            self.entries
247
                .into_par_iter()
248
                .map($map_elt)
249
                .with_producer(callback)
250
        }
251
    };
252
}