diff options
| author | Zachary S <zasample18+github@gmail.com> | 2024-11-18 19:52:58 -0600 |
|---|---|---|
| committer | Zachary S <zasample18+github@gmail.com> | 2024-11-19 13:51:52 -0600 |
| commit | edcc5a9bfe6a28e9dffed547b32d8aba5f9e0474 (patch) | |
| tree | 56a0fd55073010e5f1206fc9a6234b5dfcc244e5 | |
| parent | 89b688552994bd8404b8fdab2cf96f00632af0ff (diff) | |
| download | rust-edcc5a9bfe6a28e9dffed547b32d8aba5f9e0474.tar.gz rust-edcc5a9bfe6a28e9dffed547b32d8aba5f9e0474.zip | |
UniqueRc: Add more trait impls.
* Support the same formatting as Rc * Add explicit !Send and !Sync impls, to mirror Rc * DispatchFromDyn * borrowing traits and Unpin
| -rw-r--r-- | library/alloc/src/rc.rs | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/library/alloc/src/rc.rs b/library/alloc/src/rc.rs index 3a9bd1b5bf1..7aa4bfe42a8 100644 --- a/library/alloc/src/rc.rs +++ b/library/alloc/src/rc.rs @@ -3684,7 +3684,6 @@ fn data_offset_align(align: usize) -> usize { /// previous example, `UniqueRc` allows for more flexibility in the construction of cyclic data, /// including fallible or async constructors. #[unstable(feature = "unique_rc_arc", issue = "112566")] -#[derive(Debug)] pub struct UniqueRc< T: ?Sized, #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global, @@ -3694,12 +3693,80 @@ pub struct UniqueRc< alloc: A, } +// Not necessary for correctness since `UniqueRc` contains `NonNull`, +// but having an explicit negative impl is nice for documentation purposes +// and results in nicer error messages. +#[unstable(feature = "unique_rc_arc", issue = "112566")] +impl<T: ?Sized, A: Allocator> !Send for UniqueRc<T, A> {} + +// Not necessary for correctness since `UniqueRc` contains `NonNull`, +// but having an explicit negative impl is nice for documentation purposes +// and results in nicer error messages. +#[unstable(feature = "unique_rc_arc", issue = "112566")] +impl<T: ?Sized, A: Allocator> !Sync for UniqueRc<T, A> {} + #[unstable(feature = "unique_rc_arc", issue = "112566")] impl<T: ?Sized + Unsize<U>, U: ?Sized, A: Allocator> CoerceUnsized<UniqueRc<U, A>> for UniqueRc<T, A> { } +//#[unstable(feature = "unique_rc_arc", issue = "112566")] +#[unstable(feature = "dispatch_from_dyn", issue = "none")] +impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<UniqueRc<U>> for UniqueRc<T> {} + +#[unstable(feature = "unique_rc_arc", issue = "112566")] +impl<T: ?Sized + fmt::Display, A: Allocator> fmt::Display for UniqueRc<T, A> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(&**self, f) + } +} + +#[unstable(feature = "unique_rc_arc", issue = "112566")] +impl<T: ?Sized + fmt::Debug, A: Allocator> fmt::Debug for UniqueRc<T, A> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Debug::fmt(&**self, f) + } +} + +#[unstable(feature = "unique_rc_arc", issue = "112566")] +impl<T: ?Sized, A: Allocator> fmt::Pointer for UniqueRc<T, A> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Pointer::fmt(&(&raw const **self), f) + } +} + +#[unstable(feature = "unique_rc_arc", issue = "112566")] +impl<T: ?Sized, A: Allocator> borrow::Borrow<T> for UniqueRc<T, A> { + fn borrow(&self) -> &T { + &**self + } +} + +#[unstable(feature = "unique_rc_arc", issue = "112566")] +impl<T: ?Sized, A: Allocator> borrow::BorrowMut<T> for UniqueRc<T, A> { + fn borrow_mut(&mut self) -> &mut T { + &mut **self + } +} + +#[unstable(feature = "unique_rc_arc", issue = "112566")] +impl<T: ?Sized, A: Allocator> AsRef<T> for UniqueRc<T, A> { + fn as_ref(&self) -> &T { + &**self + } +} + +#[unstable(feature = "unique_rc_arc", issue = "112566")] +impl<T: ?Sized, A: Allocator> AsMut<T> for UniqueRc<T, A> { + fn as_mut(&mut self) -> &mut T { + &mut **self + } +} + +#[unstable(feature = "unique_rc_arc", issue = "112566")] +impl<T: ?Sized, A: Allocator> Unpin for UniqueRc<T, A> {} + // Depends on A = Global impl<T> UniqueRc<T> { /// Creates a new `UniqueRc`. |
