Struct triomphe::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) -> Uwhere 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) -> Selfwhere 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]) -> Selfwhere 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>

§

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) -> Selfwhere Self: Sized,

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

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

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

fn clamp(self, min: Self, max: Self) -> Selfwhere Self: Sized + PartialOrd,

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

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

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

This method 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

This method 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

This method 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

This method 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

This method 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.
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> RefUnwindSafe for ThinArc<H, T>where H: RefUnwindSafe, T: RefUnwindSafe,

§

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

§

impl<H, T> UnwindSafe for ThinArc<H, T>where H: UnwindSafe + RefUnwindSafe, T: UnwindSafe + RefUnwindSafe,

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

source§

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

Mutably borrows from an owned value. 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 Twhere 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 Twhere T: Clone,

§

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 Twhere U: Into<T>,

§

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 Twhere U: TryFrom<T>,

§

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.