orx_concurrent_iter/implementations/jagged_arrays/
slices.rs

1use alloc::vec::Vec;
2
3/// A collection of slices.
4pub trait Slices<'a, T>: Clone
5where
6    T: 'a,
7{
8    /// Creates an empty collection of slices.
9    fn empty() -> Self;
10
11    /// Number of slices.
12    fn num_slices(&self) -> usize;
13
14    /// Iterator over slices.
15    fn slices(&self) -> impl Iterator<Item = &'a [T]>;
16
17    /// Iterator over lengths of slices.
18    fn lengths(&self) -> impl Iterator<Item = usize>;
19
20    /// Returns a reference to the `f`-th slice.
21    /// Returns None if out of bounds.
22    fn slice_at(&self, f: usize) -> Option<&'a [T]>;
23
24    /// Returns the `f`-th slice without bounds checks.
25    ///
26    /// # Safety
27    ///
28    /// The caller must ensure that `f < self.num_slices()`.
29    unsafe fn slice_at_unchecked(&self, f: usize) -> &'a [T];
30}
31
32impl<'a, T: 'a> Slices<'a, T> for &'a [Vec<T>] {
33    fn empty() -> Self {
34        Default::default()
35    }
36
37    fn num_slices(&self) -> usize {
38        self.len()
39    }
40
41    fn slices(&self) -> impl Iterator<Item = &'a [T]> {
42        self.iter().map(|x| x.as_slice())
43    }
44
45    fn lengths(&self) -> impl Iterator<Item = usize> {
46        self.iter().map(|x| x.len())
47    }
48
49    fn slice_at(&self, f: usize) -> Option<&'a [T]> {
50        self.get(f).map(|x| x.as_slice())
51    }
52
53    unsafe fn slice_at_unchecked(&self, f: usize) -> &'a [T] {
54        self[f].as_slice()
55    }
56}