From: Ian Jackson Date: Thu, 14 Nov 2024 22:15:26 +0000 (+0000) Subject: attempt at sealing X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=c65f6f71e3284439e3d3e0e06e699cfa1f1809f4;p=manually-boxed attempt at sealing --- diff --git a/src/lib.rs b/src/lib.rs index b89da5d..55d3733 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,7 +17,7 @@ pub struct NoAliasSingleton { /// /// 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> { @@ -29,7 +29,7 @@ pub unsafe trait IsRefToken<'a>: Sized { /// /// 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> @@ -57,20 +57,34 @@ pub unsafe trait IsMutToken<'a>: IsRefToken<'a> + Sized { } } } -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.