bitcask_rs/
keys_iterator.rs1use 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}