Struct mz_ore::bytes::SegmentedBytes
source · pub struct SegmentedBytes<const N: usize = 1> {
segments: SmallVec<[(MaybeLgBytes, usize); N]>,
len: usize,
}
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
impl SegmentedBytes
sourcepub fn new<const N: usize>() -> SegmentedBytes<N>
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>
impl<const N: usize> SegmentedBytes<N>
sourcepub fn with_capacity(capacity: usize) -> SegmentedBytes<N>
pub fn with_capacity(capacity: usize) -> SegmentedBytes<N>
Creates a new empty SegmentedBytes
with space for capacity
segments.
sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Returns the number of bytes contained in this SegmentedBytes
.
sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns if this SegmentedBytes
is empty.
sourcepub fn into_segments(self) -> impl Iterator<Item = MaybeLgBytes>
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.
sourcepub fn into_contiguous(self) -> Vec<u8> ⓘ
pub fn into_contiguous(self) -> Vec<u8> ⓘ
Copies all of the bytes from self
returning one contiguous blob.
sourcepub fn push<B: Into<MaybeLgBytes>>(&mut self, b: B)
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.
sourcepub fn reader(self) -> SegmentedReader<N> ⓘ
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>
impl<const N: usize> Buf for SegmentedBytes<N>
source§fn remaining(&self) -> usize
fn remaining(&self) -> usize
source§fn chunk(&self) -> &[u8] ⓘ
fn chunk(&self) -> &[u8] ⓘ
Buf::remaining()
. Note that this can return shorter slice (this allows
non-continuous internal representation). Read moresource§fn chunks_vectored<'a>(&'a self, dst: &mut [IoSlice<'a>]) -> usize
fn chunks_vectored<'a>(&'a self, dst: &mut [IoSlice<'a>]) -> usize
source§fn has_remaining(&self) -> bool
fn has_remaining(&self) -> bool
source§fn copy_to_slice(&mut self, dst: &mut [u8])
fn copy_to_slice(&mut self, dst: &mut [u8])
source§fn get_u16(&mut self) -> u16
fn get_u16(&mut self) -> u16
self
in big-endian byte order. Read moresource§fn get_u16_le(&mut self) -> u16
fn get_u16_le(&mut self) -> u16
self
in little-endian byte order. Read moresource§fn get_u16_ne(&mut self) -> u16
fn get_u16_ne(&mut self) -> u16
self
in native-endian byte order. Read moresource§fn get_i16(&mut self) -> i16
fn get_i16(&mut self) -> i16
self
in big-endian byte order. Read moresource§fn get_i16_le(&mut self) -> i16
fn get_i16_le(&mut self) -> i16
self
in little-endian byte order. Read moresource§fn get_i16_ne(&mut self) -> i16
fn get_i16_ne(&mut self) -> i16
self
in native-endian byte order. Read moresource§fn get_u32(&mut self) -> u32
fn get_u32(&mut self) -> u32
self
in the big-endian byte order. Read moresource§fn get_u32_le(&mut self) -> u32
fn get_u32_le(&mut self) -> u32
self
in the little-endian byte order. Read moresource§fn get_u32_ne(&mut self) -> u32
fn get_u32_ne(&mut self) -> u32
self
in native-endian byte order. Read moresource§fn get_i32(&mut self) -> i32
fn get_i32(&mut self) -> i32
self
in big-endian byte order. Read moresource§fn get_i32_le(&mut self) -> i32
fn get_i32_le(&mut self) -> i32
self
in little-endian byte order. Read moresource§fn get_i32_ne(&mut self) -> i32
fn get_i32_ne(&mut self) -> i32
self
in native-endian byte order. Read moresource§fn get_u64(&mut self) -> u64
fn get_u64(&mut self) -> u64
self
in big-endian byte order. Read moresource§fn get_u64_le(&mut self) -> u64
fn get_u64_le(&mut self) -> u64
self
in little-endian byte order. Read moresource§fn get_u64_ne(&mut self) -> u64
fn get_u64_ne(&mut self) -> u64
self
in native-endian byte order. Read moresource§fn get_i64(&mut self) -> i64
fn get_i64(&mut self) -> i64
self
in big-endian byte order. Read moresource§fn get_i64_le(&mut self) -> i64
fn get_i64_le(&mut self) -> i64
self
in little-endian byte order. Read moresource§fn get_i64_ne(&mut self) -> i64
fn get_i64_ne(&mut self) -> i64
self
in native-endian byte order. Read moresource§fn get_u128(&mut self) -> u128
fn get_u128(&mut self) -> u128
self
in big-endian byte order. Read moresource§fn get_u128_le(&mut self) -> u128
fn get_u128_le(&mut self) -> u128
self
in little-endian byte order. Read moresource§fn get_u128_ne(&mut self) -> u128
fn get_u128_ne(&mut self) -> u128
self
in native-endian byte order. Read moresource§fn get_i128(&mut self) -> i128
fn get_i128(&mut self) -> i128
self
in big-endian byte order. Read moresource§fn get_i128_le(&mut self) -> i128
fn get_i128_le(&mut self) -> i128
self
in little-endian byte order. Read moresource§fn get_i128_ne(&mut self) -> i128
fn get_i128_ne(&mut self) -> i128
self
in native-endian byte order. Read moresource§fn get_uint(&mut self, nbytes: usize) -> u64
fn get_uint(&mut self, nbytes: usize) -> u64
self
in big-endian byte order. Read moresource§fn get_uint_le(&mut self, nbytes: usize) -> u64
fn get_uint_le(&mut self, nbytes: usize) -> u64
self
in little-endian byte order. Read moresource§fn get_uint_ne(&mut self, nbytes: usize) -> u64
fn get_uint_ne(&mut self, nbytes: usize) -> u64
self
in native-endian byte order. Read moresource§fn get_int(&mut self, nbytes: usize) -> i64
fn get_int(&mut self, nbytes: usize) -> i64
self
in big-endian byte order. Read moresource§fn get_int_le(&mut self, nbytes: usize) -> i64
fn get_int_le(&mut self, nbytes: usize) -> i64
self
in little-endian byte order. Read moresource§fn get_int_ne(&mut self, nbytes: usize) -> i64
fn get_int_ne(&mut self, nbytes: usize) -> i64
self
in native-endian byte order. Read moresource§fn get_f32(&mut self) -> f32
fn get_f32(&mut self) -> f32
self
in big-endian byte order. Read moresource§fn get_f32_le(&mut self) -> f32
fn get_f32_le(&mut self) -> f32
self
in little-endian byte order. Read moresource§fn get_f32_ne(&mut self) -> f32
fn get_f32_ne(&mut self) -> f32
self
in native-endian byte order. Read moresource§fn get_f64(&mut self) -> f64
fn get_f64(&mut self) -> f64
self
in big-endian byte order. Read moresource§fn get_f64_le(&mut self) -> f64
fn get_f64_le(&mut self) -> f64
self
in little-endian byte order. Read moresource§fn get_f64_ne(&mut self) -> f64
fn get_f64_ne(&mut self) -> f64
self
in native-endian byte order. Read moresource§fn copy_to_bytes(&mut self, len: usize) -> Bytes
fn copy_to_bytes(&mut self, len: usize) -> Bytes
source§impl ChunkReader for SegmentedBytes
impl ChunkReader for SegmentedBytes
source§impl<const N: usize> Clone for SegmentedBytes<N>
impl<const N: usize> Clone for SegmentedBytes<N>
source§fn clone(&self) -> SegmentedBytes<N>
fn clone(&self) -> SegmentedBytes<N>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<const N: usize> Debug for SegmentedBytes<N>
impl<const N: usize> Debug for SegmentedBytes<N>
source§impl Default for SegmentedBytes
impl Default for SegmentedBytes
source§impl From<Bytes> for SegmentedBytes
impl From<Bytes> for SegmentedBytes
source§impl From<MaybeLgBytes> for SegmentedBytes
impl From<MaybeLgBytes> for SegmentedBytes
source§fn from(value: MaybeLgBytes) -> Self
fn from(value: MaybeLgBytes) -> Self
source§impl From<Vec<MaybeLgBytes>> for SegmentedBytes
impl From<Vec<MaybeLgBytes>> for SegmentedBytes
source§fn from(value: Vec<MaybeLgBytes>) -> Self
fn from(value: Vec<MaybeLgBytes>) -> Self
source§impl<const N: usize> FromIterator<Bytes> for SegmentedBytes<N>
impl<const N: usize> FromIterator<Bytes> for SegmentedBytes<N>
source§impl<const N: usize> FromIterator<Vec<u8>> for SegmentedBytes<N>
impl<const N: usize> FromIterator<Vec<u8>> for SegmentedBytes<N>
source§impl Length for SegmentedBytes
impl Length for SegmentedBytes
source§impl<const N: usize> PartialEq for SegmentedBytes<N>
impl<const N: usize> PartialEq for SegmentedBytes<N>
impl<const N: usize> Eq for SegmentedBytes<N>
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<T> FutureExt for T
impl<T> FutureExt for T
source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request