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