Auto merge of #24737 - P1start:dst-cell, r=alexcrichton
This + DST coercions (#24619) would allow code like `Rc<RefCell<Box<Trait>>>` to be simplified to `Rc<RefCell<Trait>>`.
This commit is contained in:
@@ -144,7 +144,7 @@
|
||||
use clone::Clone;
|
||||
use cmp::PartialEq;
|
||||
use default::Default;
|
||||
use marker::{Copy, Send, Sync};
|
||||
use marker::{Copy, Send, Sync, Sized};
|
||||
use ops::{Deref, DerefMut, Drop};
|
||||
use option::Option;
|
||||
use option::Option::{None, Some};
|
||||
@@ -266,9 +266,9 @@ impl<T:PartialEq + Copy> PartialEq for Cell<T> {
|
||||
///
|
||||
/// See the [module-level documentation](index.html) for more.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub struct RefCell<T> {
|
||||
value: UnsafeCell<T>,
|
||||
pub struct RefCell<T: ?Sized> {
|
||||
borrow: Cell<BorrowFlag>,
|
||||
value: UnsafeCell<T>,
|
||||
}
|
||||
|
||||
/// An enumeration of values returned from the `state` method on a `RefCell<T>`.
|
||||
@@ -328,7 +328,9 @@ impl<T> RefCell<T> {
|
||||
debug_assert!(self.borrow.get() == UNUSED);
|
||||
unsafe { self.value.into_inner() }
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: ?Sized> RefCell<T> {
|
||||
/// Query the current state of this `RefCell`
|
||||
///
|
||||
/// The returned value can be dispatched on to determine if a call to
|
||||
@@ -449,7 +451,7 @@ impl<T> RefCell<T> {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
unsafe impl<T> Send for RefCell<T> where T: Send {}
|
||||
unsafe impl<T: ?Sized> Send for RefCell<T> where T: Send {}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: Clone> Clone for RefCell<T> {
|
||||
@@ -469,7 +471,7 @@ impl<T:Default> Default for RefCell<T> {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: PartialEq> PartialEq for RefCell<T> {
|
||||
impl<T: ?Sized + PartialEq> PartialEq for RefCell<T> {
|
||||
#[inline]
|
||||
fn eq(&self, other: &RefCell<T>) -> bool {
|
||||
*self.borrow() == *other.borrow()
|
||||
@@ -519,7 +521,7 @@ impl<'b> Clone for BorrowRef<'b> {
|
||||
///
|
||||
/// See the [module-level documentation](index.html) for more.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub struct Ref<'b, T:'b> {
|
||||
pub struct Ref<'b, T: ?Sized + 'b> {
|
||||
// FIXME #12808: strange name to try to avoid interfering with
|
||||
// field accesses of the contained type via Deref
|
||||
_value: &'b T,
|
||||
@@ -527,7 +529,7 @@ pub struct Ref<'b, T:'b> {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<'b, T> Deref for Ref<'b, T> {
|
||||
impl<'b, T: ?Sized> Deref for Ref<'b, T> {
|
||||
type Target = T;
|
||||
|
||||
#[inline]
|
||||
@@ -582,7 +584,7 @@ impl<'b> BorrowRefMut<'b> {
|
||||
///
|
||||
/// See the [module-level documentation](index.html) for more.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub struct RefMut<'b, T:'b> {
|
||||
pub struct RefMut<'b, T: ?Sized + 'b> {
|
||||
// FIXME #12808: strange name to try to avoid interfering with
|
||||
// field accesses of the contained type via Deref
|
||||
_value: &'b mut T,
|
||||
@@ -590,7 +592,7 @@ pub struct RefMut<'b, T:'b> {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<'b, T> Deref for RefMut<'b, T> {
|
||||
impl<'b, T: ?Sized> Deref for RefMut<'b, T> {
|
||||
type Target = T;
|
||||
|
||||
#[inline]
|
||||
@@ -600,7 +602,7 @@ impl<'b, T> Deref for RefMut<'b, T> {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<'b, T> DerefMut for RefMut<'b, T> {
|
||||
impl<'b, T: ?Sized> DerefMut for RefMut<'b, T> {
|
||||
#[inline]
|
||||
fn deref_mut<'a>(&'a mut self) -> &'a mut T {
|
||||
self._value
|
||||
@@ -633,7 +635,7 @@ impl<'b, T> DerefMut for RefMut<'b, T> {
|
||||
/// recommended to access its fields directly, `get` should be used instead.
|
||||
#[lang="unsafe_cell"]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub struct UnsafeCell<T> {
|
||||
pub struct UnsafeCell<T: ?Sized> {
|
||||
/// Wrapped value
|
||||
///
|
||||
/// This field should not be accessed directly, it is made public for static
|
||||
@@ -642,7 +644,7 @@ pub struct UnsafeCell<T> {
|
||||
pub value: T,
|
||||
}
|
||||
|
||||
impl<T> !Sync for UnsafeCell<T> {}
|
||||
impl<T: ?Sized> !Sync for UnsafeCell<T> {}
|
||||
|
||||
impl<T> UnsafeCell<T> {
|
||||
/// Constructs a new instance of `UnsafeCell` which will wrap the specified
|
||||
@@ -664,25 +666,6 @@ impl<T> UnsafeCell<T> {
|
||||
UnsafeCell { value: value }
|
||||
}
|
||||
|
||||
/// Gets a mutable pointer to the wrapped value.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::cell::UnsafeCell;
|
||||
///
|
||||
/// let uc = UnsafeCell::new(5);
|
||||
///
|
||||
/// let five = uc.get();
|
||||
/// ```
|
||||
#[inline]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn get(&self) -> *mut T {
|
||||
// FIXME(#23542) Replace with type ascription.
|
||||
#![allow(trivial_casts)]
|
||||
&self.value as *const T as *mut T
|
||||
}
|
||||
|
||||
/// Unwraps the value.
|
||||
///
|
||||
/// # Unsafety
|
||||
@@ -703,3 +686,25 @@ impl<T> UnsafeCell<T> {
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub unsafe fn into_inner(self) -> T { self.value }
|
||||
}
|
||||
|
||||
impl<T: ?Sized> UnsafeCell<T> {
|
||||
/// Gets a mutable pointer to the wrapped value.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::cell::UnsafeCell;
|
||||
///
|
||||
/// let uc = UnsafeCell::new(5);
|
||||
///
|
||||
/// let five = uc.get();
|
||||
/// ```
|
||||
#[inline]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn get(&self) -> *mut T {
|
||||
// FIXME(#23542) Replace with type ascription.
|
||||
#![allow(trivial_casts)]
|
||||
&self.value as *const T as *mut T
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1062,7 +1062,7 @@ impl<T: Copy + Debug> Debug for Cell<T> {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: Debug> Debug for RefCell<T> {
|
||||
impl<T: ?Sized + Debug> Debug for RefCell<T> {
|
||||
fn fmt(&self, f: &mut Formatter) -> Result {
|
||||
match self.borrow_state() {
|
||||
BorrowState::Unused | BorrowState::Reading => {
|
||||
@@ -1074,14 +1074,14 @@ impl<T: Debug> Debug for RefCell<T> {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<'b, T: Debug> Debug for Ref<'b, T> {
|
||||
impl<'b, T: ?Sized + Debug> Debug for Ref<'b, T> {
|
||||
fn fmt(&self, f: &mut Formatter) -> Result {
|
||||
Debug::fmt(&**self, f)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<'b, T: Debug> Debug for RefMut<'b, T> {
|
||||
impl<'b, T: ?Sized + Debug> Debug for RefMut<'b, T> {
|
||||
fn fmt(&self, f: &mut Formatter) -> Result {
|
||||
Debug::fmt(&*(self.deref()), f)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user