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
impl CharCircle
Sourcepub fn new(s: String) -> CharCircle ⓘ
pub fn new(s: String) -> CharCircle ⓘ
Construct a new CharCircle using a string as the initial buffer.
Sourcepub fn empty() -> CharCircle ⓘ
pub fn empty() -> CharCircle ⓘ
Construct a new, empty CharCircle.
Sourcepub fn capacity(&self) -> usize
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.
Sourcepub fn read(&self, buf: &mut [u8]) -> Result<usize>
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.
Sourcepub fn read_str<'a>(&self, buf: &'a mut [u8]) -> &'a str
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.
Sourcepub fn write_char(&self, ch: char)
pub fn write_char(&self, ch: char)
Write a character into the buffer.
Sourcepub fn write(&mut self, buf: &[u8]) -> Result<usize>
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.
Sourcepub fn write_str(&self, buf: &str) -> usize
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.
Sourcepub fn into_string(self) -> String
pub fn into_string(self) -> String
Unpack this circular buffer into a string.
Sourcepub fn take_chars(&self, n: usize) -> Chars<'_> ⓘ
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.
Sourcepub fn take_current_chars(&self) -> Chars<'_> ⓘ
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
impl Clone for CharCircle
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for CharCircle
impl Debug for CharCircle
Source§impl Default for CharCircle
impl Default for CharCircle
Source§impl From<CharCircle> for String
impl From<CharCircle> for String
Source§fn from(c: CharCircle) -> String
fn from(c: CharCircle) -> String
Source§impl From<String> for CharCircle
impl From<String> for CharCircle
Source§impl Read for CharCircle
impl Read for CharCircle
Source§fn read(&mut self, buf: &mut [u8]) -> Result<usize>
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
1.36.0 · Source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
read, except that it reads into a slice of buffers. Read moreSource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
can_vector)1.0.0 · Source§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>
buf. Read more1.0.0 · Source§fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
buf. Read more1.6.0 · Source§fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
buf. Read moreSource§fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)Source§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)cursor. Read more1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Read. Read moreSource§impl Write for CharCircle
impl Write for CharCircle
Source§fn write(&mut self, buf: &[u8]) -> Result<usize>
fn write(&mut self, buf: &[u8]) -> Result<usize>
Source§fn flush(&mut self) -> Result<()>
fn flush(&mut self) -> Result<()>
Source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
can_vector)1.0.0 · Source§fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
Source§fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
write_all_vectored)