Coverage Report

Created: 2024-10-16 07:58

/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> {}