//! Utility structs & functions use anyhow::Result; /// Keeps a given resource for each swapchain image pub struct TargetSpecificResources { elements: Vec, next_idx: usize, } impl TargetSpecificResources { /// Create a new set of resources, given a function to generate them and the count /// In most cases, count should be swapchain_properties.image_count pub fn new(mut generator: F, count: usize) -> Result where F: FnMut() -> Result, { let mut elements = Vec::with_capacity(count); for _ in 0..count { elements.push(generator()?); } Ok(TargetSpecificResources { elements, next_idx: 0, }) } /// Get the next resource, wrapping around if necessary. pub fn get_next(&mut self) -> &T { let el = &self.elements[self.next_idx]; self.next_idx = (self.next_idx + 1) % self.elements.len(); el } /// Dissolve the resource set, returning an iterator over each item. /// In most cases, each item will need deactivated. pub fn dissolve(self) -> impl Iterator { self.elements.into_iter() } }