Coverage Report

Created: 2025-01-09 07:53

/src/wasm-tools/crates/wasmparser/src/collections/index_set.rs
Line
Count
Source (jump to first uncovered line)
1
//! Type definitions for an ordered set.
2
3
use crate::collections::IndexMap;
4
use core::{borrow::Borrow, hash::Hash, iter::FusedIterator, ops::Index};
5
6
/// A default set of values.
7
///
8
/// Provides an API compatible with both [`IndexSet`] and a custom implementation based on [`BTreeMap`].
9
///
10
/// [`IndexSet`]: indexmap::IndexSet
11
/// [`BTreeMap`]: alloc::collections::BTreeMap
12
#[derive(Debug, Clone)]
13
pub struct IndexSet<T> {
14
    inner: IndexMap<T, ()>,
15
}
16
17
impl<T> Default for IndexSet<T> {
18
    #[inline]
19
1.30M
    fn default() -> Self {
20
1.30M
        Self {
21
1.30M
            inner: IndexMap::default(),
22
1.30M
        }
23
1.30M
    }
<wasmparser::collections::index_set::IndexSet<alloc::string::String> as core::default::Default>::default
Line
Count
Source
19
433k
    fn default() -> Self {
20
433k
        Self {
21
433k
            inner: IndexMap::default(),
22
433k
        }
23
433k
    }
<wasmparser::collections::index_set::IndexSet<wasmparser::validator::component_types::ResourceId> as core::default::Default>::default
Line
Count
Source
19
126k
    fn default() -> Self {
20
126k
        Self {
21
126k
            inner: IndexMap::default(),
22
126k
        }
23
126k
    }
<wasmparser::collections::index_set::IndexSet<wasmparser::validator::names::KebabString> as core::default::Default>::default
Line
Count
Source
19
306k
    fn default() -> Self {
20
306k
        Self {
21
306k
            inner: IndexMap::default(),
22
306k
        }
23
306k
    }
<wasmparser::collections::index_set::IndexSet<wasmparser::validator::names::ComponentName> as core::default::Default>::default
Line
Count
Source
19
433k
    fn default() -> Self {
20
433k
        Self {
21
433k
            inner: IndexMap::default(),
22
433k
        }
23
433k
    }
24
}
25
26
impl<T> IndexSet<T> {
27
    /// Clears the [`IndexSet`], removing all elements.
28
    #[inline]
29
126k
    pub fn clear(&mut self) {
30
126k
        self.inner.clear()
31
126k
    }
32
33
    /// Returns the number of elements in the [`IndexSet`].
34
    #[inline]
35
57.1k
    pub fn len(&self) -> usize {
36
57.1k
        self.inner.len()
37
57.1k
    }
<wasmparser::collections::index_set::IndexSet<alloc::string::String>>::len
Line
Count
Source
35
46.8k
    pub fn len(&self) -> usize {
36
46.8k
        self.inner.len()
37
46.8k
    }
<wasmparser::collections::index_set::IndexSet<wasmparser::validator::names::KebabString>>::len
Line
Count
Source
35
10.3k
    pub fn len(&self) -> usize {
36
10.3k
        self.inner.len()
37
10.3k
    }
38
39
    /// Returns `true` if the [`IndexSet`] contains no elements.
40
    #[inline]
41
0
    pub fn is_empty(&self) -> bool {
42
0
        self.inner.is_empty()
43
0
    }
44
45
    /// Returns an iterator that yields the items in the [`IndexSet`].
46
    #[inline]
47
277k
    pub fn iter(&self) -> Iter<'_, T> {
48
277k
        Iter {
49
277k
            inner: self.inner.iter(),
50
277k
        }
51
277k
    }
<wasmparser::collections::index_set::IndexSet<wasmparser::validator::component_types::ResourceId>>::iter
Line
Count
Source
47
19.3k
    pub fn iter(&self) -> Iter<'_, T> {
48
19.3k
        Iter {
49
19.3k
            inner: self.inner.iter(),
50
19.3k
        }
51
19.3k
    }
<wasmparser::collections::index_set::IndexSet<wasmparser::validator::component_types::AliasableResourceId>>::iter
Line
Count
Source
47
6.54k
    pub fn iter(&self) -> Iter<'_, T> {
