///
/// Implemented for `NoAliasSingleton` and the ZST reference tokens,
/// and `&`-references to them.
-pub unsafe trait IsRefToken<'a>: Sized {
+pub unsafe trait IsRefToken<'a>: Sized + Sealed {
/// Obtain a new ZST token from something that might be a real object.
#[inline]
fn ref_token(self) -> RefToken<'a> {
///
/// Implemented for `NoAliasSingleton` and `MutToken`,
/// and `&mut`-references to them.
-pub unsafe trait IsMutToken<'a>: IsRefToken<'a> + Sized {
+pub unsafe trait IsMutToken<'a>: IsRefToken<'a> + Sized + Sealed {
/// Obtain a new ZST token from something that might be a real object.
#[inline]
fn mut_token<'r>(self) -> MutToken<'r>
}
}
}
-unsafe impl<'a> IsRefToken<'a> for &'a NoAliasSingleton {}
-unsafe impl<'a> IsRefToken<'a> for &'a mut NoAliasSingleton {}
-unsafe impl<'a> IsMutToken<'a> for &'a mut NoAliasSingleton {}
-unsafe impl<'a> IsRefToken<'a> for RefToken<'a> {}
-unsafe impl<'a> IsRefToken<'a> for MutToken<'a> {}
-unsafe impl<'a> IsMutToken<'a> for MutToken<'a> {}
-unsafe impl<'a, A: IsRefToken<'a>> IsRefToken<'a> for &'a A {}
-
-unsafe impl<'r, 'a, 'aa, A> IsRefToken<'r> for &'aa mut A
+
+mod sealed { pub trait Sealed {} }
+use sealed::Sealed;
+
+macro_rules! impl_is { { $(
+ unsafe impl [$($gens:tt)*] $trait:ty, for $ty:ty {}
+)* } => { $(
+ unsafe impl <$($gens )*> $trait for $ty {}
+ impl <$($gens )*> Sealed for $ty {}
+)* } }
+impl_is! {
+
+unsafe impl['a] IsRefToken<'a>, for &'a NoAliasSingleton {}
+unsafe impl['a] IsRefToken<'a>, for &'a mut NoAliasSingleton {}
+unsafe impl['a] IsMutToken<'a>, for &'a mut NoAliasSingleton {}
+unsafe impl['a] IsRefToken<'a>, for RefToken<'a> {}
+unsafe impl['a] IsRefToken<'a>, for MutToken<'a> {}
+unsafe impl['a] IsMutToken<'a>, for MutToken<'a> {}
+unsafe impl['a, A: IsRefToken<'a>] IsRefToken<'a>, for &'a A {}
+
+unsafe impl['r, 'a, 'aa, A] IsRefToken<'r>, for &'aa mut A
where A: IsMutToken<'a>, 'a: 'r, 'aa: 'r {}
-unsafe impl<'r, 'a, 'aa, A> IsMutToken<'r> for &'aa mut A
+unsafe impl['r, 'a, 'aa, A] IsMutToken<'r>, for &'aa mut A
where A: IsMutToken<'a>, 'a: 'r, 'aa: 'r {}
+}
+
/// `&NoAliasSingleton`, but a ZST
///
/// We don't actually ever need to look at the data for the singleton.