diff options
| author | bors <bors@rust-lang.org> | 2017-11-20 05:58:23 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-11-20 05:58:23 +0000 |
| commit | 580298680ca6500c537662f38b4f56dab9c8c9aa (patch) | |
| tree | 8fbc6c3460ba525f89f34317f5022f887d8d4889 | |
| parent | ef94d5c1f18f067ab035ea3f1e85e7b5867ea2a4 (diff) | |
| parent | 2d02772993ebeb06547ae18b8b07abe8706aff57 (diff) | |
| download | rust-580298680ca6500c537662f38b4f56dab9c8c9aa.tar.gz rust-580298680ca6500c537662f38b4f56dab9c8c9aa.zip | |
Auto merge of #45819 - Havvy:cell, r=aturon
Add RefCell<T>::replace_with I also moved the `Panic` sections to before examples in the other two functions also under this feature gate, and changed the variable names in `replace` to be more readable. r? @rust-libs
| -rw-r--r-- | src/libcore/cell.rs | 51 |
1 files changed, 38 insertions, 13 deletions
diff --git a/src/libcore/cell.rs b/src/libcore/cell.rs index d222bf61732..d02576ae546 100644 --- a/src/libcore/cell.rs +++ b/src/libcore/cell.rs @@ -579,25 +579,51 @@ impl<T> RefCell<T> { /// /// This function corresponds to [`std::mem::replace`](../mem/fn.replace.html). /// + /// # Panics + /// + /// Panics if the value is currently borrowed. + /// /// # Examples /// /// ``` /// #![feature(refcell_replace_swap)] /// use std::cell::RefCell; - /// let c = RefCell::new(5); - /// let u = c.replace(6); - /// assert_eq!(u, 5); - /// assert_eq!(c, RefCell::new(6)); + /// let cell = RefCell::new(5); + /// let old_value = cell.replace(6); + /// assert_eq!(old_value, 5); + /// assert_eq!(cell, RefCell::new(6)); /// ``` + #[inline] + #[unstable(feature = "refcell_replace_swap", issue="43570")] + pub fn replace(&self, t: T) -> T { + mem::replace(&mut *self.borrow_mut(), t) + } + + /// Replaces the wrapped value with a new one computed from `f`, returning + /// the old value, without deinitializing either one. + /// + /// This function corresponds to [`std::mem::replace`](../mem/fn.replace.html). /// /// # Panics /// - /// This function will panic if the `RefCell` has any outstanding borrows, - /// whether or not they are full mutable borrows. + /// Panics if the value is currently borrowed. + /// + /// # Examples + /// + /// ``` + /// #![feature(refcell_replace_swap)] + /// use std::cell::RefCell; + /// let cell = RefCell::new(5); + /// let old_value = cell.replace_with(|&mut old| old + 1); + /// assert_eq!(old_value, 5); + /// assert_eq!(cell, RefCell::new(6)); + /// ``` #[inline] #[unstable(feature = "refcell_replace_swap", issue="43570")] - pub fn replace(&self, t: T) -> T { - mem::replace(&mut *self.borrow_mut(), t) + pub fn replace_with<F: FnOnce(&mut T) -> T>(&self, f: F) -> T { + let mut_borrow = &mut *self.borrow_mut(); + let replacement = f(mut_borrow); + mem::replace(mut_borrow, replacement) } /// Swaps the wrapped value of `self` with the wrapped value of `other`, @@ -605,6 +631,10 @@ impl<T> RefCell<T> { /// /// This function corresponds to [`std::mem::swap`](../mem/fn.swap.html). /// + /// # Panics + /// + /// Panics if the value in either `RefCell` is currently borrowed. + /// /// # Examples /// /// ``` @@ -616,11 +646,6 @@ impl<T> RefCell<T> { /// assert_eq!(c, RefCell::new(6)); /// assert_eq!(d, RefCell::new(5)); /// ``` - /// - /// # Panics - /// - /// This function will panic if either `RefCell` has any outstanding borrows, - /// whether or not they are full mutable borrows. #[inline] #[unstable(feature = "refcell_replace_swap", issue="43570")] pub fn swap(&self, other: &Self) { |
