wasmer_runtime_core_fl/structures/
map.rs1use 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#[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 pub fn new() -> Self {
26 Self {
27 elems: Vec::new(),
28 _marker: PhantomData,
29 }
30 }
31
32 pub fn with_capacity(capacity: usize) -> Self {
34 Self {
35 elems: Vec::with_capacity(capacity),
36 _marker: PhantomData,
37 }
38 }
39
40 pub fn clear(&mut self) {
42 self.elems.clear();
43 }
44
45 pub fn len(&self) -> usize {
47 self.elems.len()
48 }
49
50 pub fn is_empty(&self) -> bool {
52 self.elems.is_empty()
53 }
54
55 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 pub fn next_index(&self) -> K {
64 K::new(self.len())
65 }
66
67 pub fn reserve_exact(&mut self, size: usize) {
69 self.elems.reserve_exact(size);
70 }
71
72 pub fn into_boxed_map(self) -> BoxedMap<K, V> {
74 BoxedMap::new(self.elems.into_boxed_slice())
75 }
76
77 pub fn into_vec(self) -> Vec<V> {
79 self.elems
80 }
81
82 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 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
207pub 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
230pub 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}