Skip to main content

AppendOnlyVec

Struct AppendOnlyVec 

pub struct AppendOnlyVec<T, const INLINE: usize = 0, const BIN_OFFSET: u32 = 3> { /* private fields */ }
Expand description

Append only vec of items T.

This vec never moves and never removes items. As long as this vec is around, references to all the data it stores stay valid, and items can be added without a mutable reference to it.

The first INLINE items are stored in the vec itself, so a vec that never outgrows them allocates nothing. Further items go to bins that are allocated on demand, each double the size of the one before, starting at 2^BIN_OFFSET items. The directory of these bins is itself only allocated once the inline items are used up. Capacity is bounded by memory and by Self::MAX_LEN: INLINE + 2^BIN_OFFSET * (2^32 - 1) items, or what a usize counts on smaller targets.

Pushes are not lock-free: items are published in index order, so a push suspended between reserving and publishing its slot delays later pushes until it resumes. Never push from a signal or interrupt handler.

Every push can carry a tag: Self::tags is the bitwise or of the tags of all pushed items, which lets a reader skip a vec that cannot hold what it looks for (see Self::push_tagged).

Implementations§

§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> AppendOnlyVec<T, INLINE, BIN_OFFSET>

pub const MAX_LEN: usize

Available on crate features grpc and http and std only.

The most items it holds: what its bins have room for, at most half a usize, so every index and the count past the last fit, and pushes past the limit, however many at once, undo their reservation without wrapping it.

pub fn new() -> AppendOnlyVec<T, INLINE, BIN_OFFSET>

Available on crate features grpc and http and std only.

Create a new, empty AppendOnlyVec of T items. Allocates nothing.

ⓘ
use rama_utils::collections::AppendOnlyVec;
// This should fail because the first bin is too large for usize
_ = AppendOnlyVec::<usize, 0, 40>::new();

pub unsafe fn init_in_place(slot: *mut AppendOnlyVec<T, INLINE, BIN_OFFSET>)

Available on crate features grpc and http and std only.

Write an empty vec to slot, without touching its inline item storage.

Same as writing Self::new there, minus moving the (uninitialized) inline storage: for a vec inside a larger allocation that copy is most of the cost of creating it.

§Safety

slot must be valid for writes and aligned. Whatever it held is overwritten without being dropped.

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

Available on crate features grpc and http and std only.

Pushes an element and returns its index.

§Panics

Once it holds Self::MAX_LEN items, as a Vec past its capacity, leaving the vec as it was: see Self::try_push.

pub fn try_push(&self, element: T) -> Result<usize, T>

Available on crate features grpc and http and std only.

Pushes an element and returns its index, or gives it back once it holds Self::MAX_LEN items.

pub fn push_tagged(&self, element: T, tag: usize) -> usize

Available on crate features grpc and http and std only.

Pushes an element tagged with tag, and returns its index.

The tag is added to Self::tags before the element is published, so a reader that sees the element also sees its tag: a reader that finds a tag missing from Self::tags can skip this vec for it, as no item with that tag was published before.

pub fn tags(&self) -> usize

Available on crate features grpc and http and std only.

The bitwise or of the tags of all items pushed so far, see Self::push_tagged.

pub fn get(&self, idx: usize) -> Option<&T>

Available on crate features grpc and http and std only.

pub fn is_empty(&self) -> bool

Available on crate features grpc and http and std only.

pub fn len(&self) -> usize

Available on crate features grpc and http and std only.

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

Available on crate features grpc and http and std only.

Returns an iterator over the elements currently in the vector. The iterator snapshots the length at creation time.

pub fn chunks(&self) -> Chunks<'_, T, INLINE, BIN_OFFSET> ⓘ

Available on crate features grpc and http and std only.

Returns the elements currently in the vector as contiguous slices, oldest first.

The inline items are one slice and every bin is one more, so walking the elements with two nested loops does the bin arithmetic once per bin instead of once per element like Self::iter. Like Self::iter this snapshots the length at creation time. The iterator is double ended: .rev() yields the newest slice first.

pub unsafe fn get_unchecked(&self, idx: usize) -> &T

Available on crate features grpc and http and std only.

Get item with idx from this vec

§Safety

This function is safe if idx < self.len()

Trait Implementations§

§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> Debug for AppendOnlyVec<T, INLINE, BIN_OFFSET>
where T: Debug,

§

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

Formats the value using the given formatter. Read more
§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> Default for AppendOnlyVec<T, INLINE, BIN_OFFSET>

§

fn default() -> AppendOnlyVec<T, INLINE, BIN_OFFSET>

Returns the “default value” for a type. Read more
§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> Drop for AppendOnlyVec<T, INLINE, BIN_OFFSET>

§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more
§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> Extend<T> for AppendOnlyVec<T, INLINE, BIN_OFFSET>

§

fn extend<I>(&mut self, iter: I)
where I: IntoIterator<Item = T>,

