wasmer_types/entity/
iter.rs

1// This file contains code from external sources.
2// Attributions: https://github.com/wasmerio/wasmer/blob/main/docs/ATTRIBUTIONS.md
3
4//! A double-ended iterator over entity references and entities.
5
6use crate::entity::EntityRef;
7use crate::lib::std::iter::Enumerate;
8use crate::lib::std::marker::PhantomData;
9use crate::lib::std::slice;
10use crate::lib::std::vec;
11
12/// Iterate over all keys in order.
13pub struct Iter<'a, K: EntityRef, V>
14where
15    V: 'a,
16{
17    enumerate: Enumerate<slice::Iter<'a, V>>,
18    unused: PhantomData<K>,
19}
20
21impl<'a, K: EntityRef, V> Iter<'a, K, V> {
22    /// Create an `Iter` iterator that visits the `PrimaryMap` keys and values
23    /// of `iter`.
24    pub fn new(iter: slice::Iter<'a, V>) -> Self {
25        Self {
26            enumerate: iter.enumerate(),
27            unused: PhantomData,
28        }
29    }
30}
31
32impl<'a, K: EntityRef, V> Iterator for Iter<'a, K, V> {
33    type Item = (K, &'a V);
34
35    fn next(&mut self) -> Option<Self::Item> {
36        self.enumerate.next().map(|(i, v)| (K::new(i), v))
37    }
38
39    fn size_hint(&self) -> (usize, Option<usize>) {
40        self.enumerate.size_hint()
41    }
42}
43
44impl<'a, K: EntityRef, V> DoubleEndedIterator for Iter<'a, K, V> {
45    fn next_back(&mut self) -> Option<Self::Item> {
46        self.enumerate.next_back().map(|(i, v)| (K::new(i), v))
47    }
48}
49
50impl<'a, K: EntityRef, V> ExactSizeIterator for Iter<'a, K, V> {}
51
52/// Iterate over all keys in order.
53pub struct IterMut<'a, K: EntityRef, V>
54where
55    V: 'a,
56{
57    enumerate: Enumerate<slice::IterMut<'a, V>>,
58    unused: PhantomData<K>,
59}
60
61impl<'a, K: EntityRef, V> IterMut<'a, K, V> {
62    /// Create an `IterMut` iterator that visits the `PrimaryMap` keys and values
63    /// of `iter`.
64    pub fn new(iter: slice::IterMut<'a, V>) -> Self {
65        Self {
66            enumerate: iter.enumerate(),
67            unused: PhantomData,
68        }
69    }
70}
71
72impl<'a, K: EntityRef, V> Iterator for IterMut<'a, K, V> {
73    type Item = (K, &'a mut V);
74
75    fn next(&mut self) -> Option<Self::Item> {
76        self.enumerate.next().map(|(i, v)| (K::new(i), v))
77    }
78
79    fn size_hint(&self) -> (usize, Option<usize>) {
80        self.enumerate.size_hint()
81    }
82}
83
84impl<'a, K: EntityRef, V> DoubleEndedIterator for IterMut<'a, K, V> {
85    fn next_back(&mut self) -> Option<Self::Item> {
86        self.enumerate.next_back().map(|(i, v)| (K::new(i), v))
87    }
88}
89
90impl<'a, K: EntityRef, V> ExactSizeIterator for IterMut<'a, K, V> {}
91
92/// Iterate over all keys in order.
93pub struct IntoIter<K: EntityRef, V> {
94    enumerate: Enumerate<vec::IntoIter<V>>,
95    unused: PhantomData<K>,
96}
97
98impl<K: EntityRef, V> IntoIter<K, V> {
99    /// Create an `IntoIter` iterator that visits the `PrimaryMap` keys and values
100    /// of `iter`.
101    pub fn new(iter: vec::IntoIter<V>) -> Self {
102        Self {
103            enumerate: iter.enumerate(),
104            unused: PhantomData,
105        }
106    }
107}
108
109impl<K: EntityRef, V> Iterator for IntoIter<K, V> {
110    type Item = (K, V);
111
112    fn next(&mut self) -> Option<Self::Item> {
113        self.enumerate.next().map(|(i, v)| (K::new(i), v))
114    }
115
116    fn size_hint(&self) -> (usize, Option<usize>) {
117        self.enumerate.size_hint()
118    }
119}
120
121impl<K: EntityRef, V> DoubleEndedIterator for IntoIter<K, V> {
122    fn next_back(&mut self) -> Option<Self::Item> {
123        self.enumerate.next_back().map(|(i, v)| (K::new(i), v))
124    }
125}
126
127impl<K: EntityRef, V> ExactSizeIterator for IntoIter<K, V> {}