Struct CharCircle

Source
pub struct CharCircle { /* private fields */ }
Expand description

A circular buffer of characters.

The reallocation policy of std::collections::VecDeque makes it a poor choice as a circular buffer for modifying strings in place. It reallocates early (!) and when it does, it places its contents in such a way that requires shuffling to convert it back into a string in the common case. This circular buffer provides a better alternative.

This circular buffer will not allocate early and is optimized for the case when you read exactly the contents that were in the initial buffer. In that case, the read head is guaranteed to be at index 0 of the underlying buffer, making the conversion into a string trivial.

Additionally, this circular buffer provides a char oriented interface, but uses UTF-8 internally, allowing it to operate directly on Strings.

Implementations§

Source§

impl CharCircle

Source

pub fn new(s: String) -> CharCircle

Construct a new CharCircle using a string as the initial buffer.

Source

pub fn empty() -> CharCircle

Construct a new, empty CharCircle.

Source

pub fn len(&self) -> usize

The number of UTF-8 bytes in the buffer.

Source

pub fn n_chars(&self) -> usize

The number of characters in the buffer.

Source

pub fn capacity(&self) -> usize

The number of bytes the buffer can hold before reallocating.

This refers to the length of the backing vector. That vector may have additional capacity allocated to it that is not reported by this method.

Source

pub fn read_char(&self) -> Option<char>

Read the next character in the buffer.

Source

pub fn read(&self, buf: &mut [u8]) -> Result<usize>

Read bytes from this circle into a buffer.

This method will only ever read complete UTF-8 characters. It returns the number of bytes read; it never returns an error.

This is the implementation of std::io::Read for CharCircle.

Source

pub fn read_str<'a>(&self, buf: &'a mut [u8]) -> &'a str

Read bytes from this circle into a buffer.

This method is equivalent to RawCircle::read except the return value is the buffer cast to a &str.

Source

pub fn write_char(&self, ch: char)

Write a character into the buffer.

Source

pub fn write(&mut self, buf: &[u8]) -> Result<usize>

Read bytes from a string into this buffer;

This method will only ever write complete UTF-8 characters. It returns the number of bytes written. This method returns an error if the input is not valid UTF-8.

This is the implementation of std::io::Write for CharCircle.

Source

pub fn write_str(&self, buf: &str) -> usize

Read bytes from a string into this buffer;

This method is equivalent to CharCircle::write except that it cannot return an error because the input is valid UTF-8.

Source

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

Unpack this circular buffer into a byte vector.

Source

pub fn into_string(self) -> String

Unpack this circular buffer into a string.

Source

pub fn take_chars(&self, n: usize) -> Chars<'_>

Read characters from the buffer with an iterator.

The returned iterator will read at most n characters and ensures that it has been exhausted upon drop.

Calling next on the iterator is equivalent to calling read_char on this buffer.

Source

pub fn take_current_chars(&self) -> Chars<'_>

Read the current characters from the buffer with an iterator.

The returned iterator will read at most n characters, where n is the number of characters currently in the buffer, and ensures that it has been exhausted upon drop.

Calling next on the iterator is equivalent to calling read_char on this buffer.

This is equivalent to calling CharCircle::take_chars with the current number of characters in the buffer. In particular, interleaving calls to read_char and write_char on the buffer with calls to next on the iterator may cause the iterator to consume characters that were not in the buffer at the time it was created.

Trait Implementations§

Source§

impl Clone for CharCircle

Source§

fn clone(&self) -> CharCircle

Returns a duplicate 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 Debug for CharCircle

Source§

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

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

impl Default for CharCircle

Source§

fn default() -> CharCircle

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

impl From<CharCircle> for String

Source§

fn from(c: CharCircle) -> String

Converts to this type from the input type.
Source§

impl From<CharCircle> for Vec<u8>

Source§

fn from(c: CharCircle) -> Vec<u8>

Converts to this type from the input type.
Source§

impl From<String> for CharCircle

Source§

fn from(s: String) -> CharCircle

Converts to this type from the input type.
Source§

impl Read for CharCircle

Source§

fn read(&mut self, buf: &mut [u8]) -> Result<usize>

Pull some bytes from this source into the specified buffer, returning how many bytes were read. Read more
1.36.0 · Source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
Source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored implementation. Read more
1.0.0 · Source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Reads all bytes until EOF in this source, placing them into buf. Read more
1.0.0 · Source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Reads all bytes until EOF in this source, appending them to buf. Read more
1.6.0 · Source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Reads the exact number of bytes required to fill buf. Read more
Source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
Source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Reads the exact number of bytes required to fill cursor. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · Source§

fn bytes(self) -> Bytes<Self>
where Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · Source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where R: Read, Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · Source§

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

Creates an adapter which will read at most limit bytes from it. Read more
Source§

impl Write for CharCircle

Source§

fn write(&mut self, buf: &[u8]) -> Result<usize>

Writes a buffer into this writer, returning how many bytes were written. Read more
Source§

fn flush(&mut self) -> Result<()>

Flushes this output stream, ensuring that all intermediately buffered contents reach their destination. Read more
1.36.0 · Source§

fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize, Error>

Like write, except that it writes from a slice of buffers. Read more
Source§

fn is_write_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Writer has an efficient write_vectored implementation. Read more
1.0.0 · Source§

fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>

Attempts to write an entire buffer into this writer. Read more
Source§

fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>

🔬This is a nightly-only experimental API. (write_all_vectored)
Attempts to write multiple buffers into this writer. Read more
1.0.0 · Source§

fn write_fmt(&mut self, args: Arguments<'_>) -> Result<(), Error>

Writes a formatted string into this writer, returning any error encountered. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adapter for this instance of Write. Read more

Auto Trait Implementations§

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.