sharded_slab/
iter.rs

1use crate::{page, shard};
2use std::slice;
3
4#[derive(Debug)]
5pub struct UniqueIter<'a, T, C: crate::cfg::Config> {
6    pub(super) shards: shard::IterMut<'a, Option<T>, C>,
7    pub(super) pages: slice::Iter<'a, page::Shared<Option<T>, C>>,
8    pub(super) slots: Option<page::Iter<'a, T, C>>,
9}
10
11impl<'a, T, C: crate::cfg::Config> Iterator for UniqueIter<'a, T, C> {
12    type Item = &'a T;
13    fn next(&mut self) -> Option<Self::Item> {
14        test_println!("UniqueIter::next");
15        loop {
16            test_println!("-> try next slot");
17            if let Some(item) = self.slots.as_mut().and_then(|slots| slots.next()) {
18                test_println!("-> found an item!");
19                return Some(item);
20            }
21
22            test_println!("-> try next page");
23            if let Some(page) = self.pages.next() {
24                test_println!("-> found another page");
25                self.slots = page.iter();
26                continue;
27            }
28
29            test_println!("-> try next shard");
30            if let Some(shard) = self.shards.next() {
31                test_println!("-> found another shard");
32                self.pages = shard.iter();
33            } else {
34                test_println!("-> all done!");
35                return None;
36            }
37        }
38    }
39}