use std::num::NonZero;
use o3::mem;
use crate::driver::schedule::app::batch;
pub unsafe trait Limit {
fn get(&self) -> NonZero<usize>;
}
unsafe impl Limit for NonZero<usize> {
fn get(&self) -> NonZero<usize> {
*self
}
}
pub trait Settle<'id> {
unsafe fn take(self, used: usize) -> mem::raw::Unused<'id>;
}
impl<'id, T: Limit> Settle<'id> for batch::Bound<'id, T> {
unsafe fn take(self, used: usize) -> mem::raw::Unused<'id> {
let (limit, token) = self.into_parts();
unsafe { mem::raw::Unused::new(limit.get().get() - used.max(1), token) }
}
}