about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2016-08-30 10:39:06 +0200
committerGitHub <noreply@github.com>2016-08-30 10:39:06 +0200
commit325b7111c2bcb9c44ed4c1ea7348a7357de23fa0 (patch)
tree82752c4bb4bc91fb371096fd0777a909cf2077e5 /src/libcore
parentb4a6b6bd9e144fc80167dc7a4f284a9d2b4f1c45 (diff)
parentf4c55dd08f8e02145d28f2ccdc07cf3e9d9ffc1b (diff)
downloadrust-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.rs49
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)
+//!        }
+//!    }
+//! }
 //! ```
 //!