48
6.54k
        Iter {
49
6.54k
            inner: self.inner.iter(),
50
6.54k
        }
51
6.54k
    }
<wasmparser::collections::index_set::IndexSet<wasmparser::validator::names::KebabString>>::iter
Line
Count
Source
47
251k
    pub fn iter(&self) -> Iter<'_, T> {
48
251k
        Iter {
49
251k
            inner: self.inner.iter(),
50
251k
        }
51
251k
    }
52
}
53
54
impl<T> IndexSet<T>
55
where
56
    T: Eq + Hash + Ord + Clone,
57
{
58
    /// Reserves capacity for at least `additional` more elements to be inserted in the [`IndexSet`].
59
    #[inline]
60
306k
    pub fn reserve(&mut self, additional: usize) {
61
306k
        self.inner.reserve(additional);
62
306k
    }
63
64
    /// Returns true if the [`IndexSet`] contains an element equal to the `value`.
65
    #[inline]
66
95.6k
    pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool
67
95.6k
    where
68
95.6k
        T: Borrow<Q>,
69
95.6k
        Q: Hash + Eq + Ord,
70
95.6k
    {
71
95.6k
        self.inner.contains_key(value)
72
95.6k
    }
<wasmparser::collections::index_set::IndexSet<alloc::string::String>>::contains::<str>
Line
Count
Source
66
60.6k
    pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool
67
60.6k
    where
68
60.6k
        T: Borrow<Q>,
69
60.6k
        Q: Hash + Eq + Ord,
70
60.6k
    {
71
60.6k
        self.inner.contains_key(value)
72
60.6k
    }
<wasmparser::collections::index_set::IndexSet<wasmparser::validator::component_types::ResourceId>>::contains::<wasmparser::validator::component_types::ResourceId>
Line
Count
Source
66
35.0k
    pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool
67
35.0k
    where
68
35.0k
        T: Borrow<Q>,
69
35.0k
        Q: Hash + Eq + Ord,
70
35.0k
    {
71
35.0k
        self.inner.contains_key(value)
72
35.0k
    }
73
74
    /// Returns a reference to the element in the [`IndexSet`], if any, that is equal to the `value`.
75
    #[inline]
76
0
    pub fn get<Q: ?Sized>(&self, value: &Q) -> Option<&T>
77
0
    where
78
0
        T: Borrow<Q>,
79
0
        Q: Hash + Eq + Ord,
80
0
    {
81
0
        self.inner.get_key_value(value).map(|(x, &())| x)
82
0
    }
83
84
    /// Return the index of the item provided, if it exists.
85
0
    pub fn get_index_of<Q>(&self, value: &Q) -> Option<usize>
86
0
    where
87
0
        T: Borrow<Q>,
88
0
        Q: Hash + Eq + Ord + ?Sized,
89
0
    {
90
0
        let (index, _, _) = self.inner.get_full(value)?;
91
0
        Some(index)
92
0
    }
93
94
    /// Adds `value` to the [`IndexSet`].
95
    ///
96
    /// Returns whether the value was newly inserted:
97
    ///
98
    /// - Returns `true` if the set did not previously contain an equal value.
99
    /// - Returns `false` otherwise and the entry is not updated.
100
    #[inline]
101
1.44M
    pub fn insert(&mut self, value: T) -> bool {
102
1.44M
        self.inner.insert(value, ()).is_none()
103
1.44M
    }
<wasmparser::collections::index_set::IndexSet<alloc::string::String>>::insert
Line
Count
Source
101
46.8k
    pub fn insert(&mut self, value: T) -> bool {
102
46.8k
        self.inner.insert(value, ()).is_none()
103
46.8k
    }
<wasmparser::collections::index_set::IndexSet<wasmparser::validator::component_types::ResourceId>>::insert
Line
Count
Source
101
301k
    pub fn insert(&mut self, value: T) -> bool {
102
301k
        self.inner.insert(value, ()).is_none()
103
301k
    }
<wasmparser::collections::index_set::IndexSet<wasmparser::validator::names::KebabString>>::insert
Line
Count
Source
101
1.09M
    pub fn insert(&mut self, value: T) -> bool {
102
1.09M
        self.inner.insert(value, ()).is_none()
103
1.09M
    }
104
105
    /// Remove the value from the [`IndexSet`], and return `true` if it was present.
106
    ///
107
    /// Like [`Vec::swap_remove`], the value is removed by swapping it with the
108
    /// last element of the set and popping it off. **This perturbs
109
    /// the position of what used to be the last element!**
110
    ///
111
    /// Return `false` if `value` was not in the set.
112
    ///
113
    /// Computes in **O(1)** time (average).
114
    ///
115
    /// [`Vec::swap_remove`]: alloc::vec::Vec::swap_remove
116
    #[inline]
117
40.2k
    pub fn swap_remove<Q: ?Sized>(&mut self, value: &Q) -> bool
118
40.2k
    where
119
40.2k
        T: Borrow<Q>,
120
40.2k
        Q: Hash + Eq + Ord,
121
40.2k
    {
122
40.2k
        self.inner.swap_remove(value).is_some()
123
40.2k
    }
124
125
    /// Adds a value to the [`IndexSet`], replacing the existing value, if any, that is equal to the given
126
    /// one. Returns the replaced value.
127
925k
    pub fn replace(&mut self, value: T) -> Option<T> {
128
925k
        let removed = self.inner.swap_remove_entry(&value);
129
925k
        self.inner.insert(value, ());
130
925k
        removed.map(|(key, _value)| key)
131
925k
    }
132
133
    /// Returns `true` if `self` has no elements in common with `other`.
134
    /// This is equivalent to checking for an empty intersection.
135
0
    pub fn is_disjoint(&self, other: &Self) -> bool {
136
0
        if self.len() <= other.len() {
137
0
            self.iter().all(move |value| !other.contains(value))
138
        } else {
139
0
            other.iter().all(move |value| !self.contains(value))
140
        }
141
0
    }
142
143
    /// Returns `true` if the [`IndexSet`] is a subset of another,
144
    /// i.e., `other` contains at least all the values in `self`.
145
0
    pub fn is_subset(&self, other: &Self) -> bool {
146
0
        self.len() <= other.len() && self.iter().all(move |value| other.contains(value))
147
0
    }
148
149
    /// Returns `true` if the [`IndexSet`] is a superset of another,
150
    /// i.e., `self` contains at least all the values in `other`.
151
    #[inline]
152
0
    pub fn is_superset(&self, other: &Self) -> bool {
153
0
        other.is_subset(self)
154
0
    }
155
}
156
157
impl<T> Index<usize> for IndexSet<T>
158
where
159
    T: Hash + Eq + Ord,
