pub unsafe trait HasListLinks<const ID: u64 = 0> {
unsafe fn raw_get_list_links(ptr: *mut Self) -> *mut crate::list::ListLinks<ID>;
}
#[macro_export]
#[doc(hidden)]
macro_rules! impl_has_list_links {
($(impl$({$($generics:tt)*})?
HasListLinks$(<$id:tt>)?
for $self:ty
{ self$(.$field:ident)* }
)*) => {$(
unsafe impl$(<$($generics)*>)? $crate::list::HasListLinks$(<$id>)? for $self {
#[inline]
unsafe fn raw_get_list_links(ptr: *mut Self) -> *mut $crate::list::ListLinks$(<$id>)? {
if false { let _: usize = ::core::mem::offset_of!(Self, $($field).*); }
unsafe { ::core::ptr::addr_of_mut!((*ptr)$(.$field)*) }
}
}
)*};
}
pub use impl_has_list_links;
pub unsafe trait HasSelfPtr<T: ?Sized, const ID: u64 = 0>
where
Self: HasListLinks<ID>,
{
}
#[macro_export]
#[doc(hidden)]
macro_rules! impl_has_list_links_self_ptr {
($(impl$({$($generics:tt)*})?
HasSelfPtr<$item_type:ty $(, $id:tt)?>
for $self:ty
{ self$(.$field:ident)* }
)*) => {$(
unsafe impl$(<$($generics)*>)? $crate::list::HasSelfPtr<$item_type $(, $id)?> for $self {}
unsafe impl$(<$($generics)*>)? $crate::list::HasListLinks$(<$id>)? for $self {
#[inline]
unsafe fn raw_get_list_links(ptr: *mut Self) -> *mut $crate::list::ListLinks$(<$id>)? {
let ptr: *mut $crate::list::ListLinksSelfPtr<$item_type $(, $id)?> =
unsafe { ::core::ptr::addr_of_mut!((*ptr)$(.$field)*) };
ptr.cast()
}
}
)*};
}
pub use impl_has_list_links_self_ptr;
#[macro_export]
#[doc(hidden)]
macro_rules! impl_list_item {
(
$(impl$({$($generics:tt)*})? ListItem<$num:tt> for $self:ty {
using ListLinks { self$(.$field:ident)* };
})*
) => {$(
$crate::list::impl_has_list_links! {
impl$({$($generics)*})? HasListLinks<$num> for $self { self$(.$field)* }
}
unsafe impl$(<$($generics)*>)? $crate::list::ListItem<$num> for $self {
unsafe fn view_links(me: *const Self) -> *mut $crate::list::ListLinks<$num> {
unsafe {
<Self as $crate::list::HasListLinks<$num>>::raw_get_list_links(me.cast_mut())
}
}
unsafe fn view_value(me: *mut $crate::list::ListLinks<$num>) -> *const Self {
unsafe { $crate::container_of!(me, Self, $($field).*) }
}
unsafe fn prepare_to_insert(me: *const Self) -> *mut $crate::list::ListLinks<$num> {
unsafe { <Self as $crate::list::ListItem<$num>>::view_links(me) }
}
unsafe fn post_remove(me: *mut $crate::list::ListLinks<$num>) -> *const Self {
unsafe { $crate::container_of!(me, Self, $($field).*) }
}
}
)*};
(
$(impl$({$($generics:tt)*})? ListItem<$num:tt> for $self:ty {
using ListLinksSelfPtr { self$(.$field:ident)* };
})*
) => {$(
$crate::list::impl_has_list_links_self_ptr! {
impl$({$($generics)*})? HasSelfPtr<$self> for $self { self$(.$field)* }
}
unsafe impl$(<$($generics)*>)? $crate::list::ListItem<$num> for $self {
unsafe fn prepare_to_insert(me: *const Self) -> *mut $crate::list::ListLinks<$num> {
let links_field = unsafe { <Self as $crate::list::ListItem<$num>>::view_links(me) };
let container = unsafe {
$crate::container_of!(
links_field, $crate::list::ListLinksSelfPtr<Self, $num>, inner
)
};
let self_ptr = unsafe {
$crate::list::ListLinksSelfPtr::raw_get_self_ptr(container)
};
let cell_inner = $crate::types::Opaque::cast_into(self_ptr);
unsafe { ::core::ptr::write(cell_inner, me) };
links_field
}
unsafe fn view_links(me: *const Self) -> *mut $crate::list::ListLinks<$num> {
unsafe {
<Self as $crate::list::HasListLinks<$num>>::raw_get_list_links(me.cast_mut())
}
}
unsafe fn view_value(links_field: *mut $crate::list::ListLinks<$num>) -> *const Self {
let container = unsafe {
$crate::container_of!(
links_field, $crate::list::ListLinksSelfPtr<Self, $num>, inner
)
};
let self_ptr = unsafe {
$crate::list::ListLinksSelfPtr::raw_get_self_ptr(container)
};
let cell_inner = $crate::types::Opaque::cast_into(self_ptr);
unsafe { ::core::ptr::read(cell_inner) }
}
unsafe fn post_remove(me: *mut $crate::list::ListLinks<$num>) -> *const Self {
unsafe { <Self as $crate::list::ListItem<$num>>::view_value(me) }
}
}
)*};
}
pub use impl_list_item;