wasmer_types/entity/
boxed_slice.rs

1// This file contains code from external sources.
2// Attributions: https://github.com/wasmerio/wasmer/blob/master/ATTRIBUTIONS.md
3
4//! Boxed slices for `PrimaryMap`.
5
6use crate::entity::iter::{Iter, IterMut};
7use crate::entity::keys::Keys;
8use crate::entity::EntityRef;
9use crate::lib::std::boxed::Box;
10use crate::lib::std::marker::PhantomData;
11use crate::lib::std::ops::{Index, IndexMut};
12use crate::lib::std::slice;
13
14/// A slice mapping `K -> V` allocating dense entity references.
15///
16/// The `BoxedSlice` data structure uses the dense index space to implement a map with a boxed
17/// slice.
18#[derive(Debug, Clone)]
19pub struct BoxedSlice<K, V>
20where
21    K: EntityRef,
22{
23    elems: Box<[V]>,
24    unused: PhantomData<K>,
25}
26
27impl<K, V> BoxedSlice<K, V>
28where
29    K: EntityRef,
30{
31    /// Create a new slice from a raw pointer. A safer way to create slices is
32    /// to use `PrimaryMap::into_boxed_slice()`.
33    ///
34    /// # Safety
35    ///
36    /// This relies on `raw` pointing to a valid slice of `V`s.
37    pub unsafe fn from_raw(raw: *mut [V]) -> Self {
38        Self {
39            elems: Box::from_raw(raw),
40            unused: PhantomData,
41        }
42    }
43
44    /// Check if `k` is a valid key in the map.
45    pub fn is_valid(&self, k: K) -> bool {
46        k.index() < self.elems.len()
47    }
48
49    /// Get the element at `k` if it exists.
50    pub fn get(&self, k: K) -> Option<&V> {
51        self.elems.get(k.index())
52    }
53
54    /// Get the element at `k` if it exists, mutable version.
55    pub fn get_mut(&mut self, k: K) -> Option<&mut V> {
56        self.elems.get_mut(k.index())
57    }
58
59    /// Is this map completely empty?
60    pub fn is_empty(&self) -> bool {
61        self.elems.is_empty()
62    }
63
64    /// Get the total number of entity references created.
65    pub fn len(&self) -> usize {
66        self.elems.len()
67    }
68
69    /// Iterate over all the keys in this map.
70    pub fn keys(&self) -> Keys<K> {
71        Keys::with_len(self.elems.len())
72    }
73
74    /// Iterate over all the values in this map.
75    pub fn values(&self) -> slice::Iter<V> {
76        self.elems.iter()
77    }
78
79    /// Iterate over all the values in this map, mutable edition.
80    pub fn values_mut(&mut self) -> slice::IterMut<V> {
81        self.elems.iter_mut()
82    }
83
84    /// Iterate over all the keys and values in this map.
85    pub fn iter(&self) -> Iter<K, V> {
86        Iter::new(self.elems.iter())
87    }
88
89    /// Iterate over all the keys and values in this map, mutable edition.
90    pub fn iter_mut(&mut self) -> IterMut<K, V> {
91        IterMut::new(self.elems.iter_mut())
92    }
93
94    /// Returns the last element that was inserted in the map.
95    pub fn last(&self) -> Option<&V> {
96        self.elems.last()
97    }
98}
99
100/// Immutable indexing into a `BoxedSlice`.
101/// The indexed value must be in the map.
102impl<K, V> Index<K> for BoxedSlice<K, V>
103where
104    K: EntityRef,
105{
106    type Output = V;
107
108    fn index(&self, k: K) -> &V {
109        &self.elems[k.index()]
110    }
111}
112
113/// Mutable indexing into a `BoxedSlice`.
114impl<K, V> IndexMut<K> for BoxedSlice<K, V>
115where
116    K: EntityRef,
117{
118    fn index_mut(&mut self, k: K) -> &mut V {
119        &mut self.elems[k.index()]
120    }
121}
122
123impl<'a, K, V> IntoIterator for &'a BoxedSlice<K, V>
124where
125    K: EntityRef,
126{
127    type Item = (K, &'a V);
128    type IntoIter = Iter<'a, K, V>;
129
130    fn into_iter(self) -> Self::IntoIter {
131        Iter::new(self.elems.iter())
132    }
133}
134
135impl<'a, K, V> IntoIterator for &'a mut BoxedSlice<K, V>
136where
137    K: EntityRef,
138{
139    type Item = (K, &'a mut V);
140    type IntoIter = IterMut<'a, K, V>;
141
142    fn into_iter(self) -> Self::IntoIter {
143        IterMut::new(self.elems.iter_mut())
144    }
145}
146
147#[cfg(test)]
148mod tests {
149    use super::*;
150    use crate::entity::PrimaryMap;
151    use crate::lib::std::vec::Vec;
152
153    // `EntityRef` impl for testing.
154    #[derive(Clone, Copy, Debug, PartialEq, Eq)]
155    struct E(u32);
156
157    impl EntityRef for E {
158        fn new(i: usize) -> Self {
159            E(i as u32)
160        }
161        fn index(self) -> usize {
162            self.0 as usize
163        }
164    }
165
166    #[test]
167    fn basic() {
168        let r0 = E(0);
169        let r1 = E(1);
170        let p = PrimaryMap::<E, isize>::new();
171        let m = p.into_boxed_slice();
172
173        let v: Vec<E> = m.keys().collect();
174        assert_eq!(v, []);
175
176        assert!(!m.is_valid(r0));
177        assert!(!m.is_valid(r1));
178    }
179
180    #[test]
181    fn iter() {
182        let mut p: PrimaryMap<E, usize> = PrimaryMap::new();
183        p.push(12);
184        p.push(33);
185        let mut m = p.into_boxed_slice();
186
187        let mut i = 0;
188        for (key, value) in &m {
189            assert_eq!(key.index(), i);
190            match i {
191                0 => assert_eq!(*value, 12),
192                1 => assert_eq!(*value, 33),
193                _ => panic!(),
194            }
195            i += 1;
196        }
197        i = 0;
198        for (key_mut, value_mut) in m.iter_mut() {
199            assert_eq!(key_mut.index(), i);
200            match i {
201                0 => assert_eq!(*value_mut, 12),
202                1 => assert_eq!(*value_mut, 33),
203                _ => panic!(),
204            }
205            i += 1;
206        }
207    }
208
209    #[test]
210    fn iter_rev() {
211        let mut p: PrimaryMap<E, usize> = PrimaryMap::new();
212        p.push(12);
213        p.push(33);
214        let mut m = p.into_boxed_slice();
215
216        let mut i = 2;
217        for (key, value) in m.iter().rev() {
218            i -= 1;
219            assert_eq!(key.index(), i);
220            match i {
221                0 => assert_eq!(*value, 12),
222                1 => assert_eq!(*value, 33),
223                _ => panic!(),
224            }
225        }
226
227        i = 2;
228        for (key, value) in m.iter_mut().rev() {
229            i -= 1;
230            assert_eq!(key.index(), i);
231            match i {
232                0 => assert_eq!(*value, 12),
233                1 => assert_eq!(*value, 33),
234                _ => panic!(),
235            }
236        }
237    }
238    #[test]
239    fn keys() {
240        let mut p: PrimaryMap<E, usize> = PrimaryMap::new();
241        p.push(12);
242        p.push(33);
243        let m = p.into_boxed_slice();
244
245        let mut i = 0;
246        for key in m.keys() {
247            assert_eq!(key.index(), i);
248            i += 1;
249        }
250    }
251
252    #[test]
253    fn keys_rev() {
254        let mut p: PrimaryMap<E, usize> = PrimaryMap::new();
255        p.push(12);
256        p.push(33);
257        let m = p.into_boxed_slice();
258
259        let mut i = 2;
260        for key in m.keys().rev() {
261            i -= 1;
262            assert_eq!(key.index(), i);
263        }
264    }
265
266    #[test]
267    fn values() {
268        let mut p: PrimaryMap<E, usize> = PrimaryMap::new();
269        p.push(12);
270        p.push(33);
271        let mut m = p.into_boxed_slice();
272
273        let mut i = 0;
274        for value in m.values() {
275            match i {
276                0 => assert_eq!(*value, 12),
277                1 => assert_eq!(*value, 33),
278                _ => panic!(),
279            }
280            i += 1;
281        }
282        i = 0;
283        for value_mut in m.values_mut() {
284            match i {
285                0 => assert_eq!(*value_mut, 12),
286                1 => assert_eq!(*value_mut, 33),
287                _ => panic!(),
288            }
289            i += 1;
290        }
291    }
292
293    #[test]
294    fn values_rev() {
295        let mut p: PrimaryMap<E, usize> = PrimaryMap::new();
296        p.push(12);
297        p.push(33);
298        let mut m = p.into_boxed_slice();
299
300        let mut i = 2;
301        for value in m.values().rev() {
302            i -= 1;
303            match i {
304                0 => assert_eq!(*value, 12),
305                1 => assert_eq!(*value, 33),
306                _ => panic!(),
307            }
308        }
309        i = 2;
310        for value_mut in m.values_mut().rev() {
311            i -= 1;
312            match i {
313                0 => assert_eq!(*value_mut, 12),
314                1 => assert_eq!(*value_mut, 33),
315                _ => panic!(),
316            }
317        }
318    }
319}