Skip to main content

arctic/concurrent/
iter.rs

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
10/// Immutable reference to a subtree rooted at a key prefix, optionally bounded by a key range.
11pub 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    /// Get an iterator over keys and immutable references to values in `O` order.
45    #[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    /// Get an iterator over immutable references to values in `O` order.
55    #[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
65/// Iterator over keys and references to values.
66pub 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    /// Lending equivalent to [`Iterator::next`] that borrows the current key and
79    /// value from this [`EntryIter`].
80    #[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    /// Internal iteration over keys and immutable references to values.
89    #[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    // FIXME: specialize for `Arc` values
114    fn next(&mut self) -> Option<Self::Item> {
115        self.lend()
116            .map(|(key, value)| (K::insert_to_key(key), value.clone()))
117    }
118}
119
120/// Iterator over references to values.
121pub 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    /// Lending equivalent to [`Iterator::next`] that borrows the current value from this [`EntryIter`].
134    #[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    /// Internal iteration over immutable references to values.
143    #[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    // FIXME: specialize for `Arc` values
166    fn next(&mut self) -> Option<Self::Item> {
167        self.lend().cloned()
168    }
169}