1use core::marker::PhantomData;
2use core::ops::ControlFlow;
3
4use crate::Key;
5use crate::concurrent::Value;
6use crate::concurrent::smr;
7use crate::raw;
8use crate::raw::iter::Order;
9
10pub struct Shard<'g, 'k, K: Key, V, R, G> {
12 _guard: G,
13 inner: raw::Shard<'g, 'k, K, R>,
14 _value: PhantomData<V>,
15}
16
17impl<'g, 'k, K, V, R, G> Shard<'g, 'k, K, V, R, G>
18where
19 K: Key,
20 V: Value,
21 R: raw::iter::Range<K::Read<'k>>,
22 G: smr::Guard<V>,
23{
24 #[inline]
25 pub(super) unsafe fn new(
26 guard: G,
27 prefix: raw::Shard<'g, 'k, K, R>,
28 ) -> Shard<'g, 'k, K, V, R, G> {
29 Shard {
30 _guard: guard,
31 inner: prefix,
32 _value: PhantomData,
33 }
34 }
35}
36
37impl<'g, 'k, K, V, R, G> Shard<'g, 'k, K, V, R, G>
38where
39 K: Key,
40 V: Value,
41 R: raw::iter::Range<K::Read<'k>>,
42 G: smr::Guard<V>,
43{
44 #[inline]
46 pub fn entries(&self, order: Order) -> EntryIter<'_, 'k, K, V, R> {
47 EntryIter {
48 inner: self.inner.entries(Some(order)),
49 value: 0,
50 _value: PhantomData,
51 }
52 }
53
54 #[inline]
56 pub fn values(&self, order: Order) -> ValueIter<'_, 'k, K, V, R> {
57 ValueIter {
58 inner: self.inner.values(Some(order)),
59 value: 0,
60 _value: PhantomData,
61 }
62 }
63}
64
65pub struct EntryIter<'g, 'k, K: Key, V: Value, R: raw::iter::Range<K::Read<'k>>> {
67 inner: raw::iter::EntryIter<'g, 'k, K, R>,
68 value: u64,
69 _value: PhantomData<V>,
70}
71
72impl<'g, 'k, K, V, R> EntryIter<'g, 'k, K, V, R>
73where
74 K: Key,
75 V: Value,
76 R: raw::iter::Range<K::Read<'k>>,
77{
78 #[inline]
81 pub fn lend(&mut self) -> Option<(K::Insert<'_>, &V::Borrowed)> {
82 self.inner.lend().map(|(key, value, _)| {
83 self.value = value;
84 (key, unsafe { V::borrow_from_raw_unchecked(&self.value) })
85 })
86 }
87
88 #[inline]
90 pub fn try_fold<F, B, C>(mut self, init: C, mut apply: F) -> ControlFlow<B, C>
91 where
92 F: FnMut(C, (K::Insert<'_>, &V::Borrowed)) -> ControlFlow<B, C>,
93 {
94 self.inner.try_fold(init, |acc, (key, value, _)| {
95 self.value = value;
96 apply(
97 acc,
98 (key, unsafe { V::borrow_from_raw_unchecked(&self.value) }),
99 )
100 })
101 }
102}
103
104impl<'g, 'k, K, V, R> Iterator for EntryIter<'g, 'k, K, V, R>
105where
106 K: Key,
107 V: Value,
108 V::Borrowed: Clone,
109 R: raw::iter::Range<K::Read<'k>>,
110{
111 type Item = (K, V::Borrowed);
112
113 fn next(&mut self) -> Option<Self::Item> {
115 self.lend()
116 .map(|(key, value)| (K::insert_to_key(key), value.clone()))
117 }
118}
119
120pub struct ValueIter<'g, 'k, K: Key, V: Value, R: raw::iter::Range<K::Read<'k>>> {
122 inner: raw::iter::ValueIter<'g, 'k, K, R>,
123 value: u64,
124 _value: PhantomData<V>,
125}
126
127impl<'g, 'k, K, V, R> ValueIter<'g, 'k, K, V, R>
128where
129 K: Key,
130 V: Value,
131 R: raw::iter::Range<K::Read<'k>>,
132{
133 #[inline]
135 pub fn lend(&mut self) -> Option<&V::Borrowed> {
136 self.inner.lend().map(|(value, _)| {
137 self.value = value;
138 unsafe { V::borrow_from_raw_unchecked(&self.value) }
139 })
140 }
141
142 #[inline]
144 pub fn try_fold<F: FnMut(C, &V::Borrowed) -> ControlFlow<B, C>, B, C>(
145 mut self,
146 init: C,
147 mut apply: F,
148 ) -> ControlFlow<B, C> {
149 self.inner.try_fold(init, |acc, (value, _)| {
150 self.value = value;
151 apply(acc, unsafe { V::borrow_from_raw_unchecked(&self.value) })
152 })
153 }
154}
155
156impl<'g, 'k, K, V, R> Iterator for ValueIter<'g, 'k, K, V, R>
157where
158 K: Key,
159 V: Value,
160 V::Borrowed: Clone,
161 R: raw::iter::Range<K::Read<'k>>,
162{
163 type Item = V::Borrowed;
164
165 fn next(&mut self) -> Option<Self::Item> {
167 self.lend().cloned()
168 }
169}