Struct UniqueRc
pub struct UniqueRc<T: ?Sized, A: Allocator = Global> { pub(in ::rc) ptr: NonNull<RcInner<T>>, pub(in ::rc) _marker: PhantomData<RcInner<T>>, pub(in ::rc) _marker2: PhantomData<*mut T>, pub(in ::rc) alloc: A }
A uniquely owned Rc.
This represents an Rc that is known to be uniquely owned -- that is, have exactly one strong
reference. Multiple weak pointers can be created, but attempts to upgrade those to strong
references will fail unless the UniqueRc they point to has been converted into a regular Rc.
Because they are uniquely owned, the contents of a UniqueRc can be freely mutated. A common
use case is to have an object be mutable during its initialization phase but then have it become
immutable and converted to a normal Rc.
This can be used as a flexible way to create cyclic data structures, as in the example below.
use ;
create_gadget.unwrap;
An advantage of using UniqueRc over Rc::new_cyclic to build cyclic data structures is that
Rc::new_cyclic's data_fn parameter cannot be async or return a Result. As shown in the
previous example, UniqueRc allows for more flexibility in the construction of cyclic data,
including fallible or async constructors.
Fields
ptr: NonNull<RcInner<T>>_marker: PhantomData<RcInner<T>>_marker2: PhantomData<*mut T>alloc: A
Implementations
impl<T> UniqueRc<T>
fn new(value: T) -> SelfCreates a new
UniqueRc.Weak references to this
UniqueRccan be created withUniqueRc::downgrade. Upgrading these weak references will fail before theUniqueRchas been converted into anRc. After converting theUniqueRcinto anRc, any weak references created beforehand will point to the newRc.fn map<U>(this: Self, f: impl FnOnce(T) -> U) -> UniqueRc<U>Maps the value in a
UniqueRc, reusing the allocation if possible.fis called on a reference to the value in theUniqueRc, and the result is returned, also in aUniqueRc.Note: this is an associated function, which means that you have to call it as
UniqueRc::map(u, f)instead ofu.map(f). This is so that there is no conflict with a method on the inner type.Examples
use UniqueRc; let r = new; let new = map; assert_eq!;fn try_map<R>(this: Self, f: impl FnOnce(T) -> R) -> <R::Residual as Residual<UniqueRc<R::Output>>>::TryType where R: Try, R::Residual: Residual<UniqueRc<R::Output>>,Attempts to map the value in a
UniqueRc, reusing the allocation if possible.fis called on a reference to the value in theUniqueRc, and if the operation succeeds, the result is returned, also in aUniqueRc.Note: this is an associated function, which means that you have to call it as
UniqueRc::try_map(u, f)instead ofu.try_map(f). This is so that there is no conflict with a method on the inner type.Examples
use UniqueRc; let b = new; let new = try_map.unwrap; assert_eq!;fn unwrap(this: Self) -> T
impl<T, A: Allocator> UniqueRc<MaybeUninit<T>, A>
unsafe fn assume_init(self) -> UniqueRc<T, A>
impl<T, A: Allocator> UniqueRc<T, A>
fn new_in(value: T, alloc: A) -> SelfCreates a new
UniqueRcin the provided allocator.Weak references to this
UniqueRccan be created withUniqueRc::downgrade. Upgrading these weak references will fail before theUniqueRchas been converted into anRc. After converting theUniqueRcinto anRc, any weak references created beforehand will point to the newRc.
impl<T: ?Sized> UniqueRc<T>
unsafe fn from_raw(ptr: *const T) -> Selffn into_raw(this: Self) -> *const T
impl<T: ?Sized, A: Allocator> UniqueRc<T, A>
fn into_rc(this: Self) -> Rc<T, A>Converts the
UniqueRcinto a regularRc.This consumes the
UniqueRcand returns a regularRcthat contains thevaluethat is passed tointo_rc.Any weak references created before this method is called can now be upgraded to strong references.
fn weak_count(this: &Self) -> usizefn inner(&self) -> &RcInner<T>fn as_ptr(this: &Self) -> *const Tfn into_inner_with_allocator(this: Self) -> (NonNull<RcInner<T>>, A)unsafe fn from_inner_in(ptr: NonNull<RcInner<T>>, alloc: A) -> Self
impl<T: ?Sized, A: AllocatorClone> UniqueRc<T, A>
fn downgrade(this: &Self) -> Weak<T, A>Creates a new weak reference to the
UniqueRc.Attempting to upgrade this weak reference will fail before the
UniqueRchas been converted to aRcusingUniqueRc::into_rc.
Trait Implementations
impl<T> From<T> for UniqueRc<T>
fn from(value: T) -> Self
impl<T: ?Sized + Debug, A: Allocator> Debug for UniqueRc<T, A>
fn fmt(&self, f: &mut Formatter<'_>) -> Result
impl<T: ?Sized + Display, A: Allocator> Display for UniqueRc<T, A>
fn fmt(&self, f: &mut Formatter<'_>) -> Result
impl<T: ?Sized + Eq, A: Allocator> Eq for UniqueRc<T, A>
impl<T: ?Sized + Hash, A: Allocator> Hash for UniqueRc<T, A>
fn hash<H: Hasher>(&self, state: &mut H)
impl<T: ?Sized + Ord, A: Allocator> Ord for UniqueRc<T, A>
fn cmp(&self, other: &UniqueRc<T, A>) -> OrderingComparison for two
UniqueRcs.The two are compared by calling
cmp()on their inner values.Examples
use UniqueRc; use Ordering; let five = new; assert_eq!;
impl<T: ?Sized + PartialEq, A: Allocator> PartialEq for UniqueRc<T, A>
fn eq(&self, other: &Self) -> boolEquality for two
UniqueRcs.Two
UniqueRcs are equal if their inner values are equal.Examples
use UniqueRc; let five = new; assert!;fn ne(&self, other: &Self) -> boolInequality for two
UniqueRcs.Two
UniqueRcs are not equal if their inner values are not equal.Examples
use UniqueRc; let five = new; assert!;
impl<T: ?Sized + PartialOrd, A: Allocator> PartialOrd for UniqueRc<T, A>
fn partial_cmp(&self, other: &UniqueRc<T, A>) -> Option<Ordering>Partial comparison for two
UniqueRcs.The two are compared by calling
partial_cmp()on their inner values.Examples
use UniqueRc; use Ordering; let five = new; assert_eq!;fn lt(&self, other: &UniqueRc<T, A>) -> boolLess-than comparison for two
UniqueRcs.The two are compared by calling
<on their inner values.Examples
use UniqueRc; let five = new; assert!;fn le(&self, other: &UniqueRc<T, A>) -> bool'Less than or equal to' comparison for two
UniqueRcs.The two are compared by calling
<=on their inner values.Examples
use UniqueRc; let five = new; assert!;fn gt(&self, other: &UniqueRc<T, A>) -> boolGreater-than comparison for two
UniqueRcs.The two are compared by calling
>on their inner values.Examples
use UniqueRc; let five = new; assert!;fn ge(&self, other: &UniqueRc<T, A>) -> bool'Greater than or equal to' comparison for two
UniqueRcs.The two are compared by calling
>=on their inner values.Examples
use UniqueRc; let five = new; assert!;
impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<UniqueRc<U>> for UniqueRc<T>
impl<T: ?Sized + Unsize<U>, U: ?Sized, A: Allocator> CoerceUnsized<UniqueRc<U, A>> for UniqueRc<T, A>
impl<T: ?Sized, A: Allocator + 'static> PinSafePointer for UniqueRc<T, A>
impl<T: ?Sized, A: Allocator> !Send for UniqueRc<T, A>
impl<T: ?Sized, A: Allocator> !Sync for UniqueRc<T, A>
impl<T: ?Sized, A: Allocator> AsMut<T> for UniqueRc<T, A>
fn as_mut(&mut self) -> &mut T
impl<T: ?Sized, A: Allocator> AsRef<T> for UniqueRc<T, A>
fn as_ref(&self) -> &T
impl<T: ?Sized, A: Allocator> Borrow<T> for UniqueRc<T, A>
fn borrow(&self) -> &T
impl<T: ?Sized, A: Allocator> BorrowMut<T> for UniqueRc<T, A>
fn borrow_mut(&mut self) -> &mut T
impl<T: ?Sized, A: Allocator> Deref for UniqueRc<T, A>
type Target = T;fn deref(&self) -> &T
impl<T: ?Sized, A: Allocator> DerefMut for UniqueRc<T, A>
fn deref_mut(&mut self) -> &mut T
impl<T: ?Sized, A: Allocator> DerefPure for UniqueRc<T, A>
impl<T: ?Sized, A: Allocator> Drop for UniqueRc<T, A>
fn drop(&mut self)
impl<T: ?Sized, A: Allocator> Pointer for UniqueRc<T, A>
fn fmt(&self, f: &mut Formatter<'_>) -> Result
impl<T: ?Sized, A: Allocator> Unpin for UniqueRc<T, A>
Auto Trait Implementations
impl<T, A = Global> !RefUnwindSafe for UniqueRc<T, A>
impl<T, A = Global> !UnwindSafe for UniqueRc<T, A>
impl<T, A> Freeze for UniqueRc<T, A>
where
NonNull<RcInner<T>>: Freeze,
PhantomData<RcInner<T>>: Freeze,
PhantomData<*mut T>: Freeze,
A: Freeze,
T: ?Sized,
impl<T, A> UnsafeUnpin for UniqueRc<T, A>
where
NonNull<RcInner<T>>: UnsafeUnpin,
PhantomData<RcInner<T>>: UnsafeUnpin,
PhantomData<*mut T>: UnsafeUnpin,
A: UnsafeUnpin,
T: ?Sized,
Blanket Implementations
impl<P, T> Receiver for UniqueRc<T, A>
where
P: Deref<Target = T> + ?Sized,
T: ?Sized,
type Target = T;
impl<T> Any for UniqueRc<T, A>
where
T: 'static + ?Sized,
fn type_id(&self) -> TypeId
impl<T> Borrow<T> for UniqueRc<T, A>
where
T: ?Sized,
fn borrow(&self) -> &T
impl<T> BorrowMut<T> for UniqueRc<T, A>
where
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> From<T> for UniqueRc<T, A>
fn from(t: T) -> TReturns the argument unchanged.
impl<T> From<never> for UniqueRc<T, A>
fn from(t: never) -> T
impl<T> SizeHint for UniqueRc<T, A>
where
T: ?Sized,
fn lower_bound(&self) -> usizefn upper_bound(&self) -> Option<usize>
impl<T> SizedTypeProperties for UniqueRc<T, A>
impl<T> ToString for UniqueRc<T, A>
where
T: Display + ?Sized,
fn to_string(&self) -> String
impl<T, U> Into<U> for UniqueRc<T, A>
where
U: From<T>,
fn into(self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom<U> for UniqueRc<T, A>
where
U: Into<T>,
type Error = Infallible;fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto<U> for UniqueRc<T, A>
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error;fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>