1use skipdb_core::rev_range::RevRange;
2
3use super::*;
4
5pub struct ReadTransaction<K, V, I, C> {
7 pub(crate) db: I,
8 pub(crate) rtm: Rtm<K, V, C, BTreePwm<K, V>>,
9}
10
11impl<K, V, I, C> ReadTransaction<K, V, I, C> {
12 #[inline]
13 pub(super) fn new(db: I, rtm: Rtm<K, V, C, BTreePwm<K, V>>) -> Self {
14 Self { db, rtm }
15 }
16}
17
18impl<K, V, I, C> ReadTransaction<K, V, I, C>
19where
20 K: Ord,
21 I: Database<K, V>,
22{
23 #[inline]
25 pub fn version(&self) -> u64 {
26 self.rtm.version()
27 }
28
29 #[inline]
31 pub fn get<Q>(&self, key: &Q) -> Option<Ref<'_, K, V>>
32 where
33 K: Borrow<Q>,
34 Q: Ord + ?Sized,
35 {
36 let version = self.rtm.version();
37 self.db.as_inner().get(key, version).map(Into::into)
38 }
39
40 #[inline]
42 pub fn contains_key<Q>(&self, key: &Q) -> bool
43 where
44 K: Borrow<Q>,
45 Q: Ord + ?Sized,
46 {
47 let version = self.rtm.version();
48 self.db.as_inner().contains_key(key, version)
49 }
50
51 #[inline]
53 pub fn iter(&self) -> Iter<'_, K, V> {
54 let version = self.rtm.version();
55 self.db.as_inner().iter(version)
56 }
57
58 #[inline]
60 pub fn iter_rev(&self) -> RevIter<'_, K, V> {
61 let version = self.rtm.version();
62 self.db.as_inner().iter_rev(version)
63 }
64
65 #[inline]
67 pub fn range<Q, R>(&self, range: R) -> Range<'_, Q, R, K, V>
68 where
69 K: Borrow<Q>,
70 R: RangeBounds<Q>,
71 Q: Ord + ?Sized,
72 {
73 let version = self.rtm.version();
74 self.db.as_inner().range(range, version)
75 }
76
77 #[inline]
79 pub fn range_rev<Q, R>(&self, range: R) -> RevRange<'_, Q, R, K, V>
80 where
81 K: Borrow<Q>,
82 R: RangeBounds<Q>,
83 Q: Ord + ?Sized,
84 {
85 let version = self.rtm.version();
86 self.db.as_inner().range_rev(range, version)
87 }
88}