orx-tree 2.2.0

A beautiful tree 🌳 with convenient, efficient, parallelizable growth, mutation and traversal features.
Documentation
use super::{
    Bfs, into_iter::BfsIterInto, iter_mut::BfsIterMut, iter_ptr::BfsIterPtr, iter_ref::BfsIterRef,
    queue::Item,
};
use crate::{
    MemoryPolicy, NodeMut, NodeMutOrientation, NodeRef, TreeVariant,
    node_ref::NodeRefCore,
    pinned_storage::PinnedStorage,
    traversal::{
        Over, OverMut,
        breadth_first::into_iter_filtered::BfsIterIntoFiltered,
        enumeration::Enumeration,
        over::OverItem,
        over_mut::{OverItemInto, OverItemMut},
        traverser_core::TraverserCore,
    },
};
use alloc::collections::VecDeque;
use orx_self_or::SoM;
use orx_selfref_col::NodePtr;

impl<O: Over> TraverserCore<O> for Bfs<O> {
    type Storage<V>
        = VecDeque<Item<V, O::Enumeration>>
    where
        V: TreeVariant;

    fn storage_mut<V: TreeVariant>(&mut self) -> &mut Self::Storage<V> {
        self.queue.for_variant::<V>()
    }

    fn iter_ptr_with_storage<'a, V>(
        node_ptr: NodePtr<V>,
        storage: impl SoM<Self::Storage<V>>,
    ) -> impl Iterator<Item = <<O as Over>::Enumeration as Enumeration>::Item<NodePtr<V>>>
    where
        V: TreeVariant + 'a,
    {
        BfsIterPtr::<_, O::Enumeration, _>::from((storage, node_ptr))
    }

    fn iter_with_storage<'t, 'a, V, M, P>(
        node: &impl NodeRef<'a, V, M, P>,
        storage: impl SoM<Self::Storage<V>> + 't,
    ) -> impl Iterator<Item = OverItem<'a, V, O, M, P>> + 't
    where
        V: TreeVariant + 'a,
        M: MemoryPolicy,
        P: PinnedStorage,
        Self::Storage<V>: 't,
        'a: 't,
    {
        let root = node.node_ptr();
        let iter = BfsIterPtr::<_, O::Enumeration, _>::from((storage, root));
        BfsIterRef::<'_, _, M, P, _, _, _>::from((node.col(), iter))
    }

    fn iter<'t, 'a, V, M, P>(
        &'t mut self,
        node: &impl NodeRef<'a, V, M, P>,
    ) -> impl Iterator<Item = OverItem<'a, V, O, M, P>> + 't
    where
        V: TreeVariant + 'a,
        M: MemoryPolicy,
        P: PinnedStorage,
        'a: 't,
    {
        let queue = self.queue.for_variant::<V>();
        Self::iter_with_storage(node, queue)
    }

    fn iter_mut<'t, 'a, V, M, P, MO>(
        &'t mut self,
        node: &mut NodeMut<'a, V, M, P, MO>,
    ) -> impl Iterator<Item = OverItemMut<'a, V, O, M, P>> + 't
    where
        V: TreeVariant + 'a,
        M: MemoryPolicy,
        P: PinnedStorage,
        MO: NodeMutOrientation,
        O: OverMut,
        'a: 't,
    {
        let queue = self.queue.for_variant::<V>();
        Self::iter_mut_with_storage(node, queue)
    }

    fn into_iter<'a, V, M, P, MO>(
        &'a mut self,
        node_mut: NodeMut<'a, V, M, P, MO>,
    ) -> impl Iterator<Item = OverItemInto<'a, V, O>>
    where
        V: TreeVariant + 'a,
        M: MemoryPolicy,
        P: PinnedStorage,
        MO: NodeMutOrientation,
        O: OverMut,
    {
        let queue = self.queue.for_variant::<V>();
        Self::into_iter_with_storage(node_mut, queue)
    }

    fn iter_mut_with_storage<'t, 'a, V, M, P, MO>(
        node_mut: &mut NodeMut<'a, V, M, P, MO>,
        storage: impl SoM<Self::Storage<V>> + 't,
    ) -> impl Iterator<Item = OverItemMut<'a, V, O, M, P>> + 't
    where
        V: TreeVariant + 'a,
        M: MemoryPolicy,
        P: PinnedStorage,
        MO: NodeMutOrientation,
        O: OverMut,
        Self::Storage<V>: 't,
        'a: 't,
    {
        let root = node_mut.node_ptr();
        let iter_ptr = BfsIterPtr::<V, O::Enumeration, _>::from((storage, root));
        unsafe { BfsIterMut::from((node_mut.col(), iter_ptr)) }
    }

    fn into_iter_with_storage<'a, V, M, P, MO>(
        node_mut: NodeMut<'a, V, M, P, MO>,
        storage: impl SoM<Self::Storage<V>>,
    ) -> impl Iterator<Item = OverItemInto<'a, V, O>>
    where
        V: TreeVariant + 'a,
        M: MemoryPolicy,
        P: PinnedStorage,
        MO: NodeMutOrientation,
        O: Over,
    {
        let (col, root) = node_mut.into_inner();
        let iter_ptr = BfsIterPtr::<V, O::Enumeration, _>::from((storage, root));
        unsafe { BfsIterInto::<V, M, P, _, _>::from((col, iter_ptr, root)) }
    }

    fn into_iter_with_storage_filtered<'a, V, M, P, MO, F>(
        node_mut: NodeMut<'a, V, M, P, MO>,
        storage: impl SoM<Self::Storage<V>>,
        filter: F,
    ) -> impl Iterator<Item = OverItemInto<'a, V, O>>
    where
        V: TreeVariant + 'a,
        M: MemoryPolicy,
        P: PinnedStorage,
        MO: NodeMutOrientation,
        O: Over,
        F: Fn(&<<O as Over>::Enumeration as Enumeration>::Item<NodePtr<V>>) -> bool,
    {
        let (col, root) = node_mut.into_inner();
        let iter_ptr = BfsIterPtr::<V, O::Enumeration, _>::from((storage, root));
        unsafe { BfsIterIntoFiltered::<V, M, P, _, _, _>::from((col, iter_ptr, root), filter) }
    }
}