Buffer

Struct Buffer 

Source
pub struct Buffer<'buf, R: Read> {
    pub buf: &'buf mut [u8],
    pub n_bytes: usize,
    pub n_shifted_out: usize,
    pub pos_shifted: LinePosition,
    /* private fields */
}
Expand description

A buffer for reading JSON data. Is a private struct, the “pub” is only for testing.

Fields§

§buf: &'buf mut [u8]

The working buffer for reading JSON data.

§n_bytes: usize

Number of valid bytes in the buffer. Contract: n_bytes <= buf.len()

§n_shifted_out: usize

Number of bytes that have been shifted out of the buffer.

§pos_shifted: LinePosition

Line position correction due to shifting operations.

Implementations§

Source§

impl<'buf, R: Read> Buffer<'buf, R>

Source

pub fn new(reader: &'buf mut R, buf: &'buf mut [u8]) -> Self

Creates a new buffer with the given reader and buffer.

Source

pub fn read_more(&mut self) -> RJiterResult<usize>

Read from the underlying reader into the buffer.

Returns the number of bytes read.

§Errors

From the underlying reader.

Source

pub fn shift_buffer(&mut self, to_pos: usize, from_pos: usize)

Shift the buffer to the left, and update the index and line-column position.

§Arguments
  • to_pos: The position to shift to. Usually is 0 or is 1 for strings.
  • from_pos: The position to shift from. The case of outside the buffer is handled.
Source

pub fn skip_spaces(&mut self, pos: usize) -> RJiterResult<()>

Skip over any ASCII whitespace characters starting at the given position. Read-shift-read-shift-read-shift… until non-whitespace is found or EOF is reached.

§Arguments
  • pos - The position in the buffer to start skipping from
§Errors

From the underlying reader.

Source

pub fn collect_while<F>( &mut self, predicate: F, start_pos: usize, allow_shift: bool, ) -> RJiterResult<(usize, usize)>
where F: Fn(u8) -> bool,

Collect bytes while a predicate is true, starting at the given position. Returns a tuple of (start_position, end_position) where end_position is the offset of the first rejected byte, or EOF. If buffer is full with all accepted bytes, it’s an error. The function can optionally shift the buffer once to discard bytes before start_pos.

§Arguments
  • predicate - A function that returns true if the byte should be accepted
  • start_pos - The position in the buffer to start collecting from
  • allow_shift - If true, allows shifting the buffer once when it fills up (discards bytes before start_pos)
§Errors

Returns ErrorType::BufferFull if the buffer fills up with all accepted bytes. Also returns errors from the underlying reader.

Source

pub fn collect_count( &mut self, count: usize, start_pos: usize, allow_shift: bool, ) -> RJiterResult<(usize, usize)>

Collect exactly count bytes starting at the given position, or until EOF. Returns a tuple of (start_position, end_position) where end_position is the offset after the collected bytes (start_pos + actual_collected). If buffer is too small to hold the requested bytes, it’s an error. The function can optionally shift the buffer once to discard bytes before start_pos.

§Arguments
  • count - The number of bytes to collect
  • start_pos - The position in the buffer to start collecting from
  • allow_shift - If true, allows shifting the buffer once when it fills up (discards bytes before start_pos)
§Errors

Returns ErrorType::BufferFull if the buffer is too small to hold the requested bytes. Also returns errors from the underlying reader.

Source

pub fn skip_n( &mut self, count: usize, start_pos: usize, ) -> RJiterResult<(usize, usize)>

Skip exactly count bytes starting at the given position, or until EOF. Returns the new position in the buffer after skipping.

This function works incrementally and can skip any number of bytes regardless of buffer size. It repeatedly shifts and reads as needed when the buffer is too small. When bytes fit in the buffer, it just returns the new position without shifting.

§Arguments
  • count - The number of bytes to skip
  • start_pos - The position in the buffer to start skipping from
§Errors

Returns errors from the underlying reader.

Trait Implementations§

Source§

impl<R: Read> Debug for Buffer<'_, R>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'buf, R> Freeze for Buffer<'buf, R>

§

impl<'buf, R> RefUnwindSafe for Buffer<'buf, R>
where R: RefUnwindSafe,

§

impl<'buf, R> Send for Buffer<'buf, R>
where R: Send,

§

impl<'buf, R> Sync for Buffer<'buf, R>
where R: Sync,

§

impl<'buf, R> Unpin for Buffer<'buf, R>

§

impl<'buf, R> !UnwindSafe for Buffer<'buf, R>

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

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. 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> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. 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.