use core::fmt;
use core::marker::PhantomData;
use super::brand::InvariantLifetime;
use super::capability::private::Sealed;
use super::capability::{ReadPermit, WritePermit};
use super::SharedReadToken;
pub struct ExclusiveToken<'brand> {
_invariant: InvariantLifetime<'brand>,
}
impl<'brand> ExclusiveToken<'brand> {
#[inline]
#[must_use]
pub const unsafe fn new_unchecked() -> Self {
Self {
_invariant: PhantomData,
}
}
#[inline]
#[must_use]
pub fn share<'a>(&'a self) -> SharedReadToken<'a, 'brand> {
unsafe { SharedReadToken::new_unchecked() }
}
}
impl<'brand> fmt::Debug for ExclusiveToken<'brand> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("ExclusiveToken<'brand>")
}
}
impl<'brand> Sealed for &ExclusiveToken<'brand> {}
impl<'brand> Sealed for &mut ExclusiveToken<'brand> {}
unsafe impl<'brand> ReadPermit<'brand> for &ExclusiveToken<'brand> {}
unsafe impl<'brand> ReadPermit<'brand> for &mut ExclusiveToken<'brand> {}
unsafe impl<'brand> WritePermit<'brand> for &mut ExclusiveToken<'brand> {}