use alloc::{sync::Arc, vec::Vec}; use core::slice::Iter; /// A tracker that holds strong references to resources. /// /// This is only used to keep resources alive. #[derive(Debug)] pub(crate) struct StatelessTracker { resources: Vec>, } impl StatelessTracker { pub fn new() -> Self { Self { resources: Vec::new(), } } /// Inserts a single resource into the resource tracker. /// /// Returns a reference to the newly inserted resource. /// (This allows avoiding a clone/reference count increase in many cases.) pub fn insert_single(&mut self, resource: Arc) -> &Arc { self.resources.push(resource); unsafe { self.resources.last().unwrap_unchecked() } } } impl<'a, T> IntoIterator for &'a StatelessTracker { type Item = &'a Arc; type IntoIter = Iter<'a, Arc>; fn into_iter(self) -> Self::IntoIter { self.resources.as_slice().iter() } }