pub struct UniqueArc<T: ?Sized>(/* private fields */);
Expand description
An Arc
that is known to be uniquely owned
When Arc
s are constructed, they are known to be
uniquely owned. In such a case it is safe to mutate
the contents of the Arc
. Normally, one would just handle
this by mutating the data on the stack before allocating the
Arc
, however it’s possible the data is large or unsized
and you need to heap-allocate it earlier in such a way
that it can be freely converted into a regular Arc
once you’re
done.
UniqueArc
exists for this purpose, when constructed it performs
the same allocations necessary for an Arc
, however it allows mutable access.
Once the mutation is finished, you can call .shareable()
and get a regular Arc
out of it.
let data = [1, 2, 3, 4, 5];
let mut x = UniqueArc::new(data);
x[4] = 7; // mutate!
let y = x.shareable(); // y is an Arc<T>
Implementations§
Source§impl<T> UniqueArc<T>
impl<T> UniqueArc<T>
Sourcepub fn new_uninit() -> UniqueArc<MaybeUninit<T>>
pub fn new_uninit() -> UniqueArc<MaybeUninit<T>>
Construct an uninitialized arc
Sourcepub fn into_inner(this: Self) -> T
pub fn into_inner(this: Self) -> T
Gets the inner value of the unique arc
Source§impl<T> UniqueArc<MaybeUninit<T>>
impl<T> UniqueArc<MaybeUninit<T>>
Sourcepub fn as_mut_ptr(&mut self) -> *mut MaybeUninit<T>
pub fn as_mut_ptr(&mut self) -> *mut MaybeUninit<T>
Obtain a mutable pointer to the stored MaybeUninit<T>
.
Sourcepub unsafe fn assume_init(this: Self) -> UniqueArc<T>
pub unsafe fn assume_init(this: Self) -> UniqueArc<T>
Convert to an initialized Arc.
§Safety
This function is equivalent to MaybeUninit::assume_init
and has the
same safety requirements. You are responsible for ensuring that the T
has actually been initialized before calling this method.
Source§impl<T> UniqueArc<[MaybeUninit<T>]>
impl<T> UniqueArc<[MaybeUninit<T>]>
Sourcepub fn new_uninit_slice(len: usize) -> Self
pub fn new_uninit_slice(len: usize) -> Self
Create an Arc contains an array [MaybeUninit<T>]
of len
.
Sourcepub unsafe fn assume_init_slice(Self: Self) -> UniqueArc<[T]>
pub unsafe fn assume_init_slice(Self: Self) -> UniqueArc<[T]>
§Safety
Must initialize all fields before calling this function.
Source§impl<H, T> UniqueArc<HeaderSlice<H, [MaybeUninit<T>]>>
impl<H, T> UniqueArc<HeaderSlice<H, [MaybeUninit<T>]>>
Sourcepub fn from_header_and_uninit_slice(header: H, len: usize) -> Self
pub fn from_header_and_uninit_slice(header: H, len: usize) -> Self
Creates an Arc for a HeaderSlice using the given header struct and allocated space
for an unitialized slice of length len
.
Sourcepub unsafe fn assume_init_slice_with_header(
self,
) -> UniqueArc<HeaderSlice<H, [T]>>
pub unsafe fn assume_init_slice_with_header( self, ) -> UniqueArc<HeaderSlice<H, [T]>>
§Safety
Must initialize all fields before calling this function.
Trait Implementations§
Source§impl<A> FromIterator<A> for UniqueArc<[A]>
impl<A> FromIterator<A> for UniqueArc<[A]>
Source§fn from_iter<T: IntoIterator<Item = A>>(iter: T) -> Self
fn from_iter<T: IntoIterator<Item = A>>(iter: T) -> Self
impl<T: ?Sized + Send> Send for UniqueArc<T>
impl<T: ?Sized + Sync> Sync for UniqueArc<T>
Auto Trait Implementations§
impl<T> Freeze for UniqueArc<T>where
T: ?Sized,
impl<T> RefUnwindSafe for UniqueArc<T>where
T: RefUnwindSafe + ?Sized,
impl<T> Unpin for UniqueArc<T>
impl<T> UnwindSafe for UniqueArc<T>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T, A> DynAccess<T> for A
impl<T, A> DynAccess<T> for A
Source§fn load(&self) -> DynGuard<T>
fn load(&self) -> DynGuard<T>
Access::load
.