wgpu_core/track/
stateless.rs

1use alloc::{sync::Arc, vec::Vec};
2use core::slice::Iter;
3
4/// A tracker that holds strong references to resources.
5///
6/// This is only used to keep resources alive.
7#[derive(Debug)]
8pub(crate) struct StatelessTracker<T> {
9    resources: Vec<Arc<T>>,
10}
11
12impl<T> StatelessTracker<T> {
13    pub fn new() -> Self {
14        Self {
15            resources: Vec::new(),
16        }
17    }
18
19    /// Inserts a single resource into the resource tracker.
20    ///
21    /// Returns a reference to the newly inserted resource.
22    /// (This allows avoiding a clone/reference count increase in many cases.)
23    pub fn insert_single(&mut self, resource: Arc<T>) -> &Arc<T> {
24        self.resources.push(resource);
25        unsafe { self.resources.last().unwrap_unchecked() }
26    }
27}
28
29impl<'a, T> IntoIterator for &'a StatelessTracker<T> {
30    type Item = &'a Arc<T>;
31    type IntoIter = Iter<'a, Arc<T>>;
32
33    fn into_iter(self) -> Self::IntoIter {
34        self.resources.as_slice().iter()
35    }
36}