///
/// Implemented for `NoAliasSingleton` and the ZST reference tokens,
/// and `&`-references to them.
-pub unsafe trait IsRefToken<'a> {
+pub unsafe trait IsRefToken<'a>: Sized {
/// Obtain a new ZST token from something that might be a real object.
#[inline]
- fn ref_token(&'a self) -> RefToken<'a> {
+ fn ref_token(self) -> RefToken<'a> {
RefToken(PhantomData)
}
}
///
/// Implemented for `NoAliasSingleton` and `MutToken`,
/// and `&mut`-references to them.
-pub unsafe trait IsMutToken<'a>: IsRefToken<'a> {
+pub unsafe trait IsMutToken<'a>: IsRefToken<'a> + Sized {
/// Obtain a new ZST token from something that might be a real object.
#[inline]
- fn mut_token<'r, 's>(&'s mut self) -> MutToken<'r>
+ fn mut_token<'r, 's>(mut self) -> MutToken<'r>
where 's: 'r, 'a: 'r,
{
MutToken(PhantomData)
}
- fn multi_static<'r, 's>(&'s mut self) -> MultiStatic<'r, ()>
- where 's: 'r, 'a: 'r,
+ fn multi_static<'r>(mut self) -> MultiStatic<'r, ()>
+ where 'a: 'r,
{
MultiStatic {
tok: self.mut_token(),
}
}
}
-unsafe impl<'a> IsRefToken<'a> for NoAliasSingleton {}
-unsafe impl<'a> IsMutToken<'a> for NoAliasSingleton {}
+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> {}