use std::{mem, ptr};
pub(crate) use echo::Echo;
use o3::alloc;
mod echo;
use flight::{GENERATION_BITS, INDEX_BITS, Target, storage};
use crate::driver::{self, retained::flight};
pub(super) struct Access<'a, 'd> {
arena: storage::raw::Access<'a, 'd, Target, INDEX_BITS, GENERATION_BITS>,
driver: driver::Invariant<'d>,
}
impl<'a, 'd> Access<'a, 'd> {
pub(super) fn new(
arena: &'a mut storage::Flights<Target, INDEX_BITS, GENERATION_BITS>,
driver: driver::Reference<'d>,
) -> Self {
let pointer = ptr::NonNull::from(arena);
let arena = unsafe { storage::raw::Access::new(pointer.as_ref()) };
Self {
arena,
driver: driver.brand,
}
}
pub(super) fn try_batch<const GROUPS: usize>(
self,
caps: [usize; GROUPS],
) -> Result<
(
storage::Prepared<'a, 'd, Target, INDEX_BITS, GENERATION_BITS, GROUPS>,
driver::Invariant<'d>,
),
alloc::Error,
> {
Ok((self.arena.try_batch(caps)?, self.driver))
}
}
const _: () = {
assert!(mem::size_of::<Access<'static, 'static>>() == mem::size_of::<usize>());
assert!(mem::align_of::<Access<'static, 'static>>() == mem::align_of::<usize>());
assert!(mem::size_of::<Echo>() == mem::size_of::<usize>());
};