use crate::{MemoryPolicy, Tree, TreeVariant, aliases::N, pinned_storage::PinnedStorage};
use core::iter::FusedIterator;
use orx_iterable::{Collection, CollectionMut, Iterable};
impl<V, M, P> IntoIterator for Tree<V, M, P>
where
V: TreeVariant,
M: MemoryPolicy,
P: PinnedStorage,
{
type Item = V::Item;
type IntoIter = TreeIntoIter<V, <<P as PinnedStorage>::PinnedVec<V> as IntoIterator>::IntoIter>;
fn into_iter(self) -> Self::IntoIter {
let (col, _) = self.0.into_inner();
let (pinned_vec, _, _) = col.into_inner();
TreeIntoIter {
iter: pinned_vec.into_iter(),
}
}
}
pub struct TreeIntoIter<V, I>
where
V: TreeVariant,
I: Iterator<Item = N<V>>,
{
iter: I,
}
impl<V, I> Iterator for TreeIntoIter<V, I>
where
V: TreeVariant,
I: Iterator<Item = N<V>>,
{
type Item = V::Item;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
loop {
match self.iter.next() {
None => return None,
Some(mut node) => {
if node.is_active() {
return node.take_data();
}
}
}
}
}
}
impl<V, I> FusedIterator for TreeIntoIter<V, I>
where
V: TreeVariant,
I: Iterator<Item = N<V>>,
{
}
type PinnedVecIter<'a, V, P> =
<<<P as PinnedStorage>::PinnedVec<V> as Collection>::Iterable<'a> as Iterable>::Iter;
impl<'a, V, M, P> IntoIterator for &'a Tree<V, M, P>
where
V: TreeVariant,
M: MemoryPolicy,
P: PinnedStorage,
{
type Item = &'a V::Item;
type IntoIter = TreeIter<'a, V, PinnedVecIter<'a, V, P>>;
fn into_iter(self) -> Self::IntoIter {
TreeIter {
iter: self.0.nodes().iter(),
}
}
}
pub struct TreeIter<'a, V, I>
where
V: TreeVariant + 'a,
I: Iterator<Item = &'a N<V>>,
{
iter: I,
}
impl<'a, V, I> Iterator for TreeIter<'a, V, I>
where
V: TreeVariant + 'a,
I: Iterator<Item = &'a N<V>>,
{
type Item = &'a V::Item;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
loop {
match self.iter.next() {
None => return None,
Some(node) => {
if node.is_active() {
return node.data();
}
}
}
}
}
}
impl<'a, V, I> FusedIterator for TreeIter<'a, V, I>
where
V: TreeVariant + 'a,
I: Iterator<Item = &'a N<V>>,
{
}
type PinnedVecIterMut<'a, V, P> =
<<P as PinnedStorage>::PinnedVec<V> as CollectionMut>::IterMut<'a>;
impl<'a, V, M, P> IntoIterator for &'a mut Tree<V, M, P>
where
V: TreeVariant,
M: MemoryPolicy,
P: PinnedStorage,
{
type Item = &'a mut V::Item;
type IntoIter = TreeIterMut<'a, V, PinnedVecIterMut<'a, V, P>>;
fn into_iter(self) -> Self::IntoIter {
TreeIterMut {
iter: self.0.nodes_mut().iter_mut(),
}
}
}
pub struct TreeIterMut<'a, V, I>
where
V: TreeVariant + 'a,
I: Iterator<Item = &'a mut N<V>>,
{
iter: I,
}
impl<'a, V, I> Iterator for TreeIterMut<'a, V, I>
where
V: TreeVariant + 'a,
I: Iterator<Item = &'a mut N<V>>,
{
type Item = &'a mut V::Item;
#[inline(always)]
fn next(&mut self) -> Option<Self::Item> {
loop {
match self.iter.next() {
None => return None,
Some(node) => {
if node.is_active() {
return node.data_mut();
}
}
}
}
}
}
impl<'a, V, I> FusedIterator for TreeIterMut<'a, V, I>
where
V: TreeVariant + 'a,
I: Iterator<Item = &'a mut N<V>>,
{
}