/rust/registry/src/index.crates.io-6f17d22bba15001f/cranelift-entity-0.91.1/src/keys.rs
Line | Count | Source |
1 | | //! A double-ended iterator over entity references. |
2 | | //! |
3 | | //! When `core::iter::Step` is stabilized, `Keys` could be implemented as a wrapper around |
4 | | //! `core::ops::Range`, but for now, we implement it manually. |
5 | | |
6 | | use crate::EntityRef; |
7 | | use core::marker::PhantomData; |
8 | | |
9 | | /// Iterate over all keys in order. |
10 | | pub struct Keys<K: EntityRef> { |
11 | | pos: usize, |
12 | | rev_pos: usize, |
13 | | unused: PhantomData<K>, |
14 | | } |
15 | | |
16 | | impl<K: EntityRef> Keys<K> { |
17 | | /// Create a `Keys` iterator that visits `len` entities starting from 0. |
18 | 2.09M | pub fn with_len(len: usize) -> Self { |
19 | 2.09M | Self { |
20 | 2.09M | pos: 0, |
21 | 2.09M | rev_pos: len, |
22 | 2.09M | unused: PhantomData, |
23 | 2.09M | } |
24 | 2.09M | } Unexecuted instantiation: <cranelift_entity::keys::Keys<cranelift_codegen::ir::entities::Block>>::with_len <cranelift_entity::keys::Keys<cranelift_codegen::machinst::vcode::VCodeConstant>>::with_len Line | Count | Source | 18 | 139k | pub fn with_len(len: usize) -> Self { | 19 | 139k | Self { | 20 | 139k | pos: 0, | 21 | 139k | rev_pos: len, | 22 | 139k | unused: PhantomData, | 23 | 139k | } | 24 | 139k | } |
<cranelift_entity::keys::Keys<cranelift_codegen::ir::entities::SigRef>>::with_len Line | Count | Source | 18 | 139k | pub fn with_len(len: usize) -> Self { | 19 | 139k | Self { | 20 | 139k | pos: 0, | 21 | 139k | rev_pos: len, | 22 | 139k | unused: PhantomData, | 23 | 139k | } | 24 | 139k | } |
<cranelift_entity::keys::Keys<cranelift_codegen::loop_analysis::Loop>>::with_len Line | Count | Source | 18 | 418k | pub fn with_len(len: usize) -> Self { | 19 | 418k | Self { | 20 | 418k | pos: 0, | 21 | 418k | rev_pos: len, | 22 | 418k | unused: PhantomData, | 23 | 418k | } | 24 | 418k | } |
<cranelift_entity::keys::Keys<cranelift_codegen::ir::entities::GlobalValue>>::with_len Line | Count | Source | 18 | 1.39M | pub fn with_len(len: usize) -> Self { | 19 | 1.39M | Self { | 20 | 1.39M | pos: 0, | 21 | 1.39M | rev_pos: len, | 22 | 1.39M | unused: PhantomData, | 23 | 1.39M | } | 24 | 1.39M | } |
|
25 | | } |
26 | | |
27 | | impl<K: EntityRef> Iterator for Keys<K> { |
28 | | type Item = K; |
29 | | |
30 | 2.29M | fn next(&mut self) -> Option<Self::Item> { |
31 | 2.29M | if self.pos < self.rev_pos { |
32 | 339k | let k = K::new(self.pos); |
33 | 339k | self.pos += 1; |
34 | 339k | Some(k) |
35 | | } else { |
36 | 1.95M | None |
37 | | } |
38 | 2.29M | } Unexecuted instantiation: <cranelift_entity::keys::Keys<cranelift_codegen::ir::entities::Block> as core::iter::traits::iterator::Iterator>::next <cranelift_entity::keys::Keys<cranelift_codegen::loop_analysis::Loop> as core::iter::traits::iterator::Iterator>::next Line | Count | Source | 30 | 283k | fn next(&mut self) -> Option<Self::Item> { | 31 | 283k | if self.pos < self.rev_pos { | 32 | 4.39k | let k = K::new(self.pos); | 33 | 4.39k | self.pos += 1; | 34 | 4.39k | Some(k) | 35 | | } else { | 36 | 278k | None | 37 | | } | 38 | 283k | } |
<cranelift_entity::keys::Keys<cranelift_codegen::ir::entities::GlobalValue> as core::iter::traits::iterator::Iterator>::next Line | Count | Source | 30 | 1.63M | fn next(&mut self) -> Option<Self::Item> { | 31 | 1.63M | if self.pos < self.rev_pos { | 32 | 237k | let k = K::new(self.pos); | 33 | 237k | self.pos += 1; | 34 | 237k | Some(k) | 35 | | } else { | 36 | 1.39M | None | 37 | | } | 38 | 1.63M | } |
<cranelift_entity::keys::Keys<cranelift_codegen::ir::entities::SigRef> as core::iter::traits::iterator::Iterator>::next Line | Count | Source | 30 | 199k | fn next(&mut self) -> Option<Self::Item> { | 31 | 199k | if self.pos < self.rev_pos { | 32 | 59.9k | let k = K::new(self.pos); | 33 | 59.9k | self.pos += 1; | 34 | 59.9k | Some(k) | 35 | | } else { | 36 | 139k | None | 37 | | } | 38 | 199k | } |
<cranelift_entity::keys::Keys<cranelift_codegen::machinst::vcode::VCodeConstant> as core::iter::traits::iterator::Iterator>::next Line | Count | Source | 30 | 176k | fn next(&mut self) -> Option<Self::Item> { | 31 | 176k | if self.pos < self.rev_pos { | 32 | 37.2k | let k = K::new(self.pos); | 33 | 37.2k | self.pos += 1; | 34 | 37.2k | Some(k) | 35 | | } else { | 36 | 139k | None | 37 | | } | 38 | 176k | } |
|
39 | | |
40 | | fn size_hint(&self) -> (usize, Option<usize>) { |
41 | | let size = self.rev_pos - self.pos; |
42 | | (size, Some(size)) |
43 | | } |
44 | | } |
45 | | |
46 | | impl<K: EntityRef> DoubleEndedIterator for Keys<K> { |
47 | 141k | fn next_back(&mut self) -> Option<Self::Item> { |
48 | 141k | if self.rev_pos > self.pos { |
49 | 2.19k | let k = K::new(self.rev_pos - 1); |
50 | 2.19k | self.rev_pos -= 1; |
51 | 2.19k | Some(k) |
52 | | } else { |
53 | 139k | None |
54 | | } |
55 | 141k | } |
56 | | } |
57 | | |
58 | | impl<K: EntityRef> ExactSizeIterator for Keys<K> {} |