redb_bincode/
range.rs

1use std::fmt;
2use std::marker::PhantomData;
3
4use redb::StorageError;
5
6use crate::{AccessGuard, SortKey, SortOrder};
7
8pub struct Range<'a, K, V, IK = &'static [u8]>
9where
10    IK: redb::Value + 'static + redb::Key,
11{
12    inner: redb::Range<'a, IK, &'static [u8]>,
13    _k: PhantomData<K>,
14    _v: PhantomData<V>,
15}
16
17impl<'a, S, K, V> From<redb::Range<'a, SortKey<S>, &'static [u8]>> for Range<'a, K, V, SortKey<S>>
18where
19    S: SortOrder + fmt::Debug,
20{
21    fn from(inner: redb::Range<'a, SortKey<S>, &'static [u8]>) -> Self {
22        Self {
23            inner,
24            _k: PhantomData,
25            _v: PhantomData,
26        }
27    }
28}
29
30impl<'a, K, V> Iterator for Range<'a, K, V, &'static [u8]> {
31    type Item = Result<(AccessGuard<'a, K>, AccessGuard<'a, V>), StorageError>;
32
33    fn next(&mut self) -> Option<Self::Item> {
34        Some(
35            self.inner
36                .next()?
37                .map(|(k, v)| (AccessGuard::from(k), AccessGuard::from(v))),
38        )
39    }
40}
41
42impl<'a, S, K, V> Iterator for Range<'a, K, V, SortKey<S>>
43where
44    S: SortOrder + fmt::Debug,
45{
46    type Item = Result<(AccessGuard<'a, K, SortKey<S>>, AccessGuard<'a, V>), StorageError>;
47
48    fn next(&mut self) -> Option<Self::Item> {
49        Some(
50            self.inner
51                .next()?
52                .map(|(k, v)| (AccessGuard::from(k), AccessGuard::from(v))),
53        )
54    }
55}
56impl<K, V> DoubleEndedIterator for Range<'_, K, V, &'static [u8]> {
57    fn next_back(&mut self) -> Option<Self::Item> {
58        Some(
59            self.inner
60                .next_back()?
61                .map(|(k, v)| (AccessGuard::from(k), AccessGuard::from(v))),
62        )
63    }
64}
65
66impl<S, K, V> DoubleEndedIterator for Range<'_, K, V, SortKey<S>>
67where
68    S: SortOrder + fmt::Debug,
69{
70    fn next_back(&mut self) -> Option<Self::Item> {
71        Some(
72            self.inner
73                .next_back()?
74                .map(|(k, v)| (AccessGuard::from(k), AccessGuard::from(v))),
75        )
76    }
77}