wasmer_runtime_core_fl/structures/
map.rs

1use super::{BoxedMap, SliceMap, TypedIndex};
2use std::{
3    iter::{self, Extend, FromIterator},
4    marker::PhantomData,
5    mem,
6    ops::{Deref, DerefMut},
7    slice, vec,
8};
9
10/// Dense item map
11#[derive(Serialize, Deserialize, Debug, Clone)]
12pub struct Map<K, V>
13where
14    K: TypedIndex,
15{
16    elems: Vec<V>,
17    _marker: PhantomData<K>,
18}
19
20impl<K, V> Map<K, V>
21where
22    K: TypedIndex,
23{
24    /// Creates a new `Map`.
25    pub fn new() -> Self {
26        Self {
27            elems: Vec::new(),
28            _marker: PhantomData,
29        }
30    }
31
32    /// Creates a new empty `Map` with the given capacity.
33    pub fn with_capacity(capacity: usize) -> Self {
34        Self {
35            elems: Vec::with_capacity(capacity),
36            _marker: PhantomData,
37        }
38    }
39
40    /// Clears the map. Keeps the allocated memory for future use.
41    pub fn clear(&mut self) {
42        self.elems.clear();
43    }
44
45    /// Returns the size of this map.
46    pub fn len(&self) -> usize {
47        self.elems.len()
48    }
49
50    /// Returns true if this map is empty.
51    pub fn is_empty(&self) -> bool {
52        self.elems.is_empty()
53    }
54
55    /// Adds a new value to this map.
56    pub fn push(&mut self, value: V) -> K {
57        let len = self.len();
58        self.elems.push(value);
59        K::new(len)
60    }
61
62    /// Returns the next index into the map.
63    pub fn next_index(&self) -> K {
64        K::new(self.len())
65    }
66
67    /// Reserves the given size.
68    pub fn reserve_exact(&mut self, size: usize) {
69        self.elems.reserve_exact(size);
70    }
71
72    /// Convert this into a `BoxedMap`.
73    pub fn into_boxed_map(self) -> BoxedMap<K, V> {
74        BoxedMap::new(self.elems.into_boxed_slice())
75    }
76
77    /// Convert this into a `Vec`.
78    pub fn into_vec(self) -> Vec<V> {
79        self.elems
80    }
81
82    /// Iterate over the values of the map in order.
83    pub fn values(&self) -> impl Iterator<Item = &V> {
84        self.elems.iter()
85    }
86}
87
88impl<K, V> Map<K, V>
89where
90    K: TypedIndex,
91    V: Clone,
92{
93    /// Resize this map to the given new length and value.
94    pub fn resize(&mut self, new_len: usize, value: V) {
95        self.elems.resize(new_len, value);
96    }
97}
98
99impl<K, V> Extend<V> for Map<K, V>
100where
101    K: TypedIndex,
102{
103    fn extend<I: IntoIterator<Item = V>>(&mut self, iter: I) {
104        self.elems.extend(iter);
105    }
106}
107
108impl<K, V> FromIterator<V> for Map<K, V>
109where
110    K: TypedIndex,
111{
112    fn from_iter<I: IntoIterator<Item = V>>(iter: I) -> Self {
113        let elems: Vec<V> = iter.into_iter().collect();
114        Self {
115            elems,
116            _marker: PhantomData,
117        }
118    }
119}
120
121impl<K, V> Deref for Map<K, V>
122where
123    K: TypedIndex,
124{
125    type Target = SliceMap<K, V>;
126    fn deref(&self) -> &SliceMap<K, V> {
127        unsafe { mem::transmute::<&[V], _>(self.elems.as_slice()) }
128    }
129}
130
131impl<K, V> DerefMut for Map<K, V>
132where
133    K: TypedIndex,
134{
135    fn deref_mut(&mut self) -> &mut SliceMap<K, V> {
136        unsafe { mem::transmute::<&mut [V], _>(self.elems.as_mut_slice()) }
137    }
138}
139
140pub struct IntoIter<K, V>
141where
142    K: TypedIndex,
143{
144    enumerated: iter::Enumerate<vec::IntoIter<V>>,
145    _marker: PhantomData<K>,
146}
147
148impl<K, V> IntoIter<K, V>
149where
150    K: TypedIndex,
151{
152    pub(in crate::structures) fn new(into_iter: vec::IntoIter<V>) -> Self {
153        Self {
154            enumerated: into_iter.enumerate(),
155            _marker: PhantomData,
156        }
157    }
158}
159
160impl<K, V> Iterator for IntoIter<K, V>
161where
162    K: TypedIndex,
163{
164    type Item = (K, V);
165
166    fn next(&mut self) -> Option<(K, V)> {
167        self.enumerated.next().map(|(i, v)| (K::new(i), v))
168    }
169}
170
171impl<K, V> IntoIterator for Map<K, V>
172where
173    K: TypedIndex,
174{
175    type Item = (K, V);
176    type IntoIter = IntoIter<K, V>;
177
178    fn into_iter(self) -> Self::IntoIter {
179        IntoIter::new(self.elems.into_iter())
180    }
181}
182
183impl<'a, K, V> IntoIterator for &'a Map<K, V>
184where
185    K: TypedIndex,
186{
187    type Item = (K, &'a V);
188    type IntoIter = Iter<'a, K, V>;
189
190    fn into_iter(self) -> Self::IntoIter {
191        Iter::new(self.elems.iter())
192    }
193}
194
195impl<'a, K, V> IntoIterator for &'a mut Map<K, V>
196where
197    K: TypedIndex,
198{
199    type Item = (K, &'a mut V);
200    type IntoIter = IterMut<'a, K, V>;
201
202    fn into_iter(self) -> Self::IntoIter {
203        IterMut::new(self.elems.iter_mut())
204    }
205}
206
207/// Iterator for a `Map`.
208pub struct Iter<'a, K: TypedIndex, V: 'a> {
209    enumerated: iter::Enumerate<slice::Iter<'a, V>>,
210    _marker: PhantomData<K>,
211}
212
213impl<'a, K: TypedIndex, V: 'a> Iter<'a, K, V> {
214    pub(in crate::structures) fn new(iter: slice::Iter<'a, V>) -> Self {
215        Self {
216            enumerated: iter.enumerate(),
217            _marker: PhantomData,
218        }
219    }
220}
221
222impl<'a, K: TypedIndex, V: 'a> Iterator for Iter<'a, K, V> {
223    type Item = (K, &'a V);
224
225    fn next(&mut self) -> Option<Self::Item> {
226        self.enumerated.next().map(|(i, v)| (K::new(i), v))
227    }
228}
229
230/// Mutable iterator for a `Map`.
231pub struct IterMut<'a, K: TypedIndex, V: 'a> {
232    enumerated: iter::Enumerate<slice::IterMut<'a, V>>,
233    _marker: PhantomData<K>,
234}
235
236impl<'a, K: TypedIndex, V: 'a> IterMut<'a, K, V> {
237    pub(in crate::structures) fn new(iter: slice::IterMut<'a, V>) -> Self {
238        Self {
239            enumerated: iter.enumerate(),
240            _marker: PhantomData,
241        }
242    }
243}
244
245impl<'a, K: TypedIndex, V: 'a> Iterator for IterMut<'a, K, V> {
246    type Item = (K, &'a mut V);
247
248    fn next(&mut self) -> Option<Self::Item> {
249        self.enumerated.next().map(|(i, v)| (K::new(i), v))
250    }
251}