dope-core 0.15.0

The manifold runtime
Documentation
use std::mem;

use crate::{
    backend,
    driver::{flight, route},
};

pub(crate) struct Bound<'owner, 'd: 'owner, R = backend::RawSubmission> {
    raw: backend::Captured<'owner, R>,
    reservation: flight::Reservation<'d>,
}

const _: () = {
    type Parts = (backend::RawSubmission, flight::Reservation<'static>);
    assert!(mem::size_of::<Bound<'static, 'static>>() == mem::size_of::<Parts>());
    assert!(mem::align_of::<Bound<'static, 'static>>() == mem::align_of::<Parts>());
};

impl<'owner, 'd: 'owner, R> Bound<'owner, 'd, R> {
    fn new(raw: backend::Captured<'owner, R>, reservation: flight::Reservation<'d>) -> Self {
        Self { raw, reservation }
    }

    pub(in crate::backend) fn into_parts(self) -> (R, flight::Reservation<'d>) {
        (self.raw.into_inner(), self.reservation)
    }

    pub(crate) fn reserve_retained<Tag: route::Tag>(
        raw: backend::Captured<'owner, R>,
        target: route::Operation<'d, Tag>,
        slots: &flight::Slots<'d, Tag>,
    ) -> Option<Self> {
        Some(Self::new(raw, slots.reserve(target)?))
    }
}

impl<'d> Bound<'d, 'd> {
    pub(crate) fn reserve<Tag: route::Tag>(
        raw: backend::RawSubmission,
        target: route::Operation<'d, Tag>,
        slots: &flight::Slots<'d, Tag>,
    ) -> Option<Self> {
        Self::reserve_retained(backend::Captured::scoped(raw), target, slots)
    }
}