#[doc = crate::_tags!(code maybe)]
#[doc = crate::_doc_meta!{location("code/util")}]
#[macro_export]
#[cfg_attr(cargo_primary_package, doc(hidden))]
macro_rules! maybe {
( // Returns either Some(<$T>::default()) or `None`.
default: $implements_default:stmt, $T:ty ) => {{
#[$crate::compile($implements_default)]
fn maybe_default<T: Default>() -> Option<T> {
Some(T::default())
}
#[$crate::compile(not($implements_default))]
fn maybe_default<T>() -> Option<T> {
None
}
maybe_default::<$T>()
}};
(
clone: $implements_clone:stmt, $T:ty, $value:expr ) => {{
#[$crate::compile($implements_clone)]
fn maybe_clone<T: Clone>(value: &T) -> Option<T> {
Some(value.clone())
}
#[$crate::compile(not($implements_clone))]
fn maybe_clone<T>(_value: &T) -> Option<T> {
None
}
maybe_clone::<$T>($value)
}};
}
#[doc(inline)]
pub use maybe;
#[doc = crate::_tags!(code maybe primitive)]
#[doc = crate::_doc_meta!{location("code/util")}]
#[macro_export]
#[cfg_attr(cargo_primary_package, doc(hidden))]
macro_rules! maybe_slot {
(
// Direct primitive-carrier spellings:
// accept the accessor contract, but expand directly to the value itself.
u8, $value:expr, $($_access:tt)+) => { $value };
(u16, $value:expr, $($_access:tt)+) => { $value };
(u32, $value:expr, $($_access:tt)+) => { $value };
(u64, $value:expr, $($_access:tt)+) => { $value };
(u128, $value:expr, $($_access:tt)+) => { $value };
(usize, $value:expr, $($_access:tt)+) => { $value };
(usize_up, $value:expr, $($_access:tt)+) => { $value };
(usize_down, $value:expr, $($_access:tt)+) => { $value };
(i8, $value:expr, $($_access:tt)+) => { $value };
(i16, $value:expr, $($_access:tt)+) => { $value };
(i32, $value:expr, $($_access:tt)+) => { $value };
(i64, $value:expr, $($_access:tt)+) => { $value };
(i128, $value:expr, $($_access:tt)+) => { $value };
(isize, $value:expr, $($_access:tt)+) => { $value };
(isize_up, $value:expr, $($_access:tt)+) => { $value };
(isize_down, $value:expr, $($_access:tt)+) => { $value };
(f32, $value:expr, $($_access:tt)+) => { $value };
(f64, $value:expr, $($_access:tt)+) => { $value };
(fsize, $value:expr, $($_access:tt)+) => { $value };
(bool, $value:expr, $($_access:tt)+) => { $value };
(char, $value:expr, $($_access:tt)+) => { $value };
(
// Wrapped access through a reference-returning accessor:
// `* .get_ref()`, `* .get_mut()`, ...
$outer_ty:ty, $value:expr, * $($access:tt)+) => { *(($value) $($access)+) };
(
$outer_ty:ty, $value:expr, $($access:tt)+) => { (($value) $($access)+) };
}
#[doc(inline)]
pub use maybe_slot;