1use crate::EntityRef;
7use core::marker::PhantomData;
8
9pub struct Keys<K: EntityRef> {
11 pos: usize,
12 rev_pos: usize,
13 unused: PhantomData<K>,
14}
15
16impl<K: EntityRef> Keys<K> {
17 pub fn with_len(len: usize) -> Self {
19 Self {
20 pos: 0,
21 rev_pos: len,
22 unused: PhantomData,
23 }
24 }
25}
26
27impl<K: EntityRef> Iterator for Keys<K> {
28 type Item = K;
29
30 fn next(&mut self) -> Option<Self::Item> {
31 if self.pos < self.rev_pos {
32 let k = K::new(self.pos);
33 self.pos += 1;
34 Some(k)
35 } else {
36 None
37 }
38 }
39
40 fn size_hint(&self) -> (usize, Option<usize>) {
41 let size = self.rev_pos - self.pos;
42 (size, Some(size))
43 }
44}
45
46impl<K: EntityRef> DoubleEndedIterator for Keys<K> {
47 fn next_back(&mut self) -> Option<Self::Item> {
48 if self.rev_pos > self.pos {
49 let k = K::new(self.rev_pos - 1);
50 self.rev_pos -= 1;
51 Some(k)
52 } else {
53 None
54 }
55 }
56}
57
58impl<K: EntityRef> ExactSizeIterator for Keys<K> {}