use core::marker::PhantomData;
use core::ops::{Deref, DerefMut};
use crate::borrow::{Ref, RefMut};
use crate::segment_borrow::{SegmentBorrow, SegmentBorrowRegistry};
pub struct SegmentLease<'a> {
registry: *mut SegmentBorrowRegistry,
borrow: SegmentBorrow,
_lt: PhantomData<&'a mut SegmentBorrowRegistry>,
}
impl<'a> SegmentLease<'a> {
#[doc(hidden)]
#[inline(always)]
pub unsafe fn new(
registry: &'a mut SegmentBorrowRegistry,
borrow: SegmentBorrow,
) -> Self {
Self {
registry: registry as *mut _,
borrow,
_lt: PhantomData,
}
}
#[inline(always)]
pub fn borrow(&self) -> &SegmentBorrow {
&self.borrow
}
}
impl<'a> Drop for SegmentLease<'a> {
#[inline(always)]
fn drop(&mut self) {
unsafe {
(*self.registry).release(&self.borrow);
}
}
}
impl<'a> core::fmt::Debug for SegmentLease<'a> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("SegmentLease")
.field("borrow", &self.borrow)
.finish_non_exhaustive()
}
}
pub struct SegRef<'a, T: ?Sized> {
inner: Ref<'a, T>,
lease: SegmentLease<'a>,
}
impl<'a, T: ?Sized> SegRef<'a, T> {
#[doc(hidden)]
#[inline(always)]
pub fn new(inner: Ref<'a, T>, lease: SegmentLease<'a>) -> Self {
Self { inner, lease }
}
#[inline(always)]
pub fn into_parts(self) -> (Ref<'a, T>, SegmentLease<'a>) {
(self.inner, self.lease)
}
#[inline(always)]
pub fn as_ptr(&self) -> *const T {
self.inner.as_ptr()
}
#[inline(always)]
pub fn inner(&self) -> &Ref<'a, T> {
&self.inner
}
}
impl<T: ?Sized> Deref for SegRef<'_, T> {
type Target = T;
#[inline(always)]
fn deref(&self) -> &T {
&*self.inner
}
}
impl<T: ?Sized> core::fmt::Debug for SegRef<'_, T> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("SegRef")
.field("lease", &self.lease)
.finish_non_exhaustive()
}
}
pub struct SegRefMut<'a, T: ?Sized> {
inner: RefMut<'a, T>,
lease: SegmentLease<'a>,
}
impl<'a, T: ?Sized> SegRefMut<'a, T> {
#[doc(hidden)]
#[inline(always)]
pub fn new(inner: RefMut<'a, T>, lease: SegmentLease<'a>) -> Self {
Self { inner, lease }
}
#[inline(always)]
pub fn into_parts(self) -> (RefMut<'a, T>, SegmentLease<'a>) {
(self.inner, self.lease)
}
#[inline(always)]
pub fn as_ptr(&self) -> *const T {
self.inner.as_ptr()
}
#[inline(always)]
pub fn as_mut_ptr(&mut self) -> *mut T {
self.inner.as_mut_ptr()
}
}
impl<T: ?Sized> Deref for SegRefMut<'_, T> {
type Target = T;
#[inline(always)]
fn deref(&self) -> &T {
&*self.inner
}
}
impl<T: ?Sized> DerefMut for SegRefMut<'_, T> {
#[inline(always)]
fn deref_mut(&mut self) -> &mut T {
&mut *self.inner
}
}
impl<T: ?Sized> core::fmt::Debug for SegRefMut<'_, T> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("SegRefMut")
.field("lease", &self.lease)
.finish_non_exhaustive()
}
}