triomphe

Struct ThinArc

source
pub struct ThinArc<H, T> { /* private fields */ }
Expand description

A “thin” Arc containing dynamically sized data

This is functionally equivalent to Arc<(H, [T])>

When you create an Arc containing a dynamically sized type like HeaderSlice<H, [T]>, the Arc is represented on the stack as a “fat pointer”, where the length of the slice is stored alongside the Arc’s pointer. In some situations you may wish to have a thin pointer instead, perhaps for FFI compatibility or space efficiency.

Note that we use [T; 0] in order to have the right alignment for T.

ThinArc solves this by storing the length in the allocation itself, via HeaderSliceWithLength.

Implementations§

source§

impl<H, T> ThinArc<H, T>

source

pub fn with_arc<F, U>(&self, f: F) -> U
where F: FnOnce(&Arc<HeaderSlice<HeaderWithLength<H>, [T]>>) -> U,

Temporarily converts |self| into a bonafide Arc and exposes it to the provided callback. The refcount is not modified.

source

pub fn from_header_and_iter<I>(header: H, items: I) -> Self
where I: Iterator<Item = T> + ExactSizeIterator,

Creates a ThinArc for a HeaderSlice using the given header struct and iterator to generate the slice.

source

pub fn from_header_and_slice(header: H, items: &[T]) -> Self
where T: Copy,

Creates a ThinArc for a HeaderSlice using the given header struct and a slice to copy.

source

pub fn ptr(&self) -> *const c_void

Returns the address on the heap of the ThinArc itself – not the T within it – for memory reporting.

source

pub fn heap_ptr(&self) -> *const c_void

Returns the address on the heap of the Arc itself – not the T within it – for memory reporting.

source

pub unsafe fn from_raw(ptr: *const c_void) -> Self

§Safety

Constructs an ThinArc from a raw pointer.

The raw pointer must have been previously returned by a call to ThinArc::into_raw.

The user of from_raw has to make sure a specific value of T is only dropped once.

This function is unsafe because improper use may lead to memory unsafety, even if the returned ThinArc is never accessed.

source

pub fn into_raw(self) -> *const c_void

Consume ThinArc and returned the wrapped pointer.

source

pub fn as_ptr(&self) -> *const c_void

Provides a raw pointer to the data. The counts are not affected in any way and the ThinArc is not consumed. The pointer is valid for as long as there are strong counts in the ThinArc.

Trait Implementations§

source§

impl<H, T> Clone for ThinArc<H, T>

source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<H: Debug, T: Debug> Debug for ThinArc<H, T>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<H, T> Deref for ThinArc<H, T>

source§

type Target = HeaderSlice<HeaderWithLength<H>, [T]>

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl<H, T> Drop for ThinArc<H, T>

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
source§

impl<H: Hash, T: Hash> Hash for ThinArc<H, T>

source§

fn hash<HSR: Hasher>(&self, state: &mut HSR)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl<H: Ord, T: Ord> Ord for ThinArc<H, T>

source§

fn cmp(&self, other: &ThinArc<H, T>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
source§

impl<H: PartialEq, T: PartialEq> PartialEq for ThinArc<H, T>

source§

fn eq(&self, other: &ThinArc<H, T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<H: PartialOrd, T: PartialOrd> PartialOrd for ThinArc<H, T>

source§

fn partial_cmp(&self, other: &ThinArc<H, T>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
source§

impl<H, T> Pointer for ThinArc<H, T>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<H: Eq, T: Eq> Eq for ThinArc<H, T>

source§

impl<H: Sync + Send, T: Sync + Send> Send for ThinArc<H, T>

source§

impl<H: Sync + Send, T: Sync + Send> Sync for ThinArc<H, T>

Auto Trait Implementations§

§

impl<H, T> Freeze for ThinArc<H, T>

§

impl<H, T> RefUnwindSafe for ThinArc<H, T>

§

impl<H, T> Unpin for ThinArc<H, T>
where H: Unpin, T: Unpin,

§

impl<H, T> UnwindSafe for ThinArc<H, T>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for T
where T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.