|
1 | 1 | use super::same_key_entry::{same_key_iter, SameKeyEntry, SameKeyEntryIter}; |
2 | 2 | use super::{key_size::KeyBytesStorage, Index, KeySize, RangedIndex}; |
3 | 3 | use crate::indexes::RowPointer; |
| 4 | +use crate::table_index::same_key_entry::ManySameKeyEntryIter; |
4 | 5 | use core::borrow::Borrow; |
5 | 6 | use core::ops::RangeBounds; |
6 | 7 | use spacetimedb_sats::memory_usage::MemoryUsage; |
7 | | -use std::collections::btree_map::{BTreeMap, Range}; |
| 8 | +use std::collections::btree_map::{BTreeMap, Range, Values}; |
8 | 9 |
|
9 | 10 | /// A multi map that relates a `K` to a *set* of `RowPointer`s. |
10 | 11 | #[derive(Debug, PartialEq, Eq)] |
@@ -78,6 +79,15 @@ impl<K: Ord + KeySize> Index for BTreeIndex<K> { |
78 | 79 | self.seek_point(point) |
79 | 80 | } |
80 | 81 |
|
| 82 | + type Iter<'a> |
| 83 | + = BTreeIndexIter<'a, K> |
| 84 | + where |
| 85 | + Self: 'a; |
| 86 | + |
| 87 | + fn iter(&self) -> Self::Iter<'_> { |
| 88 | + BTreeIndexIter::new(self.map.values()) |
| 89 | + } |
| 90 | + |
81 | 91 | fn num_keys(&self) -> usize { |
82 | 92 | self.map.len() |
83 | 93 | } |
@@ -182,35 +192,29 @@ impl<K: KeySize + Ord> BTreeIndex<K> { |
182 | 192 | where |
183 | 193 | <Self as Index>::Key: Borrow<Q>, |
184 | 194 | { |
185 | | - BTreeIndexRangeIter { |
186 | | - outer: self.map.range((range.start_bound(), range.end_bound())), |
187 | | - inner: SameKeyEntry::empty_iter(), |
188 | | - } |
| 195 | + BTreeIndexRangeIter::new(RangeValues(self.map.range((range.start_bound(), range.end_bound())))) |
189 | 196 | } |
190 | 197 | } |
191 | 198 |
|
| 199 | +/// An iterator over all the values in a [`BTreeIndex`]. |
| 200 | +pub type BTreeIndexIter<'a, K> = ManySameKeyEntryIter<'a, Values<'a, K, SameKeyEntry>>; |
| 201 | + |
192 | 202 | /// An iterator over values in a [`BTreeIndex`] where the keys are in a certain range. |
193 | | -#[derive(Clone)] |
194 | | -pub struct BTreeIndexRangeIter<'a, K> { |
195 | | - /// The outer iterator seeking for matching keys in the range. |
196 | | - outer: Range<'a, K, SameKeyEntry>, |
197 | | - /// The inner iterator for the value set for a found key. |
198 | | - inner: SameKeyEntryIter<'a>, |
| 203 | +pub type BTreeIndexRangeIter<'a, K> = ManySameKeyEntryIter<'a, RangeValues<'a, K, SameKeyEntry>>; |
| 204 | + |
| 205 | +/// An iterator over a key range in a [`BTreeMap`] providing only the values. |
| 206 | +pub struct RangeValues<'a, K, V>(Range<'a, K, V>); |
| 207 | + |
| 208 | +impl<K, V> Clone for RangeValues<'_, K, V> { |
| 209 | + fn clone(&self) -> Self { |
| 210 | + Self(self.0.clone()) |
| 211 | + } |
199 | 212 | } |
200 | 213 |
|
201 | | -impl<K> Iterator for BTreeIndexRangeIter<'_, K> { |
202 | | - type Item = RowPointer; |
| 214 | +impl<'a, K, V> Iterator for RangeValues<'a, K, V> { |
| 215 | + type Item = &'a V; |
203 | 216 |
|
204 | 217 | fn next(&mut self) -> Option<Self::Item> { |
205 | | - loop { |
206 | | - // While the inner iterator has elements, yield them. |
207 | | - if let Some(val) = self.inner.next() { |
208 | | - return Some(val); |
209 | | - } |
210 | | - // Advance and get a new inner, if possible, or quit. |
211 | | - // We'll come back and yield elements from it in the next iteration. |
212 | | - let inner = self.outer.next().map(|(_, i)| i)?; |
213 | | - self.inner = inner.iter(); |
214 | | - } |
| 218 | + self.0.next().map(|(_, v)| v) |
215 | 219 | } |
216 | 220 | } |
0 commit comments