#![allow(clippy::unused_async)]
#[doc(hidden)]
#[cfg(feature = "std")]
extern crate std;
use alloc::{vec, vec::Vec};
use core::marker::PhantomData;
use super::tree_element::BehaviorTreeElement;
pub struct TreeIter<'a> {
stack: Vec<&'a BehaviorTreeElement>,
marker: PhantomData<&'a BehaviorTreeElement>,
}
impl<'a> TreeIter<'a> {
#[must_use]
pub fn new(root: &'a BehaviorTreeElement) -> Self {
Self {
stack: vec![root],
marker: PhantomData,
}
}
}
impl<'a> Iterator for TreeIter<'a> {
type Item = &'a BehaviorTreeElement;
fn next(&mut self) -> Option<Self::Item> {
if let Some(node) = self.stack.pop() {
for child in node.children_iter().rev() {
self.stack.push(child);
}
return Some(node);
}
None
}
}
pub struct TreeIterMut<'a> {
stack: Vec<*mut BehaviorTreeElement>,
marker: PhantomData<&'a mut BehaviorTreeElement>,
}
impl<'a> TreeIterMut<'a> {
#[must_use]
pub fn new(root: &'a mut BehaviorTreeElement) -> Self {
Self {
stack: vec![root],
marker: PhantomData,
}
}
}
#[allow(unsafe_code)]
impl<'a> Iterator for TreeIterMut<'a> {
type Item = &'a mut BehaviorTreeElement;
fn next(&mut self) -> Option<Self::Item> {
if let Some(node_ptr) = self.stack.pop() {
let node = unsafe { &mut *node_ptr };
for child in node.children_iter_mut().rev() {
self.stack.push(child);
}
return Some(&mut *node);
}
None
}
}