Extends a collection with the contents of an iterator. Read more
Source§

fn extend_one(&mut self, item: T)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
Source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> Extend<T> for &AppendOnlyVec<T, INLINE, BIN_OFFSET>

§

fn extend<I>(&mut self, iter: I)
where I: IntoIterator<Item = T>,

Extends a collection with the contents of an iterator. Read more
Source§

fn extend_one(&mut self, item: T)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
Source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> FromIterator<T> for AppendOnlyVec<T, INLINE, BIN_OFFSET>

§

fn from_iter<I>(iter: I) -> AppendOnlyVec<T, INLINE, BIN_OFFSET>
where I: IntoIterator<Item = T>,

Creates a value from an iterator. Read more
§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> Index<usize> for AppendOnlyVec<T, INLINE, BIN_OFFSET>

§

type Output = T

The returned type after indexing.
§

fn index( &self, idx: usize, ) -> &<AppendOnlyVec<T, INLINE, BIN_OFFSET> as Index<usize>>::Output

Performs the indexing (container[index]) operation. Read more
§

impl<'a, T, const INLINE: usize, const BIN_OFFSET: u32> IntoIterator for &'a AppendOnlyVec<T, INLINE, BIN_OFFSET>

§

type Item = &'a T

The type of the elements being iterated over.
§

type IntoIter = Iter<'a, T, INLINE, BIN_OFFSET>

Which kind of iterator are we turning this into?
§

fn into_iter( self, ) -> <&'a AppendOnlyVec<T, INLINE, BIN_OFFSET> as IntoIterator>::IntoIter

Creates an iterator from a value. Read more
§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> IntoIterator for AppendOnlyVec<T, INLINE, BIN_OFFSET>

§

type Item = T

The type of the elements being iterated over.
§

type IntoIter = IntoIterOwned<T, INLINE, BIN_OFFSET>

Which kind of iterator are we turning this into?
§

fn into_iter( self, ) -> <AppendOnlyVec<T, INLINE, BIN_OFFSET> as IntoIterator>::IntoIter

Creates an iterator from a value. Read more
§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> Send for AppendOnlyVec<T, INLINE, BIN_OFFSET>
where T: Send,

§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> Sync for AppendOnlyVec<T, INLINE, BIN_OFFSET>
where T: Send + Sync,

Auto Trait Implementations§

§

impl<T, const INLINE: usize = 0, const BIN_OFFSET: u32 = 3> !Freeze for AppendOnlyVec<T, INLINE, BIN_OFFSET>

§

impl<T, const INLINE: usize = 0, const BIN_OFFSET: u32 = 3> !RefUnwindSafe for AppendOnlyVec<T, INLINE, BIN_OFFSET>

§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> Unpin for AppendOnlyVec<T, INLINE, BIN_OFFSET>
where Atomic<*mut Spill<T>>: Unpin, [UnsafeCell<MaybeUninit<T>>; INLINE]: Unpin,

§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> UnsafeUnpin for AppendOnlyVec<T, INLINE, BIN_OFFSET>

§

impl<T, const INLINE: usize, const BIN_OFFSET: u32> UnwindSafe for AppendOnlyVec<T, INLINE, BIN_OFFSET>

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
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self> ⓘ

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a rama_grpc::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
§

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

§

fn rama_from(value: T) -> U

§

impl<T, U, CrateMarker> RamaInto<U, CrateMarker> for T
where U: RamaFrom<T, CrateMarker>,

§

fn rama_into(self) -> U

§

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

§

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

§

fn rama_try_from(value: T) -> Result<U, <U as RamaTryFrom<T>>::Error>

§

impl<T, U, CrateMarker> RamaTryInto<U, CrateMarker> for T
where U: RamaTryFrom<T, CrateMarker>,

§

type Error = <U as RamaTryFrom<T, CrateMarker>>::Error

§

fn rama_try_into(self) -> Result<U, <U as RamaTryFrom<T, CrateMarker>>::Error>

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<V, F> ValueFormatter<&V> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &&V)

Write value to writer
§

impl<V, F> ValueFormatter<Arc<V>> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Arc<V>)

Write value to writer
§

impl<V, F> ValueFormatter<Box<V>> for F
where F: ValueFormatter<V> + ?Sized, V: ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Box<V>)

Write value to writer
§

impl<V, F> ValueFormatter<Cow<'_, V>> for F
where V: ToOwned + ?Sized, F: ValueFormatter<V> + ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Cow<'_, V>)

Write value to writer
§

impl<V, F> ValueFormatter<Option<V>> for F
where F: ValueFormatter<V> + ?Sized,

§

const SHAPE: FieldShape<'static>

Available on non-metrique_require_explicit_impls only.
The shape of values produced by this formatter. Read more
§

fn format_value(writer: impl ValueWriter, value: &Option<V>)

Write value to writer
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more