use crate::{
resource::{QuerySet, Trackable},
track::metadata::ResourceMetadata,
};
use alloc::sync::Arc;
#[derive(Debug)]
pub(crate) struct QuerySetTracker {
metadata: ResourceMetadata<Arc<QuerySet>>,
size: usize,
}
impl QuerySetTracker {
pub fn new() -> Self {
Self {
metadata: ResourceMetadata::new(),
size: 0,
}
}
pub fn insert_single(&mut self, resource: Arc<QuerySet>) -> &Arc<QuerySet> {
let index = resource.tracker_index().as_usize();
self.allow_index(index);
unsafe {
self.metadata.insert(index, resource)
}
}
pub fn set_size(&mut self, size: usize) {
self.size = size;
self.metadata.set_size(size)
}
fn allow_index(&mut self, index: usize) {
if index >= self.size {
self.set_size(index + 1);
}
}
pub fn contains(&self, query_set: &QuerySet) -> bool {
self.metadata.contains(query_set.tracker_index().as_usize())
}
pub fn used_resources(&self) -> impl Iterator<Item = &Arc<QuerySet>> {
self.metadata.owned_resources()
}
}