use core::marker::PhantomData;
pub struct WalkItem<'r, EIx, E: ?Sized, NIx>((EIx, *const E, NIx), PhantomData<&'r ()>);
impl<'r, EIx, E: ?Sized, NIx> WalkItem<'r, EIx, E, NIx> {
#[inline]
pub fn new(edge_ix: EIx, edge: &'r E, node_ix: NIx) -> Self {
WalkItem((edge_ix, edge as *const E, node_ix), PhantomData)
}
#[inline]
pub fn into_parts(self) -> (EIx, *const E, NIx) {
self.0
}
#[inline]
pub unsafe fn from_parts(edge_ix: EIx, edge_ptr: *const E, node_ix: NIx) -> Self {
WalkItem((edge_ix, edge_ptr, node_ix), PhantomData)
}
#[inline]
pub fn get(self) -> (EIx, &'r E, NIx)
where
E: 'r,
{
let (edge_ix, edge_ptr, node_ix) = self.0;
(edge_ix, unsafe { &*edge_ptr }, node_ix)
}
}
pub struct WalkItemMut<'r, EIx, E: ?Sized, NIx>((EIx, *mut E, NIx), PhantomData<&'r mut ()>);
impl<'r, EIx, E: ?Sized, NIx> WalkItemMut<'r, EIx, E, NIx> {
#[inline]
pub fn new(edge_ix: EIx, edge: &'r mut E, node_ix: NIx) -> Self {
WalkItemMut((edge_ix, edge as *mut E, node_ix), PhantomData)
}
#[inline]
pub fn into_parts(self) -> (EIx, *mut E, NIx) {
self.0
}
#[inline]
pub unsafe fn from_parts(edge_ix: EIx, edge_ptr: *mut E, node_ix: NIx) -> Self {
WalkItemMut((edge_ix, edge_ptr, node_ix), PhantomData)
}
#[inline]
pub fn get_mut(self) -> (EIx, &'r mut E, NIx)
where
E: 'r,
{
let (edge_ix, edge_ptr, node_ix) = self.0;
(edge_ix, unsafe { &mut *edge_ptr }, node_ix)
}
}
pub struct WalkItemTo<'r, NIx, EIx, E: ?Sized>((NIx, EIx, *const E), PhantomData<&'r ()>);
impl<'r, NIx, EIx, E: ?Sized> WalkItemTo<'r, NIx, EIx, E> {
#[inline]
pub fn new(node_ix: NIx, edge_ix: EIx, edge: &'r E) -> Self {
WalkItemTo((node_ix, edge_ix, edge as *const E), PhantomData)
}
#[inline]
pub fn into_parts(self) -> (NIx, EIx, *const E) {
self.0
}
#[inline]
pub unsafe fn from_parts(node_ix: NIx, edge_ix: EIx, edge_ptr: *const E) -> Self {
WalkItemTo((node_ix, edge_ix, edge_ptr), PhantomData)
}
#[inline]
pub fn get(self) -> (NIx, EIx, &'r E)
where
E: 'r,
{
let (node_ix, edge_ix, edge_ptr) = self.0;
(node_ix, edge_ix, unsafe { &*edge_ptr })
}
}
pub struct WalkItemToMut<'r, NIx, EIx, E: ?Sized>((NIx, EIx, *mut E), PhantomData<&'r mut ()>);
impl<'r, NIx, EIx, E: ?Sized> WalkItemToMut<'r, NIx, EIx, E> {
#[inline]
pub fn new(node_ix: NIx, edge_ix: EIx, edge: &'r mut E) -> Self {
WalkItemToMut((node_ix, edge_ix, edge as *mut E), PhantomData)
}
#[inline]
pub fn into_parts(self) -> (NIx, EIx, *mut E) {
self.0
}
#[inline]
pub unsafe fn from_parts(node_ix: NIx, edge_ix: EIx, edge_ptr: *mut E) -> Self {
WalkItemToMut((node_ix, edge_ix, edge_ptr), PhantomData)
}
#[inline]
pub fn get_mut(self) -> (NIx, EIx, &'r mut E)
where
E: 'r,
{
let (node_ix, edge_ix, edge_ptr) = self.0;
(node_ix, edge_ix, unsafe { &mut *edge_ptr })
}
}