macro_rules! forward {
() => {};
(
$(#[$meta:meta])*
fn $name:ident(&mut self $(, $arg:ident: $aty:ty)* $(,)?) $(-> $ret:ty)? = $body:expr;
$($rest:tt)*
) => {
$(#[$meta])*
pub(crate) fn $name(&mut self $(, $arg: $aty)*) $(-> $ret)? {
$crate::claim::ensure_kernel_thread();
$body
}
forward! { $($rest)* }
};
(
$(#[$meta:meta])*
fn $name:ident(&self $(, $arg:ident: $aty:ty)* $(,)?) $(-> $ret:ty)? = $body:expr;
$($rest:tt)*
) => {
$(#[$meta])*
pub(crate) fn $name(&self $(, $arg: $aty)*) $(-> $ret)? {
$crate::claim::ensure_kernel_thread();
$body
}
forward! { $($rest)* }
};
}
macro_rules! key_identity {
($ty:ident, $field:ident) => {
impl PartialEq for $ty<'_> {
fn eq(&self, o: &Self) -> bool {
self.$field == o.$field
}
}
impl Eq for $ty<'_> {}
impl ::std::hash::Hash for $ty<'_> {
fn hash<H: ::std::hash::Hasher>(&self, s: &mut H) {
self.$field.hash(s);
}
}
};
($ty:ident, $field:ident, ord) => {
key_identity!($ty, $field);
impl Ord for $ty<'_> {
fn cmp(&self, o: &Self) -> ::std::cmp::Ordering {
self.$field.cmp(&o.$field)
}
}
impl PartialOrd for $ty<'_> {
fn partial_cmp(&self, o: &Self) -> Option<::std::cmp::Ordering> {
Some(self.cmp(o))
}
}
};
}