use std::{marker, ops};
use crate::{
backend::{self, bound},
driver::{self, flight},
platform::reactor,
};
pub mod raw;
#[doc(hidden)]
#[repr(transparent)]
pub struct Context<'a, 'owner, 'd: 'owner> {
driver: driver::Context<'a, 'd>,
_owner: marker::PhantomData<raw::Owner<'owner, 'd>>,
}
impl<'a, 'owner, 'd: 'owner> Context<'a, 'owner, 'd> {
#[doc(hidden)]
pub fn new(driver: driver::Context<'a, 'd>, owner: raw::Owner<'owner, 'd>) -> Self {
let _ = owner;
Self {
driver,
_owner: marker::PhantomData,
}
}
pub fn reborrow(&mut self) -> Context<'_, 'owner, 'd> {
Context {
driver: self.driver.reborrow(),
_owner: marker::PhantomData,
}
}
pub fn driver(&mut self) -> &mut driver::Context<'a, 'd> {
&mut self.driver
}
}
impl<'a, 'owner, 'd: 'owner> Context<'a, 'owner, 'd> {
pub(in crate::driver) fn submit_bound(
&mut self,
submission: bound::Bound<'owner, 'd>,
) -> Result<flight::Flight<'d>, driver::SubmitError>
where
backend::Backend: reactor::Source,
{
let mut queue = reactor::Source::queue(self.backend());
reactor::Queue::submit(&mut queue, submission)
}
}
impl<'a, 'owner, 'd: 'owner> ops::Deref for Context<'a, 'owner, 'd> {
type Target = driver::Context<'a, 'd>;
fn deref(&self) -> &Self::Target {
&self.driver
}
}
impl<'a, 'owner, 'd: 'owner> ops::DerefMut for Context<'a, 'owner, 'd> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.driver
}
}
const _: () = {
assert!(
std::mem::size_of::<Context<'static, 'static, 'static>>()
== std::mem::size_of::<driver::Context<'static, 'static>>()
);
assert!(
std::mem::align_of::<Context<'static, 'static, 'static>>()
== std::mem::align_of::<driver::Context<'static, 'static>>()
);
};