13
13
//! Invariants are encoded as ([`Aliasing`], [`Alignment`], [`Validity`])
14
14
//! triples implementing the [`Invariants`] trait.
15
15
16
- use super :: * ;
17
-
18
16
/// The invariants of a [`Ptr`][super::Ptr].
19
17
pub trait Invariants : Sealed {
20
18
type Aliasing : Aliasing ;
@@ -82,6 +80,15 @@ pub trait Aliasing:
82
80
/// Aliasing>::Variance<'a, T>` to inherit this variance.
83
81
#[ doc( hidden) ]
84
82
type Variance < ' a , T : ' a + ?Sized > ;
83
+
84
+ // #[doc(hidden)]
85
+ // type Applied<'a, T: 'a + ?Sized>;
86
+
87
+ // #[doc(hidden)]
88
+ // fn into_ptr<'a, T: 'a + ?Sized>(ptr: Self::Applied<'a, T>) -> PtrInner<'a, T>;
89
+
90
+ // #[doc(hidden)]
91
+ // unsafe fn from_ptr<'a, T: 'a + ?Sized>(ptr: PtrInner<'a, T>) -> Self::Applied<'a, T>;
85
92
}
86
93
87
94
#[ doc( hidden) ]
@@ -136,14 +143,7 @@ impl<
136
143
///
137
144
/// Given `A: Reference`, callers may assume that either `A = Shared` or `A =
138
145
/// Exclusive`.
139
- pub trait Reference : Aliasing + Sealed {
140
- fn with < ' a , T , I , S , E , O > ( ptr : Ptr < ' a , T , I > , shared : S , exclusive : E ) -> O
141
- where
142
- T : ' a + ?Sized ,
143
- I : Invariants < Aliasing = Self > ,
144
- S : FnOnce ( Ptr < ' a , T , I :: WithAliasing < Shared > > ) -> O ,
145
- E : FnOnce ( Ptr < ' a , T , I :: WithAliasing < Exclusive > > ) -> O ;
146
- }
146
+ pub trait Reference : ReadFoo + Sealed { }
147
147
148
148
/// It is unknown whether any invariant holds.
149
149
pub enum Unknown { }
@@ -189,18 +189,7 @@ impl Aliasing for Shared {
189
189
const IS_EXCLUSIVE : bool = false ;
190
190
type Variance < ' a , T : ' a + ?Sized > = & ' a T ;
191
191
}
192
- impl Reference for Shared {
193
- #[ inline( always) ]
194
- fn with < ' a , T , I , S , E , O > ( ptr : Ptr < ' a , T , I > , shared : S , _exclusive : E ) -> O
195
- where
196
- T : ' a + ?Sized ,
197
- I : Invariants < Aliasing = Shared > ,
198
- S : FnOnce ( Ptr < ' a , T , I :: WithAliasing < Shared > > ) -> O ,
199
- E : FnOnce ( Ptr < ' a , T , I :: WithAliasing < Exclusive > > ) -> O ,
200
- {
201
- shared ( ptr. unify_invariants ( ) )
202
- }
203
- }
192
+ impl Reference for Shared { }
204
193
205
194
/// The `Ptr<'a, T>` adheres to the aliasing rules of a `&'a mut T`.
206
195
///
@@ -215,16 +204,41 @@ impl Aliasing for Exclusive {
215
204
const IS_EXCLUSIVE : bool = true ;
216
205
type Variance < ' a , T : ' a + ?Sized > = & ' a mut T ;
217
206
}
218
- impl Reference for Exclusive {
219
- #[ inline( always) ]
220
- fn with < ' a , T , I , S , E , O > ( ptr : Ptr < ' a , T , I > , _shared : S , exclusive : E ) -> O
221
- where
222
- T : ' a + ?Sized ,
223
- I : Invariants < Aliasing = Exclusive > ,
224
- S : FnOnce ( Ptr < ' a , T , I :: WithAliasing < Shared > > ) -> O ,
225
- E : FnOnce ( Ptr < ' a , T , I :: WithAliasing < Exclusive > > ) -> O ,
226
- {
227
- exclusive ( ptr. unify_invariants ( ) )
207
+ impl Reference for Exclusive { }
208
+
209
+ #[ cfg( feature = "alloc" ) ]
210
+ pub use _alloc:: * ;
211
+ #[ cfg( feature = "alloc" ) ]
212
+ mod _alloc {
213
+ use alloc:: boxed:: Box as Bx ;
214
+
215
+ use super :: * ;
216
+
217
+ pub enum Box { }
218
+ impl AliasingInner for Box {
219
+ // type MappedTo<M: AliasingMapping> = M::FromBox;
220
+ }
221
+ impl Aliasing for Box {
222
+ const IS_EXCLUSIVE : bool = true ;
223
+ type Variance < ' a , T : ' a + ?Sized > = Bx < T > ;
224
+ }
225
+ }
226
+
227
+ #[ cfg( feature = "std" ) ]
228
+ pub use _std:: * ;
229
+ #[ cfg( feature = "std" ) ]
230
+ mod _std {
231
+ use std:: sync:: Arc as Ac ;
232
+
233
+ use super :: * ;
234
+
235
+ pub enum Arc { }
236
+ impl AliasingInner for Arc {
237
+ // type MappedTo<M: AliasingMapping> = M::FromArc;
238
+ }
239
+ impl Aliasing for Arc {
240
+ const IS_EXCLUSIVE : bool = true ;
241
+ type Variance < ' a , T : ' a + ?Sized > = Ac < T > ;
228
242
}
229
243
}
230
244
@@ -279,6 +293,27 @@ impl ValidityInner for Valid {
279
293
type MappedTo < M : ValidityMapping > = M :: FromValid ;
280
294
}
281
295
296
+ // Aliasing modes that permit reading at all (ie, everything but Inaccessible).
297
+ pub trait ReadFoo : Aliasing { }
298
+ impl ReadFoo for Shared { }
299
+ impl ReadFoo for Exclusive { }
300
+ #[ cfg( feature = "alloc" ) ]
301
+ impl ReadFoo for Box { }
302
+ #[ cfg( feature = "std" ) ]
303
+ impl ReadFoo for Arc { }
304
+
305
+ // Shared, Arc, etc
306
+ pub trait SharedFoo : Aliasing { }
307
+ impl SharedFoo for Shared { }
308
+ #[ cfg( feature = "std" ) ]
309
+ impl SharedFoo for Arc { }
310
+
311
+ // Exclusive, Box, etc
312
+ pub trait ExclusiveFoo : Aliasing { }
313
+ impl ExclusiveFoo for Exclusive { }
314
+ #[ cfg( feature = "alloc" ) ]
315
+ impl ExclusiveFoo for Box { }
316
+
282
317
/// [`Ptr`](crate::Ptr) referents that permit unsynchronized read operations.
283
318
///
284
319
/// `T: Read<A, R>` implies that a pointer to `T` with aliasing `A` permits
@@ -303,8 +338,7 @@ define_because!(
303
338
#[ doc( hidden) ]
304
339
pub BecauseExclusive
305
340
) ;
306
- // SAFETY: The aliasing parameter is `Exclusive`.
307
- unsafe impl < T : ?Sized > Read < Exclusive , BecauseExclusive > for T { }
341
+ unsafe impl < A : ExclusiveFoo , T : ?Sized > Read < A , BecauseExclusive > for T { }
308
342
309
343
define_because ! (
310
344
/// Unsynchronized reads are permitted because no live [`Ptr`](crate::Ptr)s
@@ -313,7 +347,7 @@ define_because!(
313
347
pub BecauseImmutable
314
348
) ;
315
349
// SAFETY: `T: Immutable`.
316
- unsafe impl < A : Reference , T : ?Sized + crate :: Immutable > Read < A , BecauseImmutable > for T { }
350
+ unsafe impl < A : ReadFoo , T : ?Sized + crate :: Immutable > Read < A , BecauseImmutable > for T { }
317
351
318
352
use sealed:: Sealed ;
319
353
mod sealed {
@@ -326,6 +360,10 @@ mod sealed {
326
360
// impl Sealed for Inaccessible {}
327
361
impl Sealed for Shared { }
328
362
impl Sealed for Exclusive { }
363
+ #[ cfg( feature = "alloc" ) ]
364
+ impl Sealed for Box { }
365
+ #[ cfg( feature = "std" ) ]
366
+ impl Sealed for Arc { }
329
367
330
368
impl Sealed for Aligned { }
331
369
@@ -386,6 +424,10 @@ mod mapping {
386
424
// type FromInaccessible: Aliasing;
387
425
type FromShared : Aliasing ;
388
426
type FromExclusive : Aliasing ;
427
+ #[ cfg( feature = "alloc" ) ]
428
+ type FromBox : Aliasing ;
429
+ #[ cfg( feature = "std" ) ]
430
+ type FromArc : Aliasing ;
389
431
}
390
432
391
433
/// A mapping from one [`Alignment`] type to another.
@@ -454,38 +496,62 @@ mod mapping {
454
496
// // type FromInaccessible = FromInaccessible;
455
497
// type FromShared = FromShared;
456
498
// type FromExclusive = FromExclusive;
499
+ // #[cfg(feature = "alloc")]
500
+ // type FromBox = Inaccessible;
501
+ // #[cfg(feature = "std")]
502
+ // type FromArc = Inaccessible;
457
503
// }
458
504
459
505
// impl AliasingMapping for Inaccessible {
460
506
// type FromInaccessible = Inaccessible;
461
507
// type FromShared = Inaccessible;
462
508
// type FromExclusive = Inaccessible;
509
+ // #[cfg(feature = "alloc")]
510
+ // type FromBox = Inaccessible;
511
+ // #[cfg(feature = "std")]
512
+ // type FromArc = Inaccessible;
463
513
// }
464
514
465
515
// pub enum UnsafeCellMismatch {}
466
516
467
517
// impl AliasingMapping for UnsafeCellMismatch {
468
- // // type FromInaccessible = Inaccessible;
518
+ // type FromInaccessible = Inaccessible;
469
519
// type FromShared = Inaccessible;
470
520
// type FromExclusive = Exclusive;
521
+ // #[cfg(feature = "alloc")]
522
+ // type FromBox = Box;
523
+ // #[cfg(feature = "std")]
524
+ // type FromArc = Inaccessible;
471
525
// }
472
526
473
527
// impl AliasingMapping for Preserved {
474
528
// // type FromInaccessible = Inaccessible;
475
529
// type FromShared = Shared;
476
530
// type FromExclusive = Exclusive;
531
+ // #[cfg(feature = "alloc")]
532
+ // type FromBox = Box;
533
+ // #[cfg(feature = "std")]
534
+ // type FromArc = Arc;
477
535
// }
478
536
479
537
// impl AliasingMapping for Shared {
480
538
// // type FromInaccessible = Shared;
481
539
// type FromShared = Shared;
482
540
// type FromExclusive = Shared;
541
+ // #[cfg(feature = "alloc")]
542
+ // type FromBox = Shared;
543
+ // #[cfg(feature = "std")]
544
+ // type FromArc = Shared;
483
545
// }
484
546
485
547
// impl AliasingMapping for Exclusive {
486
548
// // type FromInaccessible = Exclusive;
487
549
// type FromShared = Exclusive;
488
550
// type FromExclusive = Exclusive;
551
+ // #[cfg(feature = "alloc")]
552
+ // type FromBox = Exclusive;
553
+ // #[cfg(feature = "std")]
554
+ // type FromArc = Exclusive;
489
555
// }
490
556
491
557
impl < FromUnknown : Alignment , FromAligned : Alignment > AlignmentMapping
0 commit comments