160
{
161
    type Output = T;
162
163
    #[inline]
164
68.0k
    fn index(&self, index: usize) -> &T {
165
68.0k
        let Some((value, _)) = self.inner.get_index(index) else {
166
0
            panic!("out of bounds index: {index}");
167
        };
168
68.0k
        value
169
68.0k
    }
170
}
171
172
impl<T> FromIterator<T> for IndexSet<T>
173
where
174
    T: Hash + Eq + Ord + Clone,
175
{
176
25.8k
    fn from_iter<I>(iter: I) -> Self
177
25.8k
    where
178
25.8k
        I: IntoIterator<Item = T>,
179
25.8k
    {
180
25.8k
        Self {
181
25.8k
            inner: <IndexMap<T, ()>>::from_iter(iter.into_iter().map(|value| (value, ()))),
Unexecuted instantiation: <wasmparser::collections::index_set::IndexSet<wasmparser::validator::component_types::ResourceId> as core::iter::traits::collect::FromIterator<wasmparser::validator::component_types::ResourceId>>::from_iter::<core::iter::adapters::map::Map<core::ops::range::Range<usize>, <wasmparser::validator::component::ComponentState>::instantiate_component::{closure#0}>>::{closure#0}
<wasmparser::collections::index_set::IndexSet<wasmparser::validator::component_types::AliasableResourceId> as core::iter::traits::collect::FromIterator<wasmparser::validator::component_types::AliasableResourceId>>::from_iter::<core::iter::adapters::map::Map<core::ops::range::Range<usize>, <wasmparser::validator::component::ComponentState>::prepare_instance_import::{closure#0}>>::{closure#0}
Line
Count
Source
181
8.31k
            inner: <IndexMap<T, ()>>::from_iter(iter.into_iter().map(|value| (value, ()))),
182
25.8k
        }
183
25.8k
    }
<wasmparser::collections::index_set::IndexSet<wasmparser::validator::component_types::ResourceId> as core::iter::traits::collect::FromIterator<wasmparser::validator::component_types::ResourceId>>::from_iter::<core::iter::adapters::map::Map<core::ops::range::Range<usize>, <wasmparser::validator::component::ComponentState>::instantiate_component::{closure#0}>>
Line
Count
Source
176
19.3k
    fn from_iter<I>(iter: I) -> Self
177
19.3k
    where
178
19.3k
        I: IntoIterator<Item = T>,
179
19.3k
    {
180
19.3k
        Self {
181
19.3k
            inner: <IndexMap<T, ()>>::from_iter(iter.into_iter().map(|value| (value, ()))),
182
19.3k
        }
183
19.3k
    }
<wasmparser::collections::index_set::IndexSet<wasmparser::validator::component_types::AliasableResourceId> as core::iter::traits::collect::FromIterator<wasmparser::validator::component_types::AliasableResourceId>>::from_iter::<core::iter::adapters::map::Map<core::ops::range::Range<usize>, <wasmparser::validator::component::ComponentState>::prepare_instance_import::{closure#0}>>
Line
Count
Source
176
6.54k
    fn from_iter<I>(iter: I) -> Self
177
6.54k
    where
178
6.54k
        I: IntoIterator<Item = T>,
179
6.54k
    {
180
6.54k
        Self {
181
6.54k
            inner: <IndexMap<T, ()>>::from_iter(iter.into_iter().map(|value| (value, ()))),
182
6.54k
        }
183
6.54k
    }
184
}
185
186
impl<'a, T> IntoIterator for &'a IndexSet<T> {
187
    type Item = &'a T;
188
    type IntoIter = Iter<'a, T>;
189
190
    #[inline]
191
25.8k
    fn into_iter(self) -> Self::IntoIter {
192
25.8k
        self.iter()
193
25.8k
    }
<&wasmparser::collections::index_set::IndexSet<wasmparser::validator::component_types::ResourceId> as core::iter::traits::collect::IntoIterator>::into_iter
Line
Count
Source
191
19.3k
    fn into_iter(self) -> Self::IntoIter {
192
19.3k
        self.iter()
193
19.3k
    }
<&wasmparser::collections::index_set::IndexSet<wasmparser::validator::component_types::AliasableResourceId> as core::iter::traits::collect::IntoIterator>::into_iter
Line
Count
Source
191
6.54k
    fn into_iter(self) -> Self::IntoIter {
192
6.54k
        self.iter()
193
6.54k
    }
194
}
195
196
impl<T> Extend<T> for IndexSet<T>
197
where
198
    T: Hash + Eq + Ord + Clone,
199
{
200
0
    fn extend<Iter: IntoIterator<Item = T>>(&mut self, iter: Iter) {
201
0
        self.inner.extend(iter.into_iter().map(|value| (value, ())))
202
0
    }
203
}
204
205
/// An iterator over the items of a [`IndexSet`].
206
#[derive(Debug, Clone)]
207
pub struct Iter<'a, T> {
208
    inner: <&'a IndexMap<T, ()> as IntoIterator>::IntoIter,
209
}
210
211
impl<'a, T> Iterator for Iter<'a, T> {
212
    type Item = &'a T;
213
214
    #[inline]
215
241k
    fn size_hint(&self) -> (usize, Option<usize>) {
216
241k
        self.inner.size_hint()
217
241k
    }
<wasmparser::collections::index_set::Iter<wasmparser::validator::names::KebabString> as core::iter::traits::iterator::Iterator>::size_hint
Line
Count
Source
215
241k
    fn size_hint(&self) -> (usize, Option<usize>) {
216
241k
        self.inner.size_hint()
217
241k
    }
Unexecuted instantiation: <wasmparser::collections::index_set::Iter<_> as core::iter::traits::iterator::Iterator>::size_hint
218
219
    #[inline]
220
1.13M
    fn next(&mut self) -> Option<Self::Item> {
221
1.13M
        self.inner.next().map(|(key, _value)| key)
Unexecuted instantiation: <wasmparser::collections::index_set::Iter<wasmparser::validator::component_types::ResourceId> as core::iter::traits::iterator::Iterator>::next::{closure#0}
<wasmparser::collections::index_set::Iter<wasmparser::validator::component_types::AliasableResourceId> as core::iter::traits::iterator::Iterator>::next::{closure#0}
Line
Count
Source
221
8.31k
        self.inner.next().map(|(key, _value)| key)
<wasmparser::collections::index_set::Iter<wasmparser::validator::names::KebabString> as core::iter::traits::iterator::Iterator>::next::{closure#0}
Line
Count
Source
221
878k
        self.inner.next().map(|(key, _value)| key)
222
1.13M
    }
Unexecuted instantiation: <wasmparser::collections::index_set::Iter<wasmparser::validator::component_types::ResourceId> as core::iter::traits::iterator::Iterator>::next
<wasmparser::collections::index_set::Iter<wasmparser::validator::component_types::AliasableResourceId> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
220
8.31k
    fn next(&mut self) -> Option<Self::Item> {
221
8.31k
        self.inner.next().map(|(key, _value)| key)
222
8.31k
    }
<wasmparser::collections::index_set::Iter<wasmparser::validator::names::KebabString> as core::iter::traits::iterator::Iterator>::next
Line
Count
Source
220
1.13M
    fn next(&mut self) -> Option<Self::Item> {
221
1.13M
        self.inner.next().map(|(key, _value)| key)
222
1.13M
    }
223
}
224
225
impl<'a, T> ExactSizeIterator for Iter<'a, T> {
226
    #[inline]
227
0
    fn len(&self) -> usize {
228
0
        self.inner.len()
229
0
    }
230
}
231
232
impl<'a, T> FusedIterator for Iter<'a, T> {}
233
234
impl<T> IntoIterator for IndexSet<T> {
235
    type Item = T;
236
    type IntoIter = IntoIter<T>;
237
238
    #[inline]
239
19.3k
    fn into_iter(self) -> Self::IntoIter {
240
19.3k
        IntoIter {
241
19.3k
            inner: self.inner.into_iter(),
242
19.3k
        }
243
19.3k
    }
244
}
245
246
/// An iterator over the owned items of an [`IndexSet`].
247
#[derive(Debug)]
248
pub struct IntoIter<T> {
249
    inner: <IndexMap<T, ()> as IntoIterator>::IntoIter,
250
}
251
252
impl<T> Iterator for IntoIter<T> {
253
    type Item = T;
254
255
    #[inline]
256
0
    fn size_hint(&self) -> (usize, Option<usize>) {
257
0
        self.inner.size_hint()
258
0
    }
259
260
    #[inline]
261
19.3k
    fn next(&mut self) -> Option<Self::Item> {
262
19.3k
        self.inner.next().map(|(key, _value)| key)
263
19.3k
    }
264
}
265
266
impl<T> ExactSizeIterator for IntoIter<T> {
267
    #[inline]
268
0
    fn len(&self) -> usize {
269
0
        self.inner.len()
270
0
    }
271
}
272
273
impl<T> FusedIterator for IntoIter<T> {}
274
275
#[cfg(feature = "serde")]
276
impl<T> serde::Serialize for IndexSet<T>
277
where
278
    T: serde::Serialize + Eq + Hash + Ord,
279
{
280
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
281
    where
282
        S: serde::ser::Serializer,
283
    {
284
        serde::Serialize::serialize(&self.inner, serializer)
285
    }
286
}
287
288
#[cfg(feature = "serde")]
289
impl<'a, T> serde::Deserialize<'a> for IndexSet<T>
290
where
291
    T: serde::Deserialize<'a> + Eq + Hash + Ord + Clone,
292
{
293
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
294
    where
295
        D: serde::de::Deserializer<'a>,
296
    {
297
        Ok(IndexSet {
298
            inner: serde::Deserialize::deserialize(deserializer)?,
299
        })
300
    }
301
}
302
303
impl<T> PartialEq for IndexSet<T>
304
where
305
    T: PartialEq + Hash + Ord,
306
{
307
0
    fn eq(&self, other: &Self) -> bool {
308
0
        self.inner == other.inner
309
0
    }
310
311
0
    fn ne(&self, other: &Self) -> bool {
312
0
        self.inner != other.inner
313
0
    }
314
}
315
316
impl<T> Eq for IndexSet<T> where T: Eq + Hash + Ord {}