Struct mz_ore::bytes::SegmentedBytes

source ·
pub struct SegmentedBytes<const N: usize = 1> {
    segments: SmallVec<[(MaybeLgBytes, usize); N]>,
    len: usize,
}
Available on crate feature bytes_ only.
Expand description

A cheaply clonable collection of possibly non-contiguous bytes.

Vec<u8> or Bytes are contiguous chunks of memory, which are fast (e.g. better cache locality) and easier to work with (e.g. can take a slice), but can cause problems (e.g. memory fragmentation) if you try to allocate a single very large chunk. Depending on the application, you probably don’t need a contiguous chunk of memory, just a way to store and iterate over a collection of bytes.

Note: SegmentedBytes is generic over a const N: usize. Internally we use a smallvec::SmallVec to store our Bytes segments, and N is how many Bytes we’ll store inline before spilling to the heap. We default N = 1, so in the case of a single Bytes segment, we avoid one layer of indirection.

Fields§

§segments: SmallVec<[(MaybeLgBytes, usize); N]>

Collection of non-contiguous segments, each segment is guaranteed to be non-empty.

§len: usize

Pre-computed length of all the segments.

Implementations§

source§

impl SegmentedBytes

source

pub fn new<const N: usize>() -> SegmentedBytes<N>

Creates a new empty SegmentedBytes, reserving space inline for N segments.

Note: If you don’t know how many segments you have, you should use SegmentedBytes::default.

source§

impl<const N: usize> SegmentedBytes<N>

source

pub fn with_capacity(capacity: usize) -> SegmentedBytes<N>

Creates a new empty SegmentedBytes with space for capacity segments.

source

pub fn len(&self) -> usize

Returns the number of bytes contained in this SegmentedBytes.

source

pub fn is_empty(&self) -> bool

Returns if this SegmentedBytes is empty.

source

pub fn into_segments(self) -> impl Iterator<Item = MaybeLgBytes>

Consumes self returning an Iterator over all of the non-contiguous segments that make up this buffer.

source

pub fn into_contiguous(self) -> Vec<u8>

Copies all of the bytes from self returning one contiguous blob.

source

pub fn push<B: Into<MaybeLgBytes>>(&mut self, b: B)

Extends the buffer by one more segment of MaybeLgBytes.

If the provided MaybeLgBytes is empty, we skip appending it.

source

pub fn reader(self) -> SegmentedReader<N>

Consumes self returning a type that implements io::Read and io::Seek.

Note: Clone-ing a SegmentedBytes is cheap, so if you need to retain the original SegmentedBytes you should clone it.

Trait Implementations§

source§

impl<const N: usize> Buf for SegmentedBytes<N>

source§

fn remaining(&self) -> usize

Returns the number of bytes between the current position and the end of the buffer. Read more
source§

fn chunk(&self) -> &[u8]

Returns a slice starting at the current position and of length between 0 and Buf::remaining(). Note that this can return shorter slice (this allows non-continuous internal representation). Read more
source§

fn advance(&mut self, cnt: usize)

Advance the internal cursor of the Buf Read more
source§

