rustfmt liballoc
This commit is contained in:
@@ -214,7 +214,9 @@ impl<T> Arc<T> {
|
|||||||
#[stable(feature = "arc_unique", since = "1.4.0")]
|
#[stable(feature = "arc_unique", since = "1.4.0")]
|
||||||
pub fn try_unwrap(this: Self) -> Result<T, Self> {
|
pub fn try_unwrap(this: Self) -> Result<T, Self> {
|
||||||
// See `drop` for why all these atomics are like this
|
// See `drop` for why all these atomics are like this
|
||||||
if this.inner().strong.compare_and_swap(1, 0, Release) != 1 { return Err(this) }
|
if this.inner().strong.compare_and_swap(1, 0, Release) != 1 {
|
||||||
|
return Err(this)
|
||||||
|
}
|
||||||
|
|
||||||
atomic::fence(Acquire);
|
atomic::fence(Acquire);
|
||||||
|
|
||||||
@@ -251,7 +253,9 @@ impl<T: ?Sized> Arc<T> {
|
|||||||
let cur = this.inner().weak.load(Relaxed);
|
let cur = this.inner().weak.load(Relaxed);
|
||||||
|
|
||||||
// check if the weak counter is currently "locked"; if so, spin.
|
// check if the weak counter is currently "locked"; if so, spin.
|
||||||
if cur == usize::MAX { continue }
|
if cur == usize::MAX {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE: this code currently ignores the possibility of overflow
|
// NOTE: this code currently ignores the possibility of overflow
|
||||||
// into usize::MAX; in general both Rc and Arc need to be adjusted
|
// into usize::MAX; in general both Rc and Arc need to be adjusted
|
||||||
@@ -348,7 +352,9 @@ impl<T: ?Sized> Clone for Arc<T> {
|
|||||||
// We abort because such a program is incredibly degenerate, and we
|
// We abort because such a program is incredibly degenerate, and we
|
||||||
// don't care to support it.
|
// don't care to support it.
|
||||||
if old_size > MAX_REFCOUNT {
|
if old_size > MAX_REFCOUNT {
|
||||||
unsafe { abort(); }
|
unsafe {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Arc { _ptr: self._ptr }
|
Arc { _ptr: self._ptr }
|
||||||
@@ -556,7 +562,9 @@ impl<T: ?Sized> Drop for Arc<T> {
|
|||||||
// Because `fetch_sub` is already atomic, we do not need to synchronize
|
// Because `fetch_sub` is already atomic, we do not need to synchronize
|
||||||
// with other threads unless we are going to delete the object. This
|
// with other threads unless we are going to delete the object. This
|
||||||
// same logic applies to the below `fetch_sub` to the `weak` count.
|
// same logic applies to the below `fetch_sub` to the `weak` count.
|
||||||
if self.inner().strong.fetch_sub(1, Release) != 1 { return }
|
if self.inner().strong.fetch_sub(1, Release) != 1 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// This fence is needed to prevent reordering of use of the data and
|
// This fence is needed to prevent reordering of use of the data and
|
||||||
// deletion of the data. Because it is marked `Release`, the decreasing
|
// deletion of the data. Because it is marked `Release`, the decreasing
|
||||||
@@ -577,9 +585,7 @@ impl<T: ?Sized> Drop for Arc<T> {
|
|||||||
// [1]: (www.boost.org/doc/libs/1_55_0/doc/html/atomic/usage_examples.html)
|
// [1]: (www.boost.org/doc/libs/1_55_0/doc/html/atomic/usage_examples.html)
|
||||||
atomic::fence(Acquire);
|
atomic::fence(Acquire);
|
||||||
|
|
||||||
unsafe {
|
unsafe { self.drop_slow() }
|
||||||
self.drop_slow()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -613,11 +619,15 @@ impl<T: ?Sized> Weak<T> {
|
|||||||
// "stale" read of 0 is fine), and any other value is
|
// "stale" read of 0 is fine), and any other value is
|
||||||
// confirmed via the CAS below.
|
// confirmed via the CAS below.
|
||||||
let n = inner.strong.load(Relaxed);
|
let n = inner.strong.load(Relaxed);
|
||||||
if n == 0 { return None }
|
if n == 0 {
|
||||||
|
return None
|
||||||
|
}
|
||||||
|
|
||||||
// Relaxed is valid for the same reason it is on Arc's Clone impl
|
// Relaxed is valid for the same reason it is on Arc's Clone impl
|
||||||
let old = inner.strong.compare_and_swap(n, n + 1, Relaxed);
|
let old = inner.strong.compare_and_swap(n, n + 1, Relaxed);
|
||||||
if old == n { return Some(Arc { _ptr: self._ptr }) }
|
if old == n {
|
||||||
|
return Some(Arc { _ptr: self._ptr })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -653,7 +663,9 @@ impl<T: ?Sized> Clone for Weak<T> {
|
|||||||
|
|
||||||
// See comments in Arc::clone() for why we do this (for mem::forget).
|
// See comments in Arc::clone() for why we do this (for mem::forget).
|
||||||
if old_size > MAX_REFCOUNT {
|
if old_size > MAX_REFCOUNT {
|
||||||
unsafe { abort(); }
|
unsafe {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Weak { _ptr: self._ptr }
|
return Weak { _ptr: self._ptr }
|
||||||
@@ -705,9 +717,7 @@ impl<T: ?Sized> Drop for Weak<T> {
|
|||||||
// ref, which can only happen after the lock is released.
|
// ref, which can only happen after the lock is released.
|
||||||
if self.inner().weak.fetch_sub(1, Release) == 1 {
|
if self.inner().weak.fetch_sub(1, Release) == 1 {
|
||||||
atomic::fence(Acquire);
|
atomic::fence(Acquire);
|
||||||
unsafe { deallocate(ptr as *mut u8,
|
unsafe { deallocate(ptr as *mut u8, size_of_val(&*ptr), align_of_val(&*ptr)) }
|
||||||
size_of_val(&*ptr),
|
|
||||||
align_of_val(&*ptr)) }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -727,7 +737,9 @@ impl<T: ?Sized + PartialEq> PartialEq for Arc<T> {
|
|||||||
///
|
///
|
||||||
/// five == Arc::new(5);
|
/// five == Arc::new(5);
|
||||||
/// ```
|
/// ```
|
||||||
fn eq(&self, other: &Arc<T>) -> bool { *(*self) == *(*other) }
|
fn eq(&self, other: &Arc<T>) -> bool {
|
||||||
|
*(*self) == *(*other)
|
||||||
|
}
|
||||||
|
|
||||||
/// Inequality for two `Arc<T>`s.
|
/// Inequality for two `Arc<T>`s.
|
||||||
///
|
///
|
||||||
@@ -742,7 +754,9 @@ impl<T: ?Sized + PartialEq> PartialEq for Arc<T> {
|
|||||||
///
|
///
|
||||||
/// five != Arc::new(5);
|
/// five != Arc::new(5);
|
||||||
/// ```
|
/// ```
|
||||||
fn ne(&self, other: &Arc<T>) -> bool { *(*self) != *(*other) }
|
fn ne(&self, other: &Arc<T>) -> bool {
|
||||||
|
*(*self) != *(*other)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: ?Sized + PartialOrd> PartialOrd for Arc<T> {
|
impl<T: ?Sized + PartialOrd> PartialOrd for Arc<T> {
|
||||||
@@ -776,7 +790,9 @@ impl<T: ?Sized + PartialOrd> PartialOrd for Arc<T> {
|
|||||||
///
|
///
|
||||||
/// five < Arc::new(5);
|
/// five < Arc::new(5);
|
||||||
/// ```
|
/// ```
|
||||||
fn lt(&self, other: &Arc<T>) -> bool { *(*self) < *(*other) }
|
fn lt(&self, other: &Arc<T>) -> bool {
|
||||||
|
*(*self) < *(*other)
|
||||||
|
}
|
||||||
|
|
||||||
/// 'Less-than or equal to' comparison for two `Arc<T>`s.
|
/// 'Less-than or equal to' comparison for two `Arc<T>`s.
|
||||||
///
|
///
|
||||||
@@ -791,7 +807,9 @@ impl<T: ?Sized + PartialOrd> PartialOrd for Arc<T> {
|
|||||||
///
|
///
|
||||||
/// five <= Arc::new(5);
|
/// five <= Arc::new(5);
|
||||||
/// ```
|
/// ```
|
||||||
fn le(&self, other: &Arc<T>) -> bool { *(*self) <= *(*other) }
|
fn le(&self, other: &Arc<T>) -> bool {
|
||||||
|
*(*self) <= *(*other)
|
||||||
|
}
|
||||||
|
|
||||||
/// Greater-than comparison for two `Arc<T>`s.
|
/// Greater-than comparison for two `Arc<T>`s.
|
||||||
///
|
///
|
||||||
@@ -806,7 +824,9 @@ impl<T: ?Sized + PartialOrd> PartialOrd for Arc<T> {
|
|||||||
///
|
///
|
||||||
/// five > Arc::new(5);
|
/// five > Arc::new(5);
|
||||||
/// ```
|
/// ```
|
||||||
fn gt(&self, other: &Arc<T>) -> bool { *(*self) > *(*other) }
|
fn gt(&self, other: &Arc<T>) -> bool {
|
||||||
|
*(*self) > *(*other)
|
||||||
|
}
|
||||||
|
|
||||||
/// 'Greater-than or equal to' comparison for two `Arc<T>`s.
|
/// 'Greater-than or equal to' comparison for two `Arc<T>`s.
|
||||||
///
|
///
|
||||||
@@ -821,11 +841,15 @@ impl<T: ?Sized + PartialOrd> PartialOrd for Arc<T> {
|
|||||||
///
|
///
|
||||||
/// five >= Arc::new(5);
|
/// five >= Arc::new(5);
|
||||||
/// ```
|
/// ```
|
||||||
fn ge(&self, other: &Arc<T>) -> bool { *(*self) >= *(*other) }
|
fn ge(&self, other: &Arc<T>) -> bool {
|
||||||
|
*(*self) >= *(*other)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: ?Sized + Ord> Ord for Arc<T> {
|
impl<T: ?Sized + Ord> Ord for Arc<T> {
|
||||||
fn cmp(&self, other: &Arc<T>) -> Ordering { (**self).cmp(&**other) }
|
fn cmp(&self, other: &Arc<T>) -> Ordering {
|
||||||
|
(**self).cmp(&**other)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: ?Sized + Eq> Eq for Arc<T> {}
|
impl<T: ?Sized + Eq> Eq for Arc<T> {}
|
||||||
@@ -854,7 +878,9 @@ impl<T> fmt::Pointer for Arc<T> {
|
|||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: Default> Default for Arc<T> {
|
impl<T: Default> Default for Arc<T> {
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn default() -> Arc<T> { Arc::new(Default::default()) }
|
fn default() -> Arc<T> {
|
||||||
|
Arc::new(Default::default())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
@@ -1015,7 +1041,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn weak_self_cyclic() {
|
fn weak_self_cyclic() {
|
||||||
struct Cycle {
|
struct Cycle {
|
||||||
x: Mutex<Option<Weak<Cycle>>>
|
x: Mutex<Option<Weak<Cycle>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
let a = Arc::new(Cycle { x: Mutex::new(None) });
|
let a = Arc::new(Cycle { x: Mutex::new(None) });
|
||||||
@@ -1095,7 +1121,9 @@ mod tests {
|
|||||||
|
|
||||||
// Make sure deriving works with Arc<T>
|
// Make sure deriving works with Arc<T>
|
||||||
#[derive(Eq, Ord, PartialEq, PartialOrd, Clone, Debug, Default)]
|
#[derive(Eq, Ord, PartialEq, PartialOrd, Clone, Debug, Default)]
|
||||||
struct Foo { inner: Arc<i32> }
|
struct Foo {
|
||||||
|
inner: Arc<i32>,
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_unsized() {
|
fn test_unsized() {
|
||||||
@@ -1108,5 +1136,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T: ?Sized> borrow::Borrow<T> for Arc<T> {
|
impl<T: ?Sized> borrow::Borrow<T> for Arc<T> {
|
||||||
fn borrow(&self) -> &T { &**self }
|
fn borrow(&self) -> &T {
|
||||||
|
&**self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ use core::mem;
|
|||||||
use core::ops::{CoerceUnsized, Deref, DerefMut};
|
use core::ops::{CoerceUnsized, Deref, DerefMut};
|
||||||
use core::ops::{Placer, Boxed, Place, InPlace, BoxPlace};
|
use core::ops::{Placer, Boxed, Place, InPlace, BoxPlace};
|
||||||
use core::ptr::{self, Unique};
|
use core::ptr::{self, Unique};
|
||||||
use core::raw::{TraitObject};
|
use core::raw::TraitObject;
|
||||||
|
|
||||||
/// A value that represents the heap. This is the default place that the `box`
|
/// A value that represents the heap. This is the default place that the `box`
|
||||||
/// keyword allocates into when no place is supplied.
|
/// keyword allocates into when no place is supplied.
|
||||||
@@ -96,7 +96,9 @@ pub const HEAP: ExchangeHeapSingleton =
|
|||||||
reason = "may be renamed; uncertain about custom allocator design",
|
reason = "may be renamed; uncertain about custom allocator design",
|
||||||
issue = "27779")]
|
issue = "27779")]
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct ExchangeHeapSingleton { _force_singleton: () }
|
pub struct ExchangeHeapSingleton {
|
||||||
|
_force_singleton: (),
|
||||||
|
}
|
||||||
|
|
||||||
/// A pointer type for heap allocation.
|
/// A pointer type for heap allocation.
|
||||||
///
|
///
|
||||||
@@ -127,7 +129,7 @@ pub struct Box<T: ?Sized>(Unique<T>);
|
|||||||
#[unstable(feature = "placement_in",
|
#[unstable(feature = "placement_in",
|
||||||
reason = "placement box design is still being worked out.",
|
reason = "placement box design is still being worked out.",
|
||||||
issue = "27779")]
|
issue = "27779")]
|
||||||
pub struct IntermediateBox<T: ?Sized>{
|
pub struct IntermediateBox<T: ?Sized> {
|
||||||
ptr: *mut u8,
|
ptr: *mut u8,
|
||||||
size: usize,
|
size: usize,
|
||||||
align: usize,
|
align: usize,
|
||||||
@@ -153,9 +155,7 @@ fn make_place<T>() -> IntermediateBox<T> {
|
|||||||
let p = if size == 0 {
|
let p = if size == 0 {
|
||||||
heap::EMPTY as *mut u8
|
heap::EMPTY as *mut u8
|
||||||
} else {
|
} else {
|
||||||
let p = unsafe {
|
let p = unsafe { heap::allocate(size, align) };
|
||||||
heap::allocate(size, align)
|
|
||||||
};
|
|
||||||
if p.is_null() {
|
if p.is_null() {
|
||||||
panic!("Box make_place allocation failure.");
|
panic!("Box make_place allocation failure.");
|
||||||
}
|
}
|
||||||
@@ -166,18 +166,24 @@ fn make_place<T>() -> IntermediateBox<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T> BoxPlace<T> for IntermediateBox<T> {
|
impl<T> BoxPlace<T> for IntermediateBox<T> {
|
||||||
fn make_place() -> IntermediateBox<T> { make_place() }
|
fn make_place() -> IntermediateBox<T> {
|
||||||
|
make_place()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> InPlace<T> for IntermediateBox<T> {
|
impl<T> InPlace<T> for IntermediateBox<T> {
|
||||||
type Owner = Box<T>;
|
type Owner = Box<T>;
|
||||||
unsafe fn finalize(self) -> Box<T> { finalize(self) }
|
unsafe fn finalize(self) -> Box<T> {
|
||||||
|
finalize(self)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Boxed for Box<T> {
|
impl<T> Boxed for Box<T> {
|
||||||
type Data = T;
|
type Data = T;
|
||||||
type Place = IntermediateBox<T>;
|
type Place = IntermediateBox<T>;
|
||||||
unsafe fn finalize(b: IntermediateBox<T>) -> Box<T> { finalize(b) }
|
unsafe fn finalize(b: IntermediateBox<T>) -> Box<T> {
|
||||||
|
finalize(b)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Placer<T> for ExchangeHeapSingleton {
|
impl<T> Placer<T> for ExchangeHeapSingleton {
|
||||||
@@ -191,9 +197,7 @@ impl<T> Placer<T> for ExchangeHeapSingleton {
|
|||||||
impl<T: ?Sized> Drop for IntermediateBox<T> {
|
impl<T: ?Sized> Drop for IntermediateBox<T> {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
if self.size > 0 {
|
if self.size > 0 {
|
||||||
unsafe {
|
unsafe { heap::deallocate(self.ptr, self.size, self.align) }
|
||||||
heap::deallocate(self.ptr, self.size, self.align)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -257,13 +261,17 @@ impl<T : ?Sized> Box<T> {
|
|||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: Default> Default for Box<T> {
|
impl<T: Default> Default for Box<T> {
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn default() -> Box<T> { box Default::default() }
|
fn default() -> Box<T> {
|
||||||
|
box Default::default()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T> Default for Box<[T]> {
|
impl<T> Default for Box<[T]> {
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn default() -> Box<[T]> { Box::<[T; 0]>::new([]) }
|
fn default() -> Box<[T]> {
|
||||||
|
Box::<[T; 0]>::new([])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
@@ -277,7 +285,11 @@ impl<T: Clone> Clone for Box<T> {
|
|||||||
/// let y = x.clone();
|
/// let y = x.clone();
|
||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
fn clone(&self) -> Box<T> { box {(**self).clone()} }
|
fn clone(&self) -> Box<T> {
|
||||||
|
box {
|
||||||
|
(**self).clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
/// Copies `source`'s contents into `self` without creating a new allocation.
|
/// Copies `source`'s contents into `self` without creating a new allocation.
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
@@ -312,9 +324,13 @@ impl Clone for Box<str> {
|
|||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: ?Sized + PartialEq> PartialEq for Box<T> {
|
impl<T: ?Sized + PartialEq> PartialEq for Box<T> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn eq(&self, other: &Box<T>) -> bool { PartialEq::eq(&**self, &**other) }
|
fn eq(&self, other: &Box<T>) -> bool {
|
||||||
|
PartialEq::eq(&**self, &**other)
|
||||||
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn ne(&self, other: &Box<T>) -> bool { PartialEq::ne(&**self, &**other) }
|
fn ne(&self, other: &Box<T>) -> bool {
|
||||||
|
PartialEq::ne(&**self, &**other)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: ?Sized + PartialOrd> PartialOrd for Box<T> {
|
impl<T: ?Sized + PartialOrd> PartialOrd for Box<T> {
|
||||||
@@ -323,13 +339,21 @@ impl<T: ?Sized + PartialOrd> PartialOrd for Box<T> {
|
|||||||
PartialOrd::partial_cmp(&**self, &**other)
|
PartialOrd::partial_cmp(&**self, &**other)
|
||||||
}
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn lt(&self, other: &Box<T>) -> bool { PartialOrd::lt(&**self, &**other) }
|
fn lt(&self, other: &Box<T>) -> bool {
|
||||||
|
PartialOrd::lt(&**self, &**other)
|
||||||
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn le(&self, other: &Box<T>) -> bool { PartialOrd::le(&**self, &**other) }
|
fn le(&self, other: &Box<T>) -> bool {
|
||||||
|
PartialOrd::le(&**self, &**other)
|
||||||
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn ge(&self, other: &Box<T>) -> bool { PartialOrd::ge(&**self, &**other) }
|
fn ge(&self, other: &Box<T>) -> bool {
|
||||||
|
PartialOrd::ge(&**self, &**other)
|
||||||
|
}
|
||||||
#[inline]
|
#[inline]
|
||||||
fn gt(&self, other: &Box<T>) -> bool { PartialOrd::gt(&**self, &**other) }
|
fn gt(&self, other: &Box<T>) -> bool {
|
||||||
|
PartialOrd::gt(&**self, &**other)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: ?Sized + Ord> Ord for Box<T> {
|
impl<T: ?Sized + Ord> Ord for Box<T> {
|
||||||
@@ -357,8 +381,7 @@ impl Box<Any> {
|
|||||||
unsafe {
|
unsafe {
|
||||||
// Get the raw representation of the trait object
|
// Get the raw representation of the trait object
|
||||||
let raw = Box::into_raw(self);
|
let raw = Box::into_raw(self);
|
||||||
let to: TraitObject =
|
let to: TraitObject = mem::transmute::<*mut Any, TraitObject>(raw);
|
||||||
mem::transmute::<*mut Any, TraitObject>(raw);
|
|
||||||
|
|
||||||
// Extract the data pointer
|
// Extract the data pointer
|
||||||
Ok(Box::from_raw(to.data as *mut T))
|
Ok(Box::from_raw(to.data as *mut T))
|
||||||
@@ -409,23 +432,33 @@ impl<T> fmt::Pointer for Box<T> {
|
|||||||
impl<T: ?Sized> Deref for Box<T> {
|
impl<T: ?Sized> Deref for Box<T> {
|
||||||
type Target = T;
|
type Target = T;
|
||||||
|
|
||||||
fn deref(&self) -> &T { &**self }
|
fn deref(&self) -> &T {
|
||||||
|
&**self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: ?Sized> DerefMut for Box<T> {
|
impl<T: ?Sized> DerefMut for Box<T> {
|
||||||
fn deref_mut(&mut self) -> &mut T { &mut **self }
|
fn deref_mut(&mut self) -> &mut T {
|
||||||
|
&mut **self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<I: Iterator + ?Sized> Iterator for Box<I> {
|
impl<I: Iterator + ?Sized> Iterator for Box<I> {
|
||||||
type Item = I::Item;
|
type Item = I::Item;
|
||||||
fn next(&mut self) -> Option<I::Item> { (**self).next() }
|
fn next(&mut self) -> Option<I::Item> {
|
||||||
fn size_hint(&self) -> (usize, Option<usize>) { (**self).size_hint() }
|
(**self).next()
|
||||||
|
}
|
||||||
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||||
|
(**self).size_hint()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<I: DoubleEndedIterator + ?Sized> DoubleEndedIterator for Box<I> {
|
impl<I: DoubleEndedIterator + ?Sized> DoubleEndedIterator for Box<I> {
|
||||||
fn next_back(&mut self) -> Option<I::Item> { (**self).next_back() }
|
fn next_back(&mut self) -> Option<I::Item> {
|
||||||
|
(**self).next_back()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<I: ExactSizeIterator + ?Sized> ExactSizeIterator for Box<I> {}
|
impl<I: ExactSizeIterator + ?Sized> ExactSizeIterator for Box<I> {}
|
||||||
@@ -507,10 +540,7 @@ impl<T: ?Sized+Unsize<U>, U: ?Sized> CoerceUnsized<Box<U>> for Box<T> {}
|
|||||||
#[stable(feature = "box_slice_clone", since = "1.3.0")]
|
#[stable(feature = "box_slice_clone", since = "1.3.0")]
|
||||||
impl<T: Clone> Clone for Box<[T]> {
|
impl<T: Clone> Clone for Box<[T]> {
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
let mut new = BoxBuilder {
|
let mut new = BoxBuilder { data: RawVec::with_capacity(self.len()), len: 0 };
|
||||||
data: RawVec::with_capacity(self.len()),
|
|
||||||
len: 0
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut target = new.data.ptr();
|
let mut target = new.data.ptr();
|
||||||
|
|
||||||
@@ -556,9 +586,13 @@ impl<T: Clone> Clone for Box<[T]> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T: ?Sized> borrow::Borrow<T> for Box<T> {
|
impl<T: ?Sized> borrow::Borrow<T> for Box<T> {
|
||||||
fn borrow(&self) -> &T { &**self }
|
fn borrow(&self) -> &T {
|
||||||
|
&**self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: ?Sized> borrow::BorrowMut<T> for Box<T> {
|
impl<T: ?Sized> borrow::BorrowMut<T> for Box<T> {
|
||||||
fn borrow_mut(&mut self) -> &mut T { &mut **self }
|
fn borrow_mut(&mut self) -> &mut T {
|
||||||
|
&mut **self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,12 +34,16 @@ fn any_move() {
|
|||||||
let b = Box::new(Test) as Box<Any>;
|
let b = Box::new(Test) as Box<Any>;
|
||||||
|
|
||||||
match a.downcast::<i32>() {
|
match a.downcast::<i32>() {
|
||||||
Ok(a) => { assert!(a == Box::new(8)); }
|
Ok(a) => {
|
||||||
Err(..) => panic!()
|
assert!(a == Box::new(8));
|
||||||
|
}
|
||||||
|
Err(..) => panic!(),
|
||||||
}
|
}
|
||||||
match b.downcast::<Test>() {
|
match b.downcast::<Test>() {
|
||||||
Ok(a) => { assert!(a == Box::new(Test)); }
|
Ok(a) => {
|
||||||
Err(..) => panic!()
|
assert!(a == Box::new(Test));
|
||||||
|
}
|
||||||
|
Err(..) => panic!(),
|
||||||
}
|
}
|
||||||
|
|
||||||
let a = Box::new(8) as Box<Any>;
|
let a = Box::new(8) as Box<Any>;
|
||||||
@@ -70,7 +74,8 @@ fn test_show() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn deref() {
|
fn deref() {
|
||||||
fn homura<T: Deref<Target=i32>>(_: T) { }
|
fn homura<T: Deref<Target = i32>>(_: T) {
|
||||||
|
}
|
||||||
homura(Box::new(765));
|
homura(Box::new(765));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,10 +22,12 @@ extern {
|
|||||||
#[allocator]
|
#[allocator]
|
||||||
fn __rust_allocate(size: usize, align: usize) -> *mut u8;
|
fn __rust_allocate(size: usize, align: usize) -> *mut u8;
|
||||||
fn __rust_deallocate(ptr: *mut u8, old_size: usize, align: usize);
|
fn __rust_deallocate(ptr: *mut u8, old_size: usize, align: usize);
|
||||||
fn __rust_reallocate(ptr: *mut u8, old_size: usize, size: usize,
|
fn __rust_reallocate(ptr: *mut u8, old_size: usize, size: usize, align: usize) -> *mut u8;
|
||||||
align: usize) -> *mut u8;
|
fn __rust_reallocate_inplace(ptr: *mut u8,
|
||||||
fn __rust_reallocate_inplace(ptr: *mut u8, old_size: usize, size: usize,
|
old_size: usize,
|
||||||
align: usize) -> usize;
|
size: usize,
|
||||||
|
align: usize)
|
||||||
|
-> usize;
|
||||||
fn __rust_usable_size(size: usize, align: usize) -> usize;
|
fn __rust_usable_size(size: usize, align: usize) -> usize;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,8 +86,11 @@ pub unsafe fn reallocate(ptr: *mut u8, old_size: usize, size: usize, align: usiz
|
|||||||
/// create the allocation referenced by `ptr`. The `old_size` parameter may be
|
/// create the allocation referenced by `ptr`. The `old_size` parameter may be
|
||||||
/// any value in range_inclusive(requested_size, usable_size).
|
/// any value in range_inclusive(requested_size, usable_size).
|
||||||
#[inline]
|
#[inline]
|
||||||
pub unsafe fn reallocate_inplace(ptr: *mut u8, old_size: usize, size: usize,
|
pub unsafe fn reallocate_inplace(ptr: *mut u8,
|
||||||
align: usize) -> usize {
|
old_size: usize,
|
||||||
|
size: usize,
|
||||||
|
align: usize)
|
||||||
|
-> usize {
|
||||||
check_size_and_alignment(size, align);
|
check_size_and_alignment(size, align);
|
||||||
__rust_reallocate_inplace(ptr, old_size, size, align)
|
__rust_reallocate_inplace(ptr, old_size, size, align)
|
||||||
}
|
}
|
||||||
@@ -124,7 +129,9 @@ unsafe fn exchange_malloc(size: usize, align: usize) -> *mut u8 {
|
|||||||
EMPTY as *mut u8
|
EMPTY as *mut u8
|
||||||
} else {
|
} else {
|
||||||
let ptr = allocate(size, align);
|
let ptr = allocate(size, align);
|
||||||
if ptr.is_null() { ::oom() }
|
if ptr.is_null() {
|
||||||
|
::oom()
|
||||||
|
}
|
||||||
ptr
|
ptr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -148,7 +155,9 @@ mod tests {
|
|||||||
unsafe {
|
unsafe {
|
||||||
let size = 4000;
|
let size = 4000;
|
||||||
let ptr = heap::allocate(size, 8);
|
let ptr = heap::allocate(size, 8);
|
||||||
if ptr.is_null() { ::oom() }
|
if ptr.is_null() {
|
||||||
|
::oom()
|
||||||
|
}
|
||||||
let ret = heap::reallocate_inplace(ptr, size, size, 8);
|
let ret = heap::reallocate_inplace(ptr, size, size, 8);
|
||||||
heap::deallocate(ptr, size, 8);
|
heap::deallocate(ptr, size, 8);
|
||||||
assert_eq!(ret, heap::usable_size(size, 8));
|
assert_eq!(ret, heap::usable_size(size, 8));
|
||||||
|
|||||||
@@ -107,8 +107,12 @@ extern crate alloc_system;
|
|||||||
|
|
||||||
// Allow testing this library
|
// Allow testing this library
|
||||||
|
|
||||||
#[cfg(test)] #[macro_use] extern crate std;
|
#[cfg(test)]
|
||||||
#[cfg(test)] #[macro_use] extern crate log;
|
#[macro_use]
|
||||||
|
extern crate std;
|
||||||
|
#[cfg(test)]
|
||||||
|
#[macro_use]
|
||||||
|
extern crate log;
|
||||||
|
|
||||||
// Heaps provided for low-level allocation strategies
|
// Heaps provided for low-level allocation strategies
|
||||||
|
|
||||||
@@ -123,7 +127,9 @@ pub mod heap;
|
|||||||
#[cfg(not(test))]
|
#[cfg(not(test))]
|
||||||
pub mod boxed;
|
pub mod boxed;
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod boxed { pub use std::boxed::{Box, HEAP}; }
|
mod boxed {
|
||||||
|
pub use std::boxed::{Box, HEAP};
|
||||||
|
}
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod boxed_test;
|
mod boxed_test;
|
||||||
pub mod arc;
|
pub mod arc;
|
||||||
|
|||||||
@@ -58,7 +58,11 @@ impl<T> RawVec<T> {
|
|||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
unsafe {
|
unsafe {
|
||||||
// !0 is usize::MAX. This branch should be stripped at compile time.
|
// !0 is usize::MAX. This branch should be stripped at compile time.
|
||||||
let cap = if mem::size_of::<T>() == 0 { !0 } else { 0 };
|
let cap = if mem::size_of::<T>() == 0 {
|
||||||
|
!0
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
// heap::EMPTY doubles as "unallocated" and "zero-sized allocation"
|
// heap::EMPTY doubles as "unallocated" and "zero-sized allocation"
|
||||||
RawVec { ptr: Unique::new(heap::EMPTY as *mut T), cap: cap }
|
RawVec { ptr: Unique::new(heap::EMPTY as *mut T), cap: cap }
|
||||||
@@ -92,7 +96,9 @@ impl<T> RawVec<T> {
|
|||||||
} else {
|
} else {
|
||||||
let align = mem::align_of::<T>();
|
let align = mem::align_of::<T>();
|
||||||
let ptr = heap::allocate(alloc_size, align);
|
let ptr = heap::allocate(alloc_size, align);
|
||||||
if ptr.is_null() { oom() }
|
if ptr.is_null() {
|
||||||
|
oom()
|
||||||
|
}
|
||||||
ptr
|
ptr
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -133,7 +139,11 @@ impl<T> RawVec<T> {
|
|||||||
///
|
///
|
||||||
/// This will always be `usize::MAX` if `T` is zero-sized.
|
/// This will always be `usize::MAX` if `T` is zero-sized.
|
||||||
pub fn cap(&self) -> usize {
|
pub fn cap(&self) -> usize {
|
||||||
if mem::size_of::<T>() == 0 { !0 } else { self.cap }
|
if mem::size_of::<T>() == 0 {
|
||||||
|
!0
|
||||||
|
} else {
|
||||||
|
self.cap
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Doubles the size of the type's backing allocation. This is common enough
|
/// Doubles the size of the type's backing allocation. This is common enough
|
||||||
@@ -190,7 +200,11 @@ impl<T> RawVec<T> {
|
|||||||
|
|
||||||
let (new_cap, ptr) = if self.cap == 0 {
|
let (new_cap, ptr) = if self.cap == 0 {
|
||||||
// skip to 4 because tiny Vec's are dumb; but not if that would cause overflow
|
// skip to 4 because tiny Vec's are dumb; but not if that would cause overflow
|
||||||
let new_cap = if elem_size > (!0) / 8 { 1 } else { 4 };
|
let new_cap = if elem_size > (!0) / 8 {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
4
|
||||||
|
};
|
||||||
let ptr = heap::allocate(new_cap * elem_size, align);
|
let ptr = heap::allocate(new_cap * elem_size, align);
|
||||||
(new_cap, ptr)
|
(new_cap, ptr)
|
||||||
} else {
|
} else {
|
||||||
@@ -207,7 +221,9 @@ impl<T> RawVec<T> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// If allocate or reallocate fail, we'll get `null` back
|
// If allocate or reallocate fail, we'll get `null` back
|
||||||
if ptr.is_null() { oom() }
|
if ptr.is_null() {
|
||||||
|
oom()
|
||||||
|
}
|
||||||
|
|
||||||
self.ptr = Unique::new(ptr as *mut _);
|
self.ptr = Unique::new(ptr as *mut _);
|
||||||
self.cap = new_cap;
|
self.cap = new_cap;
|
||||||
@@ -246,7 +262,9 @@ impl<T> RawVec<T> {
|
|||||||
|
|
||||||
// Don't actually need any more capacity.
|
// Don't actually need any more capacity.
|
||||||
// Wrapping in case they gave a bad `used_cap`.
|
// Wrapping in case they gave a bad `used_cap`.
|
||||||
if self.cap().wrapping_sub(used_cap) >= needed_extra_cap { return; }
|
if self.cap().wrapping_sub(used_cap) >= needed_extra_cap {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Nothing we can really do about these checks :(
|
// Nothing we can really do about these checks :(
|
||||||
let new_cap = used_cap.checked_add(needed_extra_cap).expect("capacity overflow");
|
let new_cap = used_cap.checked_add(needed_extra_cap).expect("capacity overflow");
|
||||||
@@ -256,14 +274,13 @@ impl<T> RawVec<T> {
|
|||||||
let ptr = if self.cap == 0 {
|
let ptr = if self.cap == 0 {
|
||||||
heap::allocate(new_alloc_size, align)
|
heap::allocate(new_alloc_size, align)
|
||||||
} else {
|
} else {
|
||||||
heap::reallocate(self.ptr() as *mut _,
|
heap::reallocate(self.ptr() as *mut _, self.cap * elem_size, new_alloc_size, align)
|
||||||
self.cap * elem_size,
|
|
||||||
new_alloc_size,
|
|
||||||
align)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// If allocate or reallocate fail, we'll get `null` back
|
// If allocate or reallocate fail, we'll get `null` back
|
||||||
if ptr.is_null() { oom() }
|
if ptr.is_null() {
|
||||||
|
oom()
|
||||||
|
}
|
||||||
|
|
||||||
self.ptr = Unique::new(ptr as *mut _);
|
self.ptr = Unique::new(ptr as *mut _);
|
||||||
self.cap = new_cap;
|
self.cap = new_cap;
|
||||||
@@ -326,7 +343,9 @@ impl<T> RawVec<T> {
|
|||||||
|
|
||||||
// Don't actually need any more capacity.
|
// Don't actually need any more capacity.
|
||||||
// Wrapping in case they give a bas `used_cap`
|
// Wrapping in case they give a bas `used_cap`
|
||||||
if self.cap().wrapping_sub(used_cap) >= needed_extra_cap { return; }
|
if self.cap().wrapping_sub(used_cap) >= needed_extra_cap {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Nothing we can really do about these checks :(
|
// Nothing we can really do about these checks :(
|
||||||
let new_cap = used_cap.checked_add(needed_extra_cap)
|
let new_cap = used_cap.checked_add(needed_extra_cap)
|
||||||
@@ -339,14 +358,13 @@ impl<T> RawVec<T> {
|
|||||||
let ptr = if self.cap == 0 {
|
let ptr = if self.cap == 0 {
|
||||||
heap::allocate(new_alloc_size, align)
|
heap::allocate(new_alloc_size, align)
|
||||||
} else {
|
} else {
|
||||||
heap::reallocate(self.ptr() as *mut _,
|
heap::reallocate(self.ptr() as *mut _, self.cap * elem_size, new_alloc_size, align)
|
||||||
self.cap * elem_size,
|
|
||||||
new_alloc_size,
|
|
||||||
align)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// If allocate or reallocate fail, we'll get `null` back
|
// If allocate or reallocate fail, we'll get `null` back
|
||||||
if ptr.is_null() { oom() }
|
if ptr.is_null() {
|
||||||
|
oom()
|
||||||
|
}
|
||||||
|
|
||||||
self.ptr = Unique::new(ptr as *mut _);
|
self.ptr = Unique::new(ptr as *mut _);
|
||||||
self.cap = new_cap;
|
self.cap = new_cap;
|
||||||
@@ -386,7 +404,9 @@ impl<T> RawVec<T> {
|
|||||||
self.cap * elem_size,
|
self.cap * elem_size,
|
||||||
amount * elem_size,
|
amount * elem_size,
|
||||||
align);
|
align);
|
||||||
if ptr.is_null() { oom() }
|
if ptr.is_null() {
|
||||||
|
oom()
|
||||||
|
}
|
||||||
self.ptr = Unique::new(ptr as *mut _);
|
self.ptr = Unique::new(ptr as *mut _);
|
||||||
}
|
}
|
||||||
self.cap = amount;
|
self.cap = amount;
|
||||||
|
|||||||
@@ -213,7 +213,7 @@ impl<T> Rc<T> {
|
|||||||
_ptr: NonZero::new(Box::into_raw(box RcBox {
|
_ptr: NonZero::new(Box::into_raw(box RcBox {
|
||||||
strong: Cell::new(1),
|
strong: Cell::new(1),
|
||||||
weak: Cell::new(1),
|
weak: Cell::new(1),
|
||||||
value: value
|
value: value,
|
||||||
})),
|
})),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -290,13 +290,17 @@ impl<T: ?Sized> Rc<T> {
|
|||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "rc_counts", reason = "not clearly useful",
|
#[unstable(feature = "rc_counts", reason = "not clearly useful",
|
||||||
issue = "28356")]
|
issue = "28356")]
|
||||||
pub fn weak_count(this: &Self) -> usize { this.weak() - 1 }
|
pub fn weak_count(this: &Self) -> usize {
|
||||||
|
this.weak() - 1
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the number of strong references to this value.
|
/// Get the number of strong references to this value.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "rc_counts", reason = "not clearly useful",
|
#[unstable(feature = "rc_counts", reason = "not clearly useful",
|
||||||
issue = "28356")]
|
issue = "28356")]
|
||||||
pub fn strong_count(this: &Self) -> usize { this.strong() }
|
pub fn strong_count(this: &Self) -> usize {
|
||||||
|
this.strong()
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if there are no other `Rc` or `Weak<T>` values that share
|
/// Returns true if there are no other `Rc` or `Weak<T>` values that share
|
||||||
/// the same inner value.
|
/// the same inner value.
|
||||||
@@ -462,9 +466,7 @@ impl<T: ?Sized> Drop for Rc<T> {
|
|||||||
self.dec_weak();
|
self.dec_weak();
|
||||||
|
|
||||||
if self.weak() == 0 {
|
if self.weak() == 0 {
|
||||||
deallocate(ptr as *mut u8,
|
deallocate(ptr as *mut u8, size_of_val(&*ptr), align_of_val(&*ptr))
|
||||||
size_of_val(&*ptr),
|
|
||||||
align_of_val(&*ptr))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -530,7 +532,9 @@ impl<T: ?Sized + PartialEq> PartialEq for Rc<T> {
|
|||||||
/// five == Rc::new(5);
|
/// five == Rc::new(5);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn eq(&self, other: &Rc<T>) -> bool { **self == **other }
|
fn eq(&self, other: &Rc<T>) -> bool {
|
||||||
|
**self == **other
|
||||||
|
}
|
||||||
|
|
||||||
/// Inequality for two `Rc<T>`s.
|
/// Inequality for two `Rc<T>`s.
|
||||||
///
|
///
|
||||||
@@ -546,7 +550,9 @@ impl<T: ?Sized + PartialEq> PartialEq for Rc<T> {
|
|||||||
/// five != Rc::new(5);
|
/// five != Rc::new(5);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn ne(&self, other: &Rc<T>) -> bool { **self != **other }
|
fn ne(&self, other: &Rc<T>) -> bool {
|
||||||
|
**self != **other
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
@@ -586,7 +592,9 @@ impl<T: ?Sized + PartialOrd> PartialOrd for Rc<T> {
|
|||||||
/// five < Rc::new(5);
|
/// five < Rc::new(5);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn lt(&self, other: &Rc<T>) -> bool { **self < **other }
|
fn lt(&self, other: &Rc<T>) -> bool {
|
||||||
|
**self < **other
|
||||||
|
}
|
||||||
|
|
||||||
/// 'Less-than or equal to' comparison for two `Rc<T>`s.
|
/// 'Less-than or equal to' comparison for two `Rc<T>`s.
|
||||||
///
|
///
|
||||||
@@ -602,7 +610,9 @@ impl<T: ?Sized + PartialOrd> PartialOrd for Rc<T> {
|
|||||||
/// five <= Rc::new(5);
|
/// five <= Rc::new(5);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn le(&self, other: &Rc<T>) -> bool { **self <= **other }
|
fn le(&self, other: &Rc<T>) -> bool {
|
||||||
|
**self <= **other
|
||||||
|
}
|
||||||
|
|
||||||
/// Greater-than comparison for two `Rc<T>`s.
|
/// Greater-than comparison for two `Rc<T>`s.
|
||||||
///
|
///
|
||||||
@@ -618,7 +628,9 @@ impl<T: ?Sized + PartialOrd> PartialOrd for Rc<T> {
|
|||||||
/// five > Rc::new(5);
|
/// five > Rc::new(5);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn gt(&self, other: &Rc<T>) -> bool { **self > **other }
|
fn gt(&self, other: &Rc<T>) -> bool {
|
||||||
|
**self > **other
|
||||||
|
}
|
||||||
|
|
||||||
/// 'Greater-than or equal to' comparison for two `Rc<T>`s.
|
/// 'Greater-than or equal to' comparison for two `Rc<T>`s.
|
||||||
///
|
///
|
||||||
@@ -634,7 +646,9 @@ impl<T: ?Sized + PartialOrd> PartialOrd for Rc<T> {
|
|||||||
/// five >= Rc::new(5);
|
/// five >= Rc::new(5);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn ge(&self, other: &Rc<T>) -> bool { **self >= **other }
|
fn ge(&self, other: &Rc<T>) -> bool {
|
||||||
|
**self >= **other
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
@@ -653,7 +667,9 @@ impl<T: ?Sized + Ord> Ord for Rc<T> {
|
|||||||
/// five.partial_cmp(&Rc::new(5));
|
/// five.partial_cmp(&Rc::new(5));
|
||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
fn cmp(&self, other: &Rc<T>) -> Ordering { (**self).cmp(&**other) }
|
fn cmp(&self, other: &Rc<T>) -> Ordering {
|
||||||
|
(**self).cmp(&**other)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
@@ -769,8 +785,7 @@ impl<T: ?Sized> Drop for Weak<T> {
|
|||||||
// the weak count starts at 1, and will only go to zero if all
|
// the weak count starts at 1, and will only go to zero if all
|
||||||
// the strong pointers have disappeared.
|
// the strong pointers have disappeared.
|
||||||
if self.weak() == 0 {
|
if self.weak() == 0 {
|
||||||
deallocate(ptr as *mut u8, size_of_val(&*ptr),
|
deallocate(ptr as *mut u8, size_of_val(&*ptr), align_of_val(&*ptr))
|
||||||
align_of_val(&*ptr))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -821,7 +836,9 @@ trait RcBoxPtr<T: ?Sized> {
|
|||||||
fn inner(&self) -> &RcBox<T>;
|
fn inner(&self) -> &RcBox<T>;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn strong(&self) -> usize { self.inner().strong.get() }
|
fn strong(&self) -> usize {
|
||||||
|
self.inner().strong.get()
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn inc_strong(&self) {
|
fn inc_strong(&self) {
|
||||||
@@ -829,10 +846,14 @@ trait RcBoxPtr<T: ?Sized> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn dec_strong(&self) { self.inner().strong.set(self.strong() - 1); }
|
fn dec_strong(&self) {
|
||||||
|
self.inner().strong.set(self.strong() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn weak(&self) -> usize { self.inner().weak.get() }
|
fn weak(&self) -> usize {
|
||||||
|
self.inner().weak.get()
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn inc_weak(&self) {
|
fn inc_weak(&self) {
|
||||||
@@ -840,7 +861,9 @@ trait RcBoxPtr<T: ?Sized> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn dec_weak(&self) { self.inner().weak.set(self.weak() - 1); }
|
fn dec_weak(&self) {
|
||||||
|
self.inner().weak.set(self.weak() - 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: ?Sized> RcBoxPtr<T> for Rc<T> {
|
impl<T: ?Sized> RcBoxPtr<T> for Rc<T> {
|
||||||
@@ -928,7 +951,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn weak_self_cyclic() {
|
fn weak_self_cyclic() {
|
||||||
struct Cycle {
|
struct Cycle {
|
||||||
x: RefCell<Option<Weak<Cycle>>>
|
x: RefCell<Option<Weak<Cycle>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
let a = Rc::new(Cycle { x: RefCell::new(None) });
|
let a = Rc::new(Cycle { x: RefCell::new(None) });
|
||||||
@@ -1086,5 +1109,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T: ?Sized> borrow::Borrow<T> for Rc<T> {
|
impl<T: ?Sized> borrow::Borrow<T> for Rc<T> {
|
||||||
fn borrow(&self) -> &T { &**self }
|
fn borrow(&self) -> &T {
|
||||||
|
&**self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user