use core::marker::PhantomData;
use alloc::boxed::Box;
use slotmap::Key;
use core::ops::Range;
use crate::SliceStorage;
pub struct SliceIter<'a, K, V, S>
where
K: Key,
S: SliceStorage<K, Range<u32>>,
V: 'a,
{
pub slice_map: &'a crate::SliceMap<K, V, S>, pub slices: Box<dyn Iterator<Item = &'a Range<u32>> + 'a>, pub type_data: PhantomData<V>,
}
impl<'a, K, V, S> Iterator for SliceIter<'a, K, V, S>
where
K: Key,
S: SliceStorage<K, Range<u32>>,
V: 'a,
{
type Item = &'a [V];
fn next(&mut self) -> Option<Self::Item> {
if let Some(slice) = self.slices.next() {
self.slice_map.items.get(slice.start as usize..slice.end as usize)
} else {
None
}
}
}
pub struct KeySliceIter<'a, K, V, S>
where
K: Key,
S: SliceStorage<K, Range<u32>>,
V: 'a,
{
pub slice_map: &'a crate::SliceMap<K, V, S>, pub slices: Box<dyn Iterator<Item = (K, &'a Range<u32>)> + 'a>, pub type_data: PhantomData<V>,
}
impl<'a, K, V, S> Iterator for KeySliceIter<'a, K, V, S>
where
K: Key,
S: SliceStorage<K, Range<u32>>,
V: 'a,
{
type Item = (K, &'a [V]);
fn next(&mut self) -> Option<Self::Item> {
if let Some((key, slice)) = self.slices.next() {
self.slice_map
.items
.get(slice.start as usize..slice.end as usize)
.map(|item_slice| (key, item_slice))
} else {
None
}
}
}