pub struct SegmentedBuffer { /* private fields */ }Expand description
A segmented buffer optimized for zero-copy operations.
This buffer holds multiple Bytes segments and provides efficient
extraction without unnecessary copies. When data is requested and
fits within a single segment, it can be returned with zero copies
(just a refcount increment on the underlying Bytes).
§Use Cases
- Protocol decoders reading frames from streaming data
- Minimizing memcpy overhead for small messages (< 8KB)
- Preserving arena-allocated buffer segments through the pipeline
§Tradeoffs
- Fast path: Single-segment extraction is O(1) with no copy
- Slow path: Multi-segment extraction requires copying into contiguous buffer
- For large messages spanning many reads, the copy cost is unavoidable
Implementations§
Source§impl SegmentedBuffer
impl SegmentedBuffer
pub const fn new() -> Self
pub const fn len(&self) -> usize
pub const fn is_empty(&self) -> bool
pub fn push(&mut self, bytes: Bytes)
Sourcepub fn copy_prefix(&self, n: usize, dst: &mut [u8]) -> bool
pub fn copy_prefix(&self, n: usize, dst: &mut [u8]) -> bool
Copy the first n bytes into dst.
Returns false if fewer than n bytes are available.
Sourcepub fn take_bytes(&mut self, n: usize) -> Option<Bytes>
pub fn take_bytes(&mut self, n: usize) -> Option<Bytes>
Take exactly n bytes from the front of the queue.
If the first segment contains all n bytes, this is zero-copy.
If the bytes span multiple segments, this copies into a contiguous buffer.
Trait Implementations§
Source§impl Debug for SegmentedBuffer
impl Debug for SegmentedBuffer
Source§impl Default for SegmentedBuffer
impl Default for SegmentedBuffer
Source§fn default() -> SegmentedBuffer
fn default() -> SegmentedBuffer
Returns the “default value” for a type. Read more
Auto Trait Implementations§
impl Freeze for SegmentedBuffer
impl RefUnwindSafe for SegmentedBuffer
impl Send for SegmentedBuffer
impl Sync for SegmentedBuffer
impl Unpin for SegmentedBuffer
impl UnsafeUnpin for SegmentedBuffer
impl UnwindSafe for SegmentedBuffer
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
Mutably borrows from an owned value. Read more
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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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