#[macro_export]
macro_rules! unsafe_struct_field_offsets{
(
$( Self = $Self:ty, )?
alignment = $alignment:ty,
$( usize_offsets = $usize_offsets:ident,)?
$( impl_GetFieldOffset = $impl_gfo:ident,)?
$(#[$impl_attr:meta])*
impl[ $($impl_params:tt)* ] $self:ty
$(where [ $($where:tt)* ])?
{
$(
$(#[$const_attr:meta])*
$( pub $(($($inn:tt)*))? )?
const $offset:ident, $field_ident:tt: $field_ty:ty;
)*
}
)=>{
$(#[$impl_attr])*
impl<$($impl_params)*> $self
$(where $($where)*)?
{
$crate::_priv_usfoi!{
@setup
params(
Self( $($Self,)? Self, )
alignment = $alignment,
usize_offsets($($usize_offsets,)? false,)
impl_GetFieldOffset( $(false, $Self:ty )? $($impl_gfo,)? true,)
$(#[$impl_attr])*
impl[ $($impl_params)* ] $self
where [ $($($where)*)? ]
)
previous(
(
$crate::_priv_usfoi!(
@initial
$($usize_offsets)?, 0,
),
()
),
$((Self::$offset, $field_ty),)*
)
offsets($(
$(#[$const_attr])*
($( pub $(($($inn)*))? )?) $offset, $field_ident: $field_ty;
)*)
}
}
$crate::expand_if_true!{[ $(false $Self:ty )? $($impl_gfo)? true,]
$(#[$impl_attr])*
unsafe impl<$($impl_params)*> $crate::pmr::ImplsGetFieldOffset for $self
$(where $($where)*)?
{}
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! _priv_usfoi{
(@setup
params $params:tt
previous( $($prev:tt)* )
offsets( $($offsets:tt)* )
)=>{
$crate::_priv_usfoi!{
params $params
params $params
previous( $($prev)* )
offsets( $($offsets)* )
}
};
(@initial true, $value:expr, )=>{
$value
};
(@initial $(false)?, $value:expr, )=>{
$crate::FieldOffset::<_,(),$crate::Aligned>::new($value)
};
(@ty true, $Self:ty, $next_ty:ty, $alignment:ty )=>{
usize
};
(@ty false, $Self:ty, $next_ty:ty, $alignment:ty )=>{
$crate::FieldOffset<$Self,$next_ty,$alignment>
};
(@val true, $Self:ty, $prev:expr, $prev_ty:ty, $next_ty:ty )=>{
$crate::offset_calc::next_field_offset::<$Self, $prev_ty, $next_ty>( $prev )
};
(@val false, $Self:ty, $prev:expr, $prev_ty:ty, $next_ty:ty )=>{
$prev.next_field_offset()
};
(@FieldOffsetWithVis false, $expr:expr)=>{
$crate::pmr::FieldOffsetWithVis::from_fieldoffset($expr)
};
(@FieldOffsetWithVis true, $expr:expr)=>{unsafe{
$crate::pmr::FieldOffsetWithVis::new($expr)
}};
(
params $params:tt
params(
Self( $Self:ty, $($_ignored_Self:ty,)? )
alignment = $alignment:ty,
usize_offsets($usize_offsets:ident, $($_ignored_io:ident,)? )
impl_GetFieldOffset($impl_gfo:ident, $($_ignored_impl_gfo:tt)*)
$(#[$impl_attr:meta])*
impl[ $($impl_params:tt)* ] $self:ty
where [ $($where:tt)* ]
)
previous( ($prev_offset:expr, $prev_ty:ty), $($prev:tt)* )
offsets(
$(#[$const_attr:meta])*
($($vis:tt)*) $offset:ident, $field_ident:tt : $field_ty:ty;
$($next:tt)*
)
)=>{
$(#[$const_attr])*
$($vis)* const $offset:
$crate::_priv_usfoi!(
@ty $usize_offsets, $Self, $field_ty, $alignment
)
= unsafe{
$crate::_priv_impl_getfieldoffset!{
impl_GetFieldOffset = $impl_gfo,
Self = $Self,
alignment = $alignment,
usize_offsets = $usize_offsets,
$(#[$impl_attr])*
impl[ $($impl_params)* ] $self
where [ $($where)* ]
(($($vis)*), $offset, $field_ident : $field_ty)
}
$crate::_priv_usfoi!(
@val
$usize_offsets, $Self, $prev_offset, $prev_ty, $field_ty
)
};
$crate::_priv_usfoi!{
params $params
params $params
previous($($prev)*)
offsets($($next)*)
}
};
(
params $params:tt
params $params2:tt
previous($($prev:tt)*)
offsets()
)=>{};
}
#[doc(hidden)]
#[macro_export]
macro_rules! _priv_impl_getfieldoffset{
(
impl_GetFieldOffset = true,
Self = $Self:ty,
alignment = $alignment:ty,
usize_offsets = $usize_offsets:ident,
$(#[$impl_attr:meta])*
impl[ $($impl_params:tt)* ] $self:ty
where [ $($where:tt)* ]
(($($vis:tt)*), $offset:ident, $field_ident:tt : $field_ty:ty)
)=>{
type __Key = $crate::tstr::TS!($field_ident);
type __Privacy = $crate::_priv_get_privacy!($($vis)*);
$crate::_priv_doc_attribute!{
[$($vis)*]
$(#[$impl_attr])*
unsafe impl<$($impl_params)*> $crate::pmr::GetFieldOffset<__Key> for $self
where $($where)*
{
type Type = $field_ty;
type Alignment = $alignment;
type Privacy = __Privacy;
const OFFSET_WITH_VIS: $crate::pmr::FieldOffsetWithVis<
Self,
__Privacy,
__Key,
Self::Type,
$alignment,
> = unsafe{
$crate::_priv_usfoi!( @FieldOffsetWithVis $usize_offsets, Self::$offset)
};
}
}
};
(impl_GetFieldOffset = false $($rem:tt)*)=>[];
}
#[doc(hidden)]
#[macro_export]
macro_rules! _priv_get_privacy {
(pub) => {
$crate::privacy::IsPublic
};
($($vis:tt)*) => {
$crate::privacy::IsPrivate
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! _priv_doc_attribute {
([pub] $($item:tt)*) => {
$($item)*
};
([$($vis:tt)*] $($item:tt)*) => {
#[doc(hidden)]
$($item)*
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! expand_if_true {
([true $($ignore:tt)*] $($item:tt)*) => {
$($item)*
};
([false $($ignore:tt)*] $($item:tt)*) => {};
}