bitcask_rs/
keys_iterator.rs

1use std::collections::HashSet;
2use std::sync::RwLockReadGuard;
3use store::{ActiveData, OlderData};
4use core::Key;
5
6pub struct StoreKeys<'a> {
7    pub active_data_guard: RwLockReadGuard<'a, ActiveData>,
8    pub older_data_guard: RwLockReadGuard<'a, OlderData>,
9}
10
11impl<'a> IntoIterator for &'a StoreKeys<'a> {
12    type Item = &'a Key;
13    type IntoIter = StoreKeysIter<'a>;
14
15    fn into_iter(self) -> <Self as IntoIterator>::IntoIter {
16        StoreKeysIter::new(Box::new(
17            self.active_data_guard
18                .keys()
19                .chain(self.older_data_guard.keys()),
20        ))
21    }
22}
23
24pub struct StoreKeysIter<'a> {
25    iter: Box<Iterator<Item = &'a Key> + 'a>,
26    seen: HashSet<Key>,
27}
28
29impl<'a> StoreKeysIter<'a> {
30    fn new(iter: Box<Iterator<Item = &'a Key> + 'a>) -> StoreKeysIter<'a> {
31        StoreKeysIter {
32            iter,
33            seen: HashSet::new(),
34        }
35    }
36}
37
38impl<'a> Iterator for StoreKeysIter<'a> {
39    type Item = &'a Key;
40
41    fn next(&mut self) -> Option<<Self as Iterator>::Item> {
42        loop {
43            let v = self.iter.next();
44            let i = v?;
45            if self.seen.insert(i.clone()) {
46                return v;
47            } else {
48                continue;
49            }
50        }
51    }
52}