orx-concurrent-iter 3.3.0

A thread-safe and ergonomic concurrent iterator trait and efficient lock-free implementations.
Documentation
use crate::implementations::jagged_arrays::Slices;
use alloc::{collections::VecDeque, vec};

pub struct VecDequeRef<'a, T>(Option<&'a VecDeque<T>>);

impl<'a, T> VecDequeRef<'a, T> {
    pub(super) fn new(vec_deque_ref: &'a VecDeque<T>) -> Self {
        Self(Some(vec_deque_ref))
    }
}

impl<'a, T: 'a> Clone for VecDequeRef<'a, T> {
    fn clone(&self) -> Self {
        Self(self.0)
    }
}

impl<'a, T: 'a> Slices<'a, T> for VecDequeRef<'a, T> {
    fn empty() -> Self {
        Self(None)
    }

    fn num_slices(&self) -> usize {
        self.0.map(|x| x.len()).unwrap_or(0)
    }

    fn slices(&self) -> impl Iterator<Item = &'a [T]> {
        self.0
            .map(|x| {
                let (a, b) = x.as_slices();
                vec![a, b].into_iter()
            })
            .unwrap_or_default()
    }

    fn lengths(&self) -> impl Iterator<Item = usize> {
        match &self.0 {
            Some(x) => {
                let (a, b) = x.as_slices();
                vec![a.len(), b.len()].into_iter()
            }
            None => Default::default(),
        }
    }

    fn slice_at(&self, f: usize) -> Option<&'a [T]> {
        self.0.and_then(|x| match f {
            0 => Some(x.as_slices().0),
            1 => Some(x.as_slices().1),
            _ => None,
        })
    }

    unsafe fn slice_at_unchecked(&self, f: usize) -> &'a [T] {
        let x = self.0.expect("`slice_at_unchecked` called when empty");
        match f {
            0 => x.as_slices().0,
            _ => x.as_slices().1,
        }
    }
}