impl DispatchFromDyn for Cell and UnsafeCell
This commit is contained in:
parent
c8e6a9e8b6
commit
a2d1cb2c22
2 changed files with 54 additions and 1 deletions
|
@ -196,7 +196,7 @@ use crate::cmp::Ordering;
|
||||||
use crate::fmt::{self, Debug, Display};
|
use crate::fmt::{self, Debug, Display};
|
||||||
use crate::marker::{PhantomData, Unsize};
|
use crate::marker::{PhantomData, Unsize};
|
||||||
use crate::mem;
|
use crate::mem;
|
||||||
use crate::ops::{CoerceUnsized, Deref, DerefMut};
|
use crate::ops::{CoerceUnsized, Deref, DerefMut, DispatchFromDyn};
|
||||||
use crate::ptr::{self, NonNull};
|
use crate::ptr::{self, NonNull};
|
||||||
|
|
||||||
mod lazy;
|
mod lazy;
|
||||||
|
@ -571,6 +571,16 @@ impl<T: Default> Cell<T> {
|
||||||
#[unstable(feature = "coerce_unsized", issue = "18598")]
|
#[unstable(feature = "coerce_unsized", issue = "18598")]
|
||||||
impl<T: CoerceUnsized<U>, U> CoerceUnsized<Cell<U>> for Cell<T> {}
|
impl<T: CoerceUnsized<U>, U> CoerceUnsized<Cell<U>> for Cell<T> {}
|
||||||
|
|
||||||
|
// Allow types that wrap `Cell` to also implement `DispatchFromDyn`
|
||||||
|
// and become object safe method receivers.
|
||||||
|
// Note that currently `Cell` itself cannot be a method receiver
|
||||||
|
// because it does not implement Deref.
|
||||||
|
// In other words:
|
||||||
|
// `self: Cell<&Self>` won't work
|
||||||
|
// `self: CellWrapper<Self>` becomes possible
|
||||||
|
#[unstable(feature = "dispatch_from_dyn", issue = "none")]
|
||||||
|
impl<T: DispatchFromDyn<U>, U> DispatchFromDyn<Cell<U>> for Cell<T> {}
|
||||||
|
|
||||||
impl<T> Cell<[T]> {
|
impl<T> Cell<[T]> {
|
||||||
/// Returns a `&[Cell<T>]` from a `&Cell<[T]>`
|
/// Returns a `&[Cell<T>]` from a `&Cell<[T]>`
|
||||||
///
|
///
|
||||||
|
@ -2078,6 +2088,16 @@ impl<T> const From<T> for UnsafeCell<T> {
|
||||||
#[unstable(feature = "coerce_unsized", issue = "18598")]
|
#[unstable(feature = "coerce_unsized", issue = "18598")]
|
||||||
impl<T: CoerceUnsized<U>, U> CoerceUnsized<UnsafeCell<U>> for UnsafeCell<T> {}
|
impl<T: CoerceUnsized<U>, U> CoerceUnsized<UnsafeCell<U>> for UnsafeCell<T> {}
|
||||||
|
|
||||||
|
// Allow types that wrap `UnsafeCell` to also implement `DispatchFromDyn`
|
||||||
|
// and become object safe method receivers.
|
||||||
|
// Note that currently `UnsafeCell` itself cannot be a method receiver
|
||||||
|
// because it does not implement Deref.
|
||||||
|
// In other words:
|
||||||
|
// `self: UnsafeCell<&Self>` won't work
|
||||||
|
// `self: UnsafeCellWrapper<Self>` becomes possible
|
||||||
|
#[unstable(feature = "dispatch_from_dyn", issue = "none")]
|
||||||
|
impl<T: DispatchFromDyn<U>, U> DispatchFromDyn<UnsafeCell<U>> for UnsafeCell<T> {}
|
||||||
|
|
||||||
/// [`UnsafeCell`], but [`Sync`].
|
/// [`UnsafeCell`], but [`Sync`].
|
||||||
///
|
///
|
||||||
/// This is just an `UnsafeCell`, except it implements `Sync`
|
/// This is just an `UnsafeCell`, except it implements `Sync`
|
||||||
|
@ -2169,6 +2189,17 @@ impl<T> const From<T> for SyncUnsafeCell<T> {
|
||||||
//#[unstable(feature = "sync_unsafe_cell", issue = "95439")]
|
//#[unstable(feature = "sync_unsafe_cell", issue = "95439")]
|
||||||
impl<T: CoerceUnsized<U>, U> CoerceUnsized<SyncUnsafeCell<U>> for SyncUnsafeCell<T> {}
|
impl<T: CoerceUnsized<U>, U> CoerceUnsized<SyncUnsafeCell<U>> for SyncUnsafeCell<T> {}
|
||||||
|
|
||||||
|
// Allow types that wrap `SyncUnsafeCell` to also implement `DispatchFromDyn`
|
||||||
|
// and become object safe method receivers.
|
||||||
|
// Note that currently `SyncUnsafeCell` itself cannot be a method receiver
|
||||||
|
// because it does not implement Deref.
|
||||||
|
// In other words:
|
||||||
|
// `self: SyncUnsafeCell<&Self>` won't work
|
||||||
|
// `self: SyncUnsafeCellWrapper<Self>` becomes possible
|
||||||
|
#[unstable(feature = "dispatch_from_dyn", issue = "none")]
|
||||||
|
//#[unstable(feature = "sync_unsafe_cell", issue = "95439")]
|
||||||
|
impl<T: DispatchFromDyn<U>, U> DispatchFromDyn<SyncUnsafeCell<U>> for SyncUnsafeCell<T> {}
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
fn assert_coerce_unsized(
|
fn assert_coerce_unsized(
|
||||||
a: UnsafeCell<&i32>,
|
a: UnsafeCell<&i32>,
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#![feature(rustc_attrs)]
|
#![feature(rustc_attrs)]
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
|
cell::Cell,
|
||||||
ops::{Deref, CoerceUnsized, DispatchFromDyn},
|
ops::{Deref, CoerceUnsized, DispatchFromDyn},
|
||||||
marker::Unsize,
|
marker::Unsize,
|
||||||
};
|
};
|
||||||
|
@ -20,6 +21,20 @@ impl<T: ?Sized> Deref for Ptr<T> {
|
||||||
impl<T: Unsize<U> + ?Sized, U: ?Sized> CoerceUnsized<Ptr<U>> for Ptr<T> {}
|
impl<T: Unsize<U> + ?Sized, U: ?Sized> CoerceUnsized<Ptr<U>> for Ptr<T> {}
|
||||||
impl<T: Unsize<U> + ?Sized, U: ?Sized> DispatchFromDyn<Ptr<U>> for Ptr<T> {}
|
impl<T: Unsize<U> + ?Sized, U: ?Sized> DispatchFromDyn<Ptr<U>> for Ptr<T> {}
|
||||||
|
|
||||||
|
|
||||||
|
struct CellPtr<'a, T: ?Sized>(Cell<&'a T>);
|
||||||
|
|
||||||
|
impl<'a, T: ?Sized> Deref for CellPtr<'a, T> {
|
||||||
|
type Target = T;
|
||||||
|
|
||||||
|
fn deref(&self) -> &T {
|
||||||
|
self.0.get()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, T: Unsize<U> + ?Sized, U: ?Sized> CoerceUnsized<CellPtr<'a, U>> for CellPtr<'a, T> {}
|
||||||
|
impl<'a, T: Unsize<U> + ?Sized, U: ?Sized> DispatchFromDyn<CellPtr<'a, U>> for CellPtr<'a, T> {}
|
||||||
|
|
||||||
struct Wrapper<T: ?Sized>(T);
|
struct Wrapper<T: ?Sized>(T);
|
||||||
|
|
||||||
impl<T: ?Sized> Deref for Wrapper<T> {
|
impl<T: ?Sized> Deref for Wrapper<T> {
|
||||||
|
@ -42,6 +57,7 @@ trait Trait {
|
||||||
fn ptr_wrapper(self: Ptr<Wrapper<Self>>) -> i32;
|
fn ptr_wrapper(self: Ptr<Wrapper<Self>>) -> i32;
|
||||||
fn wrapper_ptr(self: Wrapper<Ptr<Self>>) -> i32;
|
fn wrapper_ptr(self: Wrapper<Ptr<Self>>) -> i32;
|
||||||
fn wrapper_ptr_wrapper(self: Wrapper<Ptr<Wrapper<Self>>>) -> i32;
|
fn wrapper_ptr_wrapper(self: Wrapper<Ptr<Wrapper<Self>>>) -> i32;
|
||||||
|
fn cell(self: CellPtr<Self>) -> i32;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Trait for i32 {
|
impl Trait for i32 {
|
||||||
|
@ -54,6 +70,9 @@ impl Trait for i32 {
|
||||||
fn wrapper_ptr_wrapper(self: Wrapper<Ptr<Wrapper<Self>>>) -> i32 {
|
fn wrapper_ptr_wrapper(self: Wrapper<Ptr<Wrapper<Self>>>) -> i32 {
|
||||||
***self
|
***self
|
||||||
}
|
}
|
||||||
|
fn cell(self: CellPtr<Self>) -> i32 {
|
||||||
|
*self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -65,4 +84,7 @@ fn main() {
|
||||||
|
|
||||||
let wpw = Wrapper(Ptr(Box::new(Wrapper(7)))) as Wrapper<Ptr<Wrapper<dyn Trait>>>;
|
let wpw = Wrapper(Ptr(Box::new(Wrapper(7)))) as Wrapper<Ptr<Wrapper<dyn Trait>>>;
|
||||||
assert_eq!(wpw.wrapper_ptr_wrapper(), 7);
|
assert_eq!(wpw.wrapper_ptr_wrapper(), 7);
|
||||||
|
|
||||||
|
let c = CellPtr(Cell::new(&8)) as CellPtr<dyn Trait>;
|
||||||
|
assert_eq!(c.cell(), 8);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue