pub struct AtomicOnceCellStack<T> { /* private fields */ }
Expand description

A fixed-size stack with capacity determined at run-time. The elements of the stack are uninitialized. Elements may be initialized with push and then retrieved as a reference with get. push returns the index of the element in the stack. The caller may reserve space for multiple elements with reserve_uninit. Reserved elements must be initialized with set. Calling push, reserve_uninit, or set is thread-safe. The stack will panic if the capacity is exceeded, or the index is out of range, or the set function is called more than once on an index when T is not zero-sized, or if the set function is called on an index that was not reserved by a prior call to reserve_uninit. The stack will only drop initialized elements.

§Guarantees

  • The stack will not allocate if capacity is 0 or if T is zero-sized.
  • The allocated memory will not be default initialized.
  • Elements initialized by push or set are immutable.
  • The synchronization is lock-free.

§Zero-sized Types

When T is zero-sized, the stack does not track individual indices and instead only maintains a count of how many instances of T have been set in the stack. On drop, the stack will drop that many instances of T. The stack will panic if the number of calls to set exceeds the capacity.

Implementations§

source§

impl<T> AtomicOnceCellStack<T>

source

pub fn with_capacity(capacity: usize) -> AtomicOnceCellStack<T>

source

pub fn push(&self, val: T) -> usize

source

pub fn reserve_uninit(&self, num_to_reserve: usize) -> usize

source

pub fn set(&self, index: usize, val: T)

source

pub fn get(&self, index: usize) -> &T

source

pub unsafe fn get_range_unchecked(&self, range: Range<usize>) -> &[T]

source

pub unsafe fn get_all_unchecked(&self) -> &[T]

source

pub fn capacity(&self) -> usize

source

pub fn len(&self) -> usize

source

pub fn iter(&self) -> Iter<'_, T>

Trait Implementations§

source§

impl<'a, T> IntoIterator for &'a AtomicOnceCellStack<T>

§

type Item = &'a T

The type of the elements being iterated over.
§

type IntoIter = Iter<'a, T>

Which kind of iterator are we turning this into?
source§

fn into_iter(self) -> <&'a AtomicOnceCellStack<T> as IntoIterator>::IntoIter

Creates an iterator from a value. Read more

Auto Trait Implementations§

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> Downcast for T
where T: Any,

source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
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, U> TryFrom<U> for T
where 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 T
where 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.
source§

impl<T> Resource for T
where T: Downcast + Send + Sync,