#[cfg(any(test, feature = "_docs_examples"))]
define_handle! {
[offset: u8 + crate::NonExtremeU8; ]
#[doc = crate::_tags!(example uid)]
#[doc = crate::_doc_location!("data")]
pub HandleExample;
}
#[doc = crate::_tags!(construction uid)]
#[doc = crate::_doc_location!("data/id")]
#[cfg_attr(cargo_primary_package, doc(hidden))]
#[macro_export]
macro_rules! define_handle {
(
[
offset: $prim:ident+$T:ty;
]
$(#[$handle_attr:meta])*
$vis:vis $Handle:ident $(;)?
) => {
$crate::define_handle![%handle
[offset:$prim+$T;]
$(#[$handle_attr])* $vis $Handle ];
};
(
%handle
[offset:$prim:ident+$T:ty;]
$(#[$handle_attr:meta])* $vis:vis $Handle:ident) => { $crate::paste! {
$crate::define_handle![%main
[offset:$prim+$T;]
$(#[$handle_attr])* $vis $Handle ];
}};
(
%main
[offset:$prim:ident+$T:ty;]
$(#[$handle_attr:meta])* $vis:vis $Handle:ident) => {
$(#[$handle_attr])*
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
$vis struct $Handle {
offset: $crate::MaybeNiche::<$T>,
len: $crate::MaybeNiche::<$T>,
}
impl $crate::ConstInit for $Handle {
const INIT: Self = Self::new(<$T>::INIT, <$T>::INIT);
}
#[allow(dead_code)]
impl $Handle {
#[must_use] #[inline(always)]
$vis const fn new(offset: $T, len: $T) -> Self {
let offset = $crate::MaybeNiche::<$T>::new(offset);
let len = $crate::MaybeNiche::<$T>::new(len);
Self { offset, len }
}
#[inline(always)]
$vis const fn from_prim(offset: $prim, len: $prim)
-> Result<Self, $crate::InvalidValue> {
let offset = $crate::unwrap![ok? $crate::MaybeNiche::<$T>::try_from_prim(offset)];
let len = $crate::unwrap![ok? $crate::MaybeNiche::<$T>::try_from_prim(len)];
Ok(Self { offset, len })
}
#[must_use] #[inline(always)]
$vis const fn from_prim_lossy(offset: $prim, len: $prim) -> Self {
let offset = $crate::MaybeNiche::<$T>::from_prim_lossy(offset);
let len = $crate::MaybeNiche::<$T>::from_prim_lossy(len);
Self { offset, len }
}
#[inline(always)]
$vis const fn try_from_usize(offset: usize, len: usize)
-> Result<Self, $crate::NicheValueError> {
let o = $crate::unwrap![ok? $crate::MaybeNiche::<$T>::try_from_usize(offset)];
let len = $crate::unwrap![ok? $crate::MaybeNiche::<$T>::try_from_usize(len)];
Ok(Self { offset: o, len })
}
#[must_use] #[inline(always)]
#[allow(clippy::len_without_is_empty)]
$vis const fn len(self) -> $T { self.len.get() }
#[must_use] #[inline(always)]
$vis const fn len_prim(self) -> $prim { self.len.get_prim() }
#[inline(always)]
$vis const fn len_usize(self) -> Result<usize, $crate::Overflow> {
self.len.try_to_usize()
}
#[must_use] #[inline(always)]
$vis const fn len_usize_saturating(self) -> usize {
self.len.to_usize_saturating()
}
#[must_use] #[inline(always)]
$vis const fn offset(self) -> $T { self.offset.get() }
#[must_use] #[inline(always)]
$vis const fn offset_prim(self) -> $prim { self.offset.get_prim() }
#[inline(always)]
$vis const fn offset_usize(self) -> Result<usize, $crate::Overflow> {
self.offset.try_to_usize()
}
#[must_use] #[inline(always)]
$vis const fn offset_usize_saturating(self) -> usize {
self.offset.to_usize_saturating()
}
}
};
}
#[doc(inline)]
pub use define_handle;