@@ -55,6 +55,11 @@ impl<A: Aliasing, AA: Alignment, V: Validity> Invariants for (A, AA, V) {
55
55
}
56
56
57
57
/// The aliasing invariant of a [`Ptr`][super::Ptr].
58
+ ///
59
+ /// All aliasing invariants must permit reading from the bytes of a pointer's
60
+ /// referent which are not covered by [`UnsafeCell`]s.
61
+ ///
62
+ /// [`UnsafeCell`]: core::cell::UnsafeCell
58
63
pub trait Aliasing : Sealed {
59
64
/// Is `Self` [`Exclusive`]?
60
65
#[ doc( hidden) ]
@@ -65,9 +70,6 @@ pub trait Aliasing: Sealed {
65
70
/// Aliasing>::Variance<'a, T>` to inherit this variance.
66
71
#[ doc( hidden) ]
67
72
type Variance < ' a , T : ' a + ?Sized > ;
68
-
69
- #[ doc( hidden) ]
70
- type MappedTo < M : AliasingMapping > : Aliasing ;
71
73
}
72
74
73
75
/// The alignment invariant of a [`Ptr`][super::Ptr].
@@ -100,22 +102,6 @@ impl Validity for Unknown {
100
102
type MappedTo < M : ValidityMapping > = M :: FromUnknown ;
101
103
}
102
104
103
- /// The `Ptr<'a, T>` does not permit any reads or writes from or to its referent.
104
- pub enum Inaccessible { }
105
-
106
- impl Aliasing for Inaccessible {
107
- const IS_EXCLUSIVE : bool = false ;
108
-
109
- // SAFETY: Inaccessible `Ptr`s permit neither reads nor writes, and so it
110
- // doesn't matter how long the referent actually lives. Thus, covariance is
111
- // fine (and is chosen because it is maximally permissive). Shared
112
- // references are covariant [1].
113
- //
114
- // [1] https://doc.rust-lang.org/1.81.0/reference/subtyping.html#variance
115
- type Variance < ' a , T : ' a + ?Sized > = & ' a T ;
116
- type MappedTo < M : AliasingMapping > = M :: FromInaccessible ;
117
- }
118
-
119
105
/// The `Ptr<'a, T>` adheres to the aliasing rules of a `&'a T`.
120
106
///
121
107
/// The referent of a shared-aliased `Ptr` may be concurrently referenced by any
@@ -128,7 +114,6 @@ pub enum Shared {}
128
114
impl Aliasing for Shared {
129
115
const IS_EXCLUSIVE : bool = false ;
130
116
type Variance < ' a , T : ' a + ?Sized > = & ' a T ;
131
- type MappedTo < M : AliasingMapping > = M :: FromShared ;
132
117
}
133
118
impl Reference for Shared { }
134
119
@@ -141,7 +126,6 @@ pub enum Exclusive {}
141
126
impl Aliasing for Exclusive {
142
127
const IS_EXCLUSIVE : bool = true ;
143
128
type Variance < ' a , T : ' a + ?Sized > = & ' a mut T ;
144
- type MappedTo < M : AliasingMapping > = M :: FromExclusive ;
145
129
}
146
130
impl Reference for Exclusive { }
147
131
@@ -230,7 +214,7 @@ define_because!(
230
214
pub BecauseImmutable
231
215
) ;
232
216
// SAFETY: `T: Immutable`.
233
- unsafe impl < A : Reference , T : ?Sized + crate :: Immutable > Read < A , BecauseImmutable > for T { }
217
+ unsafe impl < A : Aliasing , T : ?Sized + crate :: Immutable > Read < A , BecauseImmutable > for T { }
234
218
235
219
use sealed:: Sealed ;
236
220
mod sealed {
@@ -240,7 +224,6 @@ mod sealed {
240
224
241
225
impl Sealed for Unknown { }
242
226
243
- impl Sealed for Inaccessible { }
244
227
impl Sealed for Shared { }
245
228
impl Sealed for Exclusive { }
246
229
@@ -257,23 +240,6 @@ pub use mapping::*;
257
240
mod mapping {
258
241
use super :: * ;
259
242
260
- /// A mapping from one [`Aliasing`] type to another.
261
- ///
262
- /// An `AliasingMapping` is a type-level map which maps one `Aliasing` type
263
- /// to another. It is always "total" in the sense of having a mapping for
264
- /// any `A: Aliasing`.
265
- ///
266
- /// Given `A: Aliasing` and `M: AliasingMapping`, `M` can be applied to `A`
267
- /// as [`MappedAliasing<A, M>`](MappedAliasing).
268
- ///
269
- /// Mappings are used by [`Ptr`](crate::Ptr) conversion methods to preserve
270
- /// or modify invariants as required by each method's semantics.
271
- pub trait AliasingMapping {
272
- type FromInaccessible : Aliasing ;
273
- type FromShared : Aliasing ;
274
- type FromExclusive : Aliasing ;
275
- }
276
-
277
243
/// A mapping from one [`Alignment`] type to another.
278
244
///
279
245
/// An `AlignmentMapping` is a type-level map which maps one `Alignment`
@@ -308,10 +274,6 @@ mod mapping {
308
274
type FromValid : Validity ;
309
275
}
310
276
311
- /// The application of the [`AliasingMapping`] `M` to the [`Aliasing`] `A`.
312
- #[ allow( type_alias_bounds) ]
313
- pub type MappedAliasing < A : Aliasing , M : AliasingMapping > = A :: MappedTo < M > ;
314
-
315
277
/// The application of the [`AlignmentMapping`] `M` to the [`Alignment`] `A`.
316
278
#[ allow( type_alias_bounds) ]
317
279
pub type MappedAlignment < A : Alignment , M : AlignmentMapping > = A :: MappedTo < M > ;
@@ -320,14 +282,6 @@ mod mapping {
320
282
#[ allow( type_alias_bounds) ]
321
283
pub type MappedValidity < V : Validity , M : ValidityMapping > = V :: MappedTo < M > ;
322
284
323
- impl < FromInaccessible : Aliasing , FromShared : Aliasing , FromExclusive : Aliasing > AliasingMapping
324
- for ( ( Inaccessible , FromInaccessible ) , ( Shared , FromShared ) , ( Exclusive , FromExclusive ) )
325
- {
326
- type FromInaccessible = FromInaccessible ;
327
- type FromShared = FromShared ;
328
- type FromExclusive = FromExclusive ;
329
- }
330
-
331
285
impl < FromUnknown : Alignment , FromAligned : Alignment > AlignmentMapping
332
286
for ( ( Unknown , FromUnknown ) , ( Shared , FromAligned ) )
333
287
{
0 commit comments