Skip to main content

Buffer

Struct Buffer 

Source
pub struct Buffer<T>
where T: Copy + Default,
{ /* private fields */ }
Expand description

Low-level contiguous storage with a readable window and spare tail capacity.

Buffer stores initialized values and tracks a readable window as data[position..limit]. Values before position are considered consumed, and values after limit are spare capacity that callers may fill before advancing the limit.

This type is intentionally a low-level, hot-path API. It exposes the full backing storage through Self::data and Self::data_mut so higher-level buffering code can avoid repeated slicing and bounds checks. Callers that mutate the backing storage directly must preserve the position <= limit <= capacity invariant and must only make initialized spare elements readable by calling Self::advance or Self::advance_unchecked.

The unchecked methods are for code that has already validated ranges at a higher level. They keep debug assertions for development builds, but safe callers should use Self::consume, Self::advance, and checked slice operations instead.

§Window model

  • data[..position] contains consumed elements.
  • data[position..limit] contains readable elements.
  • data[limit..capacity] is spare initialized storage.

§Examples

use qubit_io::Buffer;

let mut buffer = Buffer::<u8>::with_capacity(4);
buffer.data_mut()[0..2].copy_from_slice(b"ab");
buffer.advance(2);

assert_eq!(b"ab", &buffer.data()[buffer.position()..buffer.limit()]);
buffer.consume(1);
assert_eq!(b"b", &buffer.data()[buffer.position()..buffer.limit()]);

Implementations§

Source§

impl<T> Buffer<T>
where T: Copy + Default,

Source

pub fn with_capacity(capacity: usize) -> Self

Creates an empty buffer with at least the requested capacity.

A requested capacity of 0 is raised to 1.

§Parameters
  • capacity - Requested element capacity.
§Returns

A buffer with position == 0 and limit == 0.

Source

pub fn capacity(&self) -> usize

Returns the total element capacity.

§Returns

The length of the backing storage.

Source

pub const fn position(&self) -> usize

Returns the current readable cursor.

§Returns

The start index of the readable window.

Source

pub const fn limit(&self) -> usize

Returns the current readable limit.

§Returns

The exclusive end index of the readable window.

Source

pub fn data(&self) -> &[T]

Returns the backing storage.

§Returns

The full initialized backing slice.

Source

pub fn data_mut(&mut self) -> &mut [T]

Returns the mutable backing storage.

Mutating elements outside the current readable or spare operation may invalidate higher-level assumptions about buffered contents.

§Returns

The full initialized backing slice.

Source

pub const fn available(&self) -> usize

Returns the number of readable elements.

§Returns

The length of data[position..limit].

Source

pub fn spare_capacity(&self) -> usize

Returns the number of spare elements after the limit.

§Returns

The length of data[limit..].

Source

pub const fn is_empty(&self) -> bool

Returns whether the readable window is empty.

§Returns

true when no elements are available for consumption.

Source

pub fn is_full(&self) -> bool

Returns whether the spare tail is empty.

§Returns

true when limit == capacity.

Source

pub fn clear(&mut self)

Clears all buffered contents.

This resets both cursors to zero without modifying stored values.

Source

pub fn consume(&mut self, count: usize)

Advances the readable cursor by count elements.

§Parameters
  • count - Number of readable elements to consume.
§Panics

Panics when count exceeds Self::available.

Source

pub unsafe fn consume_unchecked(&mut self, count: usize)

Advances the readable cursor without checking bounds.

§Parameters
  • count - Number of readable elements to consume.
§Safety

The caller must guarantee that count <= self.available().

Source

pub fn advance(&mut self, count: usize)

Advances the readable limit by count elements.

§Parameters
  • count - Number of initialized spare elements to make readable.
§Panics

Panics when count exceeds Self::spare_capacity.

Source

pub unsafe fn advance_unchecked(&mut self, count: usize)

Advances the readable limit without checking bounds.

§Parameters
  • count - Number of initialized spare elements to make readable.
§Safety

The caller must guarantee that count <= self.spare_capacity().

Source

pub fn compact(&mut self)

Moves unread elements to the front of the backing storage.

Consumed elements are discarded. The unread element count is preserved, and the readable window starts at zero after compaction.

Source

pub unsafe fn copy_from_unchecked( &mut self, input: &[T], input_index: usize, count: usize, )

Copies values from an external slice into the spare tail.

The copied values are made readable by advancing the limit by count.

§Parameters
  • input - Source storage.
  • input_index - Start index inside input.
  • count - Number of values to copy.
§Safety

The caller must guarantee that input_index..input_index + count is a valid range inside input, that the addition does not overflow, that count <= self.spare_capacity(), and that the source range does not overlap with this buffer’s destination range.

Source

pub unsafe fn copy_to_unchecked( &mut self, output: &mut [T], output_index: usize, count: usize, )

Copies readable values into an external slice.

The copied values are consumed by advancing the position by count.

§Parameters
  • output - Destination storage.
  • output_index - Start index inside output.
  • count - Number of values to copy.
§Safety

The caller must guarantee that output_index..output_index + count is a valid range inside output, that the addition does not overflow, that count <= self.available(), and that the source range does not overlap with the destination range.

Trait Implementations§

Source§

impl<T> Clone for Buffer<T>
where T: Copy + Default + Clone,

Source§

fn clone(&self) -> Buffer<T>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T> Debug for Buffer<T>
where T: Copy + Default + Debug,

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<T> Freeze for Buffer<T>

§

impl<T> RefUnwindSafe for Buffer<T>
where T: RefUnwindSafe,

§

impl<T> Send for Buffer<T>
where T: Send,

§

impl<T> Sync for Buffer<T>
where T: Sync,

§

impl<T> Unpin for Buffer<T>
where T: Unpin,

§

impl<T> UnsafeUnpin for Buffer<T>

§

impl<T> UnwindSafe for Buffer<T>
where T: UnwindSafe,

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
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> ToOwned for T
where T: Clone,

Source§

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>,

Source§

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>,

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.