chiark / gitweb /
attempt at sealing
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 14 Nov 2024 22:15:26 +0000 (22:15 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 14 Nov 2024 22:15:26 +0000 (22:15 +0000)
src/lib.rs

index b89da5d0849c893ad8c18a2fec60b41e608bd2cf..55d3733e0bebfe6e43997b1c7cb274222023932f 100644 (file)
@@ -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.