fn chunks_vectored<'a>(&'a self, dst: &mut [IoSlice<'a>]) -> usize

Fills dst with potentially multiple slices starting at self’s current position. Read more
source§

fn has_remaining(&self) -> bool

Returns true if there are any more bytes to consume Read more
source§

fn copy_to_slice(&mut self, dst: &mut [u8])

Copies bytes from self into dst. Read more
source§

fn get_u8(&mut self) -> u8

Gets an unsigned 8 bit integer from self. Read more
source§

fn get_i8(&mut self) -> i8

Gets a signed 8 bit integer from self. Read more
source§

fn get_u16(&mut self) -> u16

Gets an unsigned 16 bit integer from self in big-endian byte order. Read more
source§

fn get_u16_le(&mut self) -> u16

Gets an unsigned 16 bit integer from self in little-endian byte order. Read more
source§

fn get_u16_ne(&mut self) -> u16

Gets an unsigned 16 bit integer from self in native-endian byte order. Read more
source§

fn get_i16(&mut self) -> i16

Gets a signed 16 bit integer from self in big-endian byte order. Read more
source§

fn get_i16_le(&mut self) -> i16

Gets a signed 16 bit integer from self in little-endian byte order. Read more
source§

fn get_i16_ne(&mut self) -> i16

Gets a signed 16 bit integer from self in native-endian byte order. Read more
source§

fn get_u32(&mut self) -> u32

Gets an unsigned 32 bit integer from self in the big-endian byte order. Read more
source§

fn get_u32_le(&mut self) -> u32

Gets an unsigned 32 bit integer from self in the little-endian byte order. Read more
source§

fn get_u32_ne(&mut self) -> u32

Gets an unsigned 32 bit integer from self in native-endian byte order. Read more
source§

fn get_i32(&mut self) -> i32

Gets a signed 32 bit integer from self in big-endian byte order. Read more
source§

fn get_i32_le(&mut self) -> i32

Gets a signed 32 bit integer from self in little-endian byte order. Read more
source§

fn get_i32_ne(&mut self) -> i32

Gets a signed 32 bit integer from self in native-endian byte order. Read more
source§

fn get_u64(&mut self) -> u64

Gets an unsigned 64 bit integer from self in big-endian byte order. Read more
source§

fn get_u64_le(&mut self) -> u64

Gets an unsigned 64 bit integer from self in little-endian byte order. Read more
source§

fn get_u64_ne(&mut self) -> u64

Gets an unsigned 64 bit integer from self in native-endian byte order. Read more
source§

fn get_i64(&mut self) -> i64

Gets a signed 64 bit integer from self in big-endian byte order. Read more
source§

fn get_i64_le(&mut self) -> i64

Gets a signed 64 bit integer from self in little-endian byte order. Read more
source§

fn get_i64_ne(&mut self) -> i64

Gets a signed 64 bit integer from self in native-endian byte order. Read more
source§

fn get_u128(&mut self) -> u128

Gets an unsigned 128 bit integer from self in big-endian byte order. Read more
source§

fn get_u128_le(&mut self) -> u128

Gets an unsigned 128 bit integer from self in little-endian byte order. Read more
source§

fn get_u128_ne(&mut self) -> u128

Gets an unsigned 128 bit integer from self in native-endian byte order. Read more
source§

fn get_i128(&mut self) -> i128

Gets a signed 128 bit integer from self in big-endian byte order. Read more
source§

fn get_i128_le(&mut self) -> i128

Gets a signed 128 bit integer from self in little-endian byte order. Read more
source§

fn get_i128_ne(&mut self) -> i128

Gets a signed 128 bit integer from self in native-endian byte order. Read more
source§

fn get_uint(&mut self, nbytes: usize) -> u64

Gets an unsigned n-byte integer from self in big-endian byte order. Read more
source§

fn get_uint_le(&mut self, nbytes: usize) -> u64

Gets an unsigned n-byte integer from self in little-endian byte order. Read more
source§

fn get_uint_ne(&mut self, nbytes: usize) -> u64

Gets an unsigned n-byte integer from self in native-endian byte order. Read more
source§

fn get_int(&mut self, nbytes: usize) -> i64

Gets a signed n-byte integer from self in big-endian byte order. Read more
source§

fn get_int_le(&mut self, nbytes: usize) -> i64

Gets a signed n-byte integer from self in little-endian byte order. Read more
source§

fn get_int_ne(&mut self, nbytes: usize) -> i64

Gets a signed n-byte integer from self in native-endian byte order. Read more
source§

fn get_f32(&mut self) -> f32

Gets an IEEE754 single-precision (4 bytes) floating point number from self in big-endian byte order. Read more
source§

fn get_f32_le(&mut self) -> f32

Gets an IEEE754 single-precision (4 bytes) floating point number from self in little-endian byte order. Read more
source§

fn get_f32_ne(&mut self) -> f32

Gets an IEEE754 single-precision (4 bytes) floating point number from self in native-endian byte order. Read more
source§

fn get_f64(&mut self) -> f64

Gets an IEEE754 double-precision (8 bytes) floating point number from self in big-endian byte order. Read more
source§

fn get_f64_le(&mut self) -> f64

Gets an IEEE754 double-precision (8 bytes) floating point number from self in little-endian byte order. Read more
source§

fn get_f64_ne(&mut self) -> f64

Gets an IEEE754 double-precision (8 bytes) floating point number from self in native-endian byte order. Read more
source§

fn copy_to_bytes(&mut self, len: usize) -> Bytes

Consumes len bytes inside self and returns new instance of Bytes with this data. Read more
source§

fn take(self, limit: usize) -> Take<Self>
where Self: Sized,

Creates an adaptor which will read at most limit bytes from self. Read more
source§

fn chain<U>(self, next: U) -> Chain<Self, U>
where U: Buf, Self: Sized,

Creates an adaptor which will chain this buffer with another. Read more
source§

fn reader(self) -> Reader<Self>
where Self: Sized,

Creates an adaptor which implements the Read trait for self. Read more
source§

impl ChunkReader for SegmentedBytes

§

type T = SegmentedReader

source§

fn get_read(&self, start: u64) -> Result<Self::T>

Get a Read starting at the provided file offset Read more
source§

fn get_bytes(&self, start: u64, length: usize) -> Result<Bytes>

Get a range as bytes Read more
source§

impl<const N: usize> Clone for SegmentedBytes<N>

source§

fn clone(&self) -> SegmentedBytes<N>

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<const N: usize> Debug for SegmentedBytes<N>

source§

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

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

impl Default for SegmentedBytes

source§

fn default() -> Self

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

impl From<Bytes> for SegmentedBytes

source§

fn from(value: Bytes) -> Self

Converts to this type from the input type.
source§

impl From<MaybeLgBytes> for SegmentedBytes

source§

fn from(value: MaybeLgBytes) -> Self

Converts to this type from the input type.
source§

impl From<Vec<MaybeLgBytes>> for SegmentedBytes

source§

fn from(value: Vec<MaybeLgBytes>) -> Self

Converts to this type from the input type.
source§

impl From<Vec<u8>> for SegmentedBytes

source§

fn from(value: Vec<u8>) -> Self

Converts to this type from the input type.
source§

impl<const N: usize> FromIterator<Bytes> for SegmentedBytes<N>

source§

fn from_iter<T: IntoIterator<Item = Bytes>>(iter: T) -> Self

Creates a value from an iterator. Read more
source§

impl<const N: usize> FromIterator<Vec<u8>> for SegmentedBytes<N>

source§

fn from_iter<T: IntoIterator<Item = Vec<u8>>>(iter: T) -> Self

Creates a value from an iterator. Read more
source§

impl Length for SegmentedBytes

source§

fn len(&self) -> u64

Returns the amount of bytes of the inner source.
source§

impl<const N: usize> PartialEq for SegmentedBytes<N>

source§

fn eq(&self, other: &SegmentedBytes<N>) -> 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<const N: usize> Eq for SegmentedBytes<N>

source§

impl<const N: usize> StructuralPartialEq for SegmentedBytes<N>

Auto Trait Implementations§

§

impl<const N: usize = 1> !Freeze for SegmentedBytes<N>

§

impl<const N: usize> RefUnwindSafe for SegmentedBytes<N>

§

impl<const N: usize> Send for SegmentedBytes<N>

§

impl<const N: usize> Sync for SegmentedBytes<N>

§

impl<const N: usize> Unpin for SegmentedBytes<N>

§

impl<const N: usize> UnwindSafe for SegmentedBytes<N>

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, U> CastInto<U> for T
where U: CastFrom<T>,

source§

fn cast_into(self) -> U

Performs the cast.
source§

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

source§

default 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<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

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

source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> FutureExt for T

source§

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

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

fn with_current_context(self) -> WithContext<Self>

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

impl<T> Instrument for T

source§

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

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

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> IntoRequest<T> for T

source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
source§

impl<T> Pointable for T

source§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
source§

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

Initializes a with the given initializer. Read more
source§

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

Dereferences the given pointer. Read more
source§

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

Mutably dereferences the given pointer. Read more
source§

unsafe fn drop(ptr: usize)

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

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where 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 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<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,