use core::{iter::FusedIterator, marker::PhantomData};
use crate::{Cell, CellOwner, Family};
pub struct Iter<'a, T: 'a, F: Family, I: Iterator<Item = &'a Cell<F, T>> + 'a> {
owner: &'a CellOwner<F>,
iter: I,
_t: PhantomData<T>,
}
impl<'a, T: 'a, F: Family, I: Iterator<Item = &'a Cell<F, T>> + 'a> Iter<'a, T, F, I> {
pub const fn new(owner: &'a CellOwner<F>, iter: I) -> Self {
Self {
owner,
iter,
_t: PhantomData,
}
}
pub const fn owner(&self) -> &'a CellOwner<F> {
self.owner
}
pub const fn inner(&self) -> &I {
&self.iter
}
pub fn into_inner(self) -> I {
self.iter
}
}
impl<'a, T: 'a, F: Family, I: Iterator<Item = &'a Cell<F, T>> + 'a> Iterator for Iter<'a, T, F, I> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
Some(self.iter.next()?.get(self.owner))
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
}
impl<'a, T: 'a, F: Family, I: Iterator<Item = &'a Cell<F, T>> + 'a> DoubleEndedIterator
for Iter<'a, T, F, I>
where
I: DoubleEndedIterator,
{
fn next_back(&mut self) -> Option<Self::Item> {
Some(self.iter.next_back()?.get(self.owner))
}
}
impl<'a, T: 'a, F: Family, I: Iterator<Item = &'a Cell<F, T>> + 'a> ExactSizeIterator
for Iter<'a, T, F, I>
where
I: ExactSizeIterator,
{
}
impl<'a, T: 'a, F: Family, I: Iterator<Item = &'a Cell<F, T>> + 'a> FusedIterator
for Iter<'a, T, F, I>
where
I: FusedIterator,
{
}
pub struct IterMut<'a, T: 'a, F: Family, I: Iterator<Item = &'a Cell<F, T>> + 'a> {
owner: &'a mut CellOwner<F>,
iter: I,
_t: PhantomData<T>,
}
impl<'a, T: 'a, F: Family, I: Iterator<Item = &'a Cell<F, T>> + 'a> IterMut<'a, T, F, I> {
pub fn new(owner: &'a mut CellOwner<F>, iter: I) -> Self {
Self {
owner,
iter,
_t: PhantomData,
}
}
pub const fn owner(&self) -> &CellOwner<F> {
&*self.owner
}
pub fn owner_mut(&mut self) -> &mut CellOwner<F> {
self.owner
}
pub const fn inner(&self) -> &I {
&self.iter
}
pub fn into_inner(self) -> I {
self.iter
}
}
impl<'a, T: 'a, F: Family, I: Iterator<Item = &'a Cell<F, T>> + 'a> IterMut<'a, T, F, I> {
#[allow(clippy::should_implement_trait)]
pub fn next(&mut self) -> Option<&mut T> {
Some(self.iter.next()?.get_mut(self.owner))
}
}
impl<'a, T: 'a, F: Family, I: Iterator<Item = &'a Cell<F, T>> + 'a> IterMut<'a, T, F, I>
where
I: DoubleEndedIterator,
{
pub fn next_back(&mut self) -> Option<&mut T> {
Some(self.iter.next_back()?.get_mut(self.owner))
}
}