diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2016-08-30 10:39:06 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-08-30 10:39:06 +0200 |
| commit | 325b7111c2bcb9c44ed4c1ea7348a7357de23fa0 (patch) | |
| tree | 82752c4bb4bc91fb371096fd0777a909cf2077e5 /src/libcore | |
| parent | b4a6b6bd9e144fc80167dc7a4f284a9d2b4f1c45 (diff) | |
| parent | f4c55dd08f8e02145d28f2ccdc07cf3e9d9ffc1b (diff) | |
| download | rust-325b7111c2bcb9c44ed4c1ea7348a7357de23fa0.tar.gz rust-325b7111c2bcb9c44ed4c1ea7348a7357de23fa0.zip | |
Rollup merge of #35895 - F001:patch-1, r=steveklabnik
Fix documentation in cell mod The implementation of Rc type in this doc is outdated.
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/cell.rs | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/src/libcore/cell.rs b/src/libcore/cell.rs index ec35198b685..f0710a1d935 100644 --- a/src/libcore/cell.rs +++ b/src/libcore/cell.rs @@ -119,26 +119,55 @@ //! `Cell<T>`. //! //! ``` +//! #![feature(core_intrinsics)] +//! #![feature(shared)] //! use std::cell::Cell; +//! use std::ptr::Shared; +//! use std::intrinsics::abort; +//! use std::intrinsics::assume; //! -//! struct Rc<T> { -//! ptr: *mut RcBox<T> +//! struct Rc<T: ?Sized> { +//! ptr: Shared<RcBox<T>> //! } //! -//! struct RcBox<T> { -//! # #[allow(dead_code)] +//! struct RcBox<T: ?Sized> { +//! strong: Cell<usize>, +//! refcount: Cell<usize>, //! value: T, -//! refcount: Cell<usize> //! } //! -//! impl<T> Clone for Rc<T> { +//! impl<T: ?Sized> Clone for Rc<T> { //! fn clone(&self) -> Rc<T> { -//! unsafe { -//! (*self.ptr).refcount.set((*self.ptr).refcount.get() + 1); -//! Rc { ptr: self.ptr } -//! } +//! self.inc_strong(); +//! Rc { ptr: self.ptr } +//! } +//! } +//! +//! trait RcBoxPtr<T: ?Sized> { +//! +//! fn inner(&self) -> &RcBox<T>; +//! +//! fn strong(&self) -> usize { +//! self.inner().strong.get() +//! } +//! +//! fn inc_strong(&self) { +//! self.inner() +//! .strong +//! .set(self.strong() +//! .checked_add(1) +//! .unwrap_or_else(|| unsafe { abort() })); //! } //! } +//! +//! impl<T: ?Sized> RcBoxPtr<T> for Rc<T> { +//! fn inner(&self) -> &RcBox<T> { +//! unsafe { +//! assume(!(*(&self.ptr as *const _ as *const *const ())).is_null()); +//! &(**self.ptr) +//! } +//! } +//! } //! ``` //! |
