diff options
| author | Dale Wijnand <dale.wijnand@gmail.com> | 2019-01-27 17:03:03 +0000 |
|---|---|---|
| committer | Dale Wijnand <dale.wijnand@gmail.com> | 2019-01-28 22:24:26 +0000 |
| commit | 1e577269da046b5e2b862830b72210c855fca123 (patch) | |
| tree | f659508672ab1035c91209835e9ded3a610a8cec /src/liballoc | |
| parent | 1484d0d123860dbd79804e9996f3fa5b6f4a6d58 (diff) | |
| download | rust-1e577269da046b5e2b862830b72210c855fca123.tar.gz rust-1e577269da046b5e2b862830b72210c855fca123.zip | |
Introduce into_raw_non_null on Rc and Arc
Diffstat (limited to 'src/liballoc')
| -rw-r--r-- | src/liballoc/rc.rs | 21 | ||||
| -rw-r--r-- | src/liballoc/sync.rs | 21 |
2 files changed, 42 insertions, 0 deletions
diff --git a/src/liballoc/rc.rs b/src/liballoc/rc.rs index d3a55c59ff6..456f7cd5e2f 100644 --- a/src/liballoc/rc.rs +++ b/src/liballoc/rc.rs @@ -435,6 +435,27 @@ impl<T: ?Sized> Rc<T> { } } + /// Consumes the `Rc`, returning the wrapped pointer as `NonNull<T>`. + /// + /// # Examples + /// + /// ``` + /// #![feature(rc_into_raw_non_null)] + /// + /// use std::rc::Rc; + /// + /// let x = Rc::new(10); + /// let ptr = Rc::into_raw_non_null(x); + /// let deref = unsafe { *ptr.as_ref() }; + /// assert_eq!(deref, 10); + /// ``` + #[unstable(feature = "rc_into_raw_non_null", issue = "47336")] + #[inline] + pub fn into_raw_non_null(this: Self) -> NonNull<T> { + // safe because Rc guarantees its pointer is non-null + unsafe { NonNull::new_unchecked(Rc::into_raw(this) as *mut _) } + } + /// Creates a new [`Weak`][weak] pointer to this value. /// /// [weak]: struct.Weak.html diff --git a/src/liballoc/sync.rs b/src/liballoc/sync.rs index 390a0791650..5cffa93db11 100644 --- a/src/liballoc/sync.rs +++ b/src/liballoc/sync.rs @@ -413,6 +413,27 @@ impl<T: ?Sized> Arc<T> { } } + /// Consumes the `Arc`, returning the wrapped pointer as `NonNull<T>`. + /// + /// # Examples + /// + /// ``` + /// #![feature(rc_into_raw_non_null)] + /// + /// use std::sync::Arc; + /// + /// let x = Arc::new(10); + /// let ptr = Arc::into_raw_non_null(x); + /// let deref = unsafe { *ptr.as_ref() }; + /// assert_eq!(deref, 10); + /// ``` + #[unstable(feature = "rc_into_raw_non_null", issue = "47336")] + #[inline] + pub fn into_raw_non_null(this: Self) -> NonNull<T> { + // safe because Arc guarantees its pointer is non-null + unsafe { NonNull::new_unchecked(Arc::into_raw(this) as *mut _) } + } + /// Creates a new [`Weak`][weak] pointer to this value. /// /// [weak]: struct.Weak.html |
