wasmer_types/entity/
keys.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.
5//!
6//! When `core::iter::Step` is stabilized, `Keys` could be implemented as a wrapper around
7//! `core::ops::Range`, but for now, we implement it manually.
8
9use crate::entity::EntityRef;
10use crate::lib::std::marker::PhantomData;
11
12/// Iterate over all keys in order.
13pub struct Keys<K: EntityRef> {
14    pos: usize,
15    rev_pos: usize,
16    unused: PhantomData<K>,
17}
18
19impl<K: EntityRef> Keys<K> {
20    /// Create a `Keys` iterator that visits `len` entities starting from 0.
21    pub fn with_len(len: usize) -> Self {
22        Self {
23            pos: 0,
24            rev_pos: len,
25            unused: PhantomData,
26        }
27    }
28}
29
30impl<K: EntityRef> Iterator for Keys<K> {
31    type Item = K;
32
33    fn next(&mut self) -> Option<Self::Item> {
34        if self.pos < self.rev_pos {
35            let k = K::new(self.pos);
36            self.pos += 1;
37            Some(k)
38        } else {
39            None
40        }
41    }
42
43    fn size_hint(&self) -> (usize, Option<usize>) {
44        let size = self.rev_pos - self.pos;
45        (size, Some(size))
46    }
47}
48
49impl<K: EntityRef> DoubleEndedIterator for Keys<K> {
50    fn next_back(&mut self) -> Option<Self::Item> {
51        if self.rev_pos > self.pos {
52            let k = K::new(self.rev_pos - 1);
53            self.rev_pos -= 1;
54            Some(k)
55        } else {
56            None
57        }
58    }
59}
60
61impl<K: EntityRef> ExactSizeIterator for Keys<K> {}