Struct RopeSlice
pub struct RopeSlice<'a>(/* private fields */);Expand description
An immutable view into part of a Rope.
RopeSlice is to Rope what &str is to String: RopeSlices only know
about the text within their range, all indexing is relative to their range,
all iterators are truncated their range, etc. Nothing should be too
surprising here.
§A Warning About From<&str>
RopeSlice implements From<&str>, allowing you to create RopeSlices
directly from string slices without an intermediate Rope. However, such
RopeSlices are not normal RopeSlices. They are just a thin wrapper
over the &str they were created from, and unlike normal RopeSlices have
no underlying rope data structure to rely on.
The most important implication of this is that most operations that are
documented as running in O(log N) actually run in O(N) for such slices.
For short strings (this feature’s intended use case) this doesn’t matter.
However, for long strings this can have significant negative performance
impacts.
Implementations§
§impl<'a> RopeSlice<'a>
impl<'a> RopeSlice<'a>
pub fn slice<R>(&self, byte_range: R) -> RopeSlice<'a>where
R: RangeBounds<usize>,
pub fn slice<R>(&self, byte_range: R) -> RopeSlice<'a>where
R: RangeBounds<usize>,
Gets an immutable slice of the RopeSlice.
Uses range syntax, e.g. 2..7, 2.., etc.
Runs in O(log N) time.
§Panics
- If the start of the range is greater than the end.
- If the end of the range is out of bounds (i.e.
end > len()). - If the range ends are not on char boundaries.
pub fn len_lines(&self, line_type: LineType) -> usize
pub fn len_lines(&self, line_type: LineType) -> usize
Total number of lines in the text, according to the passed line type.
Runs in best case O(1) time, worst-case O(log N).
pub fn is_char_boundary(&self, byte_idx: usize) -> bool
pub fn is_char_boundary(&self, byte_idx: usize) -> bool
Returns whether byte_idx is a char boundary.
Runs in O(log N) time.
§Panics
Panics if byte_idx is out of bounds (i.e. byte_idx > len()).
pub fn floor_char_boundary(&self, byte_idx: usize) -> usize
pub fn floor_char_boundary(&self, byte_idx: usize) -> usize
Returns the byte index of the closest char boundary less than or
equal to byte_idx.
Runs in O(log N) time.
§Panics
Panics if byte_idx is out of bounds (i.e. byte_idx > len()).
pub fn ceil_char_boundary(&self, byte_idx: usize) -> usize
pub fn ceil_char_boundary(&self, byte_idx: usize) -> usize
Returns the byte index of the closest char boundary greater than or
equal to byte_idx.
Runs in O(log N) time.
§Panics
Panics if byte_idx is out of bounds (i.e. byte_idx > len()).
pub fn trailing_line_break_idx(&self, line_type: LineType) -> Option<usize>
pub fn trailing_line_break_idx(&self, line_type: LineType) -> Option<usize>
If the text ends with a line break, returns its byte index.
Otherwise returns None.
Note: a CRLF pair is always treated as a single unit, and thus
this function will return the index of the CR in such cases, even
with LineType::LF where CR is not on its own recognized as a line
break.
Runs in O(log N) time.
pub fn byte(&self, byte_idx: usize) -> u8
pub fn byte(&self, byte_idx: usize) -> u8
Returns the byte at byte_idx.
Runs in O(log N) time.
§Panics
Panics if byte_idx is out of bounds (i.e. byte_idx >= len()).
pub fn char(&self, byte_idx: usize) -> char
pub fn char(&self, byte_idx: usize) -> char
Returns the char at byte_idx.
Note that this takes a byte index, not a char index.
Runs in O(log N) time.
§Panics
- If
byte_idxis out of bounds (i.e.byte_idx >= len()). - If
byte_idxis not a char boundary.
pub fn line(&self, line_idx: usize, line_type: LineType) -> RopeSlice<'a>
pub fn line(&self, line_idx: usize, line_type: LineType) -> RopeSlice<'a>
Returns the line at line_idx, according to the given line type.
Note: lines are zero-indexed.
Runs in O(log N) time.
§Panics
Panics if line_idx is out of bounds (i.e. line_idx >= len_lines()).
pub fn chunk(&self, byte_idx: usize) -> (&'a str, usize)
pub fn chunk(&self, byte_idx: usize) -> (&'a str, usize)
Returns the chunk containing the byte at byte_idx.
Also returns the byte index of the beginning of the chunk.
Note: for convenience, a one-past-the-end byte_idx returns the last
chunk of the RopeSlice.
Runs in O(log N) time.
§Panics
Panics if byte_idx is out of bounds (i.e. byte_idx > len()).
pub fn byte_to_line_idx(&self, byte_idx: usize, line_type: LineType) -> usize
pub fn byte_to_line_idx(&self, byte_idx: usize, line_type: LineType) -> usize
Returns the line index of the line that the given byte belongs to.
Notes:
- Counts lines according to the passed line type.
- Lines are zero-indexed. Therefore this is functionally equivalent to counting the line breaks before the specified byte.
byte_idxcan be one-past-the-end, which will return the last line index.
Runs in O(log N) time.
§Panics
Panics if byte_idx is out of bounds (i.e. byte_idx > len()).
pub fn line_to_byte_idx(&self, line_idx: usize, line_type: LineType) -> usize
pub fn line_to_byte_idx(&self, line_idx: usize, line_type: LineType) -> usize
Returns the byte index of the start of the given line.
Notes:
- Counts lines according to the passed line type.
- Lines are zero-indexed.
line_idxcan be one-past-the-end, which will return one-past-the-end byte index.
Runs in O(log N) time.
§Panics
Panics if line_idx is out of bounds (i.e. line_idx > len_lines()).
pub fn bytes(&self) -> Bytes<'a> ⓘ
pub fn bytes(&self) -> Bytes<'a> ⓘ
Creates an iterator over the bytes of the Rope.
Runs in O(log N) time.
pub fn bytes_at(&self, byte_idx: usize) -> Bytes<'a> ⓘ
pub fn bytes_at(&self, byte_idx: usize) -> Bytes<'a> ⓘ
Creates an iterator over the bytes of the Rope, starting at byte
byte_idx.
If byte_idx == len() then an iterator at the end of the
Rope is created (i.e. next() will return None).
Runs in O(log N) time.
§Panics
Panics if byte_idx is out of bounds (i.e. byte_idx > len()).
pub fn chars(&self) -> Chars<'a> ⓘ
pub fn chars(&self) -> Chars<'a> ⓘ
Creates an iterator over the chars of the Rope.
Runs in O(log N) time.
pub fn chars_at(&self, byte_idx: usize) -> Chars<'a> ⓘ
pub fn chars_at(&self, byte_idx: usize) -> Chars<'a> ⓘ
Creates an iterator over the chars of the Rope, starting
at byte_idx.
Note that this takes a byte index, not a char index.
If byte_idx == len() then an iterator at the end of the
Rope is created (i.e. next() will return None).
Runs in O(log N) time.
§Panics
- If
byte_idxis out of bounds (i.e.byte_idx > len()). - If
byte_idxis not a char boundary.
pub fn char_indices(&self) -> CharIndices<'a> ⓘ
pub fn char_indices(&self) -> CharIndices<'a> ⓘ
pub fn char_indices_at(&self, byte_idx: usize) -> CharIndices<'a> ⓘ
pub fn char_indices_at(&self, byte_idx: usize) -> CharIndices<'a> ⓘ
Creates an iterator over the chars of the Rope and their byte
positions, starting at byte_idx.
Note that this takes a byte index, not a char index.
If byte_idx == len() then an iterator at the end of the Rope is
created (i.e. next() will return None).
On each call to next or
prev this iterator returns the byte index
where the returned character starts.
Runs in O(log N) time.
§Panics
- If
byte_idxis out of bounds (i.e.byte_idx > len()). - If
byte_idxis not a char boundary.
pub fn lines(&self, line_type: LineType) -> Lines<'a> ⓘ
pub fn lines(&self, line_type: LineType) -> Lines<'a> ⓘ
Creates an iterator over the lines of the Rope.
Note: the iterator will iterate over lines according to the passed line type.
Runs in O(log N) time.
pub fn lines_at(&self, line_idx: usize, line_type: LineType) -> Lines<'a> ⓘ
pub fn lines_at(&self, line_idx: usize, line_type: LineType) -> Lines<'a> ⓘ
Creates an iterator over the lines of the Rope, starting at line
line_idx.
Notes:
- The iterator will iterate over lines according to the passed line type.
- If
line_idx == len_lines()then an iterator at the end of theRopeis created (i.e.next()will returnNone).
Runs in O(log N) time.
§Panics
Panics if line_idx is out of bounds (i.e. line_idx > len_lines()).
pub fn chunks(&self) -> Chunks<'a> ⓘ
pub fn chunks(&self) -> Chunks<'a> ⓘ
Creates an iterator over the chunks of the Rope.
Runs in O(log N) time.
pub fn chunks_at(&self, byte_idx: usize) -> (Chunks<'a>, usize)
pub fn chunks_at(&self, byte_idx: usize) -> (Chunks<'a>, usize)
Creates an iterator over the chunks of the Rope, with the iterator
starting at the chunk containing byte_idx.
Also returns the byte index of the beginning of the chunk to be
yielded by next().
If byte_idx == len() an iterator at the end of the Rope
(yielding None on a call to next()) is created, and the returned
byte index is the end of the text.
Runs in O(log N) time.
§Panics
Panics if byte_idx is out of bounds (i.e. byte_idx > len()).
pub fn chunk_cursor(&self) -> ChunkCursor<'a>
pub fn chunk_cursor(&self) -> ChunkCursor<'a>
Creates a cursor for navigating the chunks of the text, starting on the first chunk.
Runs in O(log N) time.
pub fn chunk_cursor_at(&self, byte_idx: usize) -> ChunkCursor<'a>
pub fn chunk_cursor_at(&self, byte_idx: usize) -> ChunkCursor<'a>
Creates a cursor for navigating the chunks of the text, with the
cursor starting at the chunk containing byte_idx.
For convenience, byte_idx == len() is accepted, and puts the
cursor on the last chunk. Note that for non-zero-length texts this
is redundant with byte_idx == len() - 1.
Runs in O(log N) time.
§Panics
Panics if byte_idx is out of bounds (i.e. byte_idx > len()).
§impl<'a> RopeSlice<'a>
Non-panicking versions of some of RopeSlice’s methods.
impl<'a> RopeSlice<'a>
Non-panicking versions of some of RopeSlice’s methods.
pub fn try_slice<R>(&self, byte_range: R) -> Result<RopeSlice<'a>, Error>where
R: RangeBounds<usize>,
pub fn try_slice<R>(&self, byte_range: R) -> Result<RopeSlice<'a>, Error>where
R: RangeBounds<usize>,
Non-panicking version of slice().
On failure this returns the cause of the failure.
pub fn get_byte(&self, byte_idx: usize) -> Option<u8>
pub fn get_byte(&self, byte_idx: usize) -> Option<u8>
Non-panicking version of byte().
If byte_idx is out of bounds, returns None.
pub fn get_char(&self, byte_idx: usize) -> Result<char, Error>
pub fn get_char(&self, byte_idx: usize) -> Result<char, Error>
Non-panicking version of char().
Will fail if byte_idx is either:
- Not a char boundary.
- Out of bounds.
On failure returns the cause of failure.
Trait Implementations§
impl<'a> Copy for RopeSlice<'a>
§impl DisplayWidth for RopeSlice<'_>
impl DisplayWidth for RopeSlice<'_>
fn display_width(&self) -> usize
impl Eq for RopeSlice<'_>
§impl<'a> From<&'a str> for RopeSlice<'a>
Creates a RopeSlice directly from a string slice.
impl<'a> From<&'a str> for RopeSlice<'a>
Creates a RopeSlice directly from a string slice.
Warning: RopeSlices created this way aren’t normal RopeSlices:
- Most operations become
O(N)rather thanO(log N). disconnect_slice()may returnNone.
Runs in O(1) time.
Source§impl<'a> From<RopeSlice<'a>> for RegexCursorInput<'a>
impl<'a> From<RopeSlice<'a>> for RegexCursorInput<'a>
§impl Ord for RopeSlice<'_>
impl Ord for RopeSlice<'_>
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
1.21.0 (const: unstable) · Source§fn min(self, other: Self) -> Selfwhere
Self: Sized,
fn min(self, other: Self) -> Selfwhere
Self: Sized,
§impl PartialOrd<RopeSlice<'_>> for RopeSlice<'_>
impl PartialOrd<RopeSlice<'_>> for RopeSlice<'_>
Source§impl RopeExt for RopeSlice<'_>
impl RopeExt for RopeSlice<'_>
fn as_slice(&self) -> RopeSlice<'_>
Source§fn len_lines_unix(&self) -> usize
fn len_lines_unix(&self) -> usize
fn find_next_byte<R>(&self, byte_range: R, needles: &[u8]) -> Option<usize>
fn find_prev_byte<R>(&self, byte_range: R, needles: &[u8]) -> Option<usize>
fn get_grapheme(&self, byte_index: usize) -> Option<RopeSlice<'_>>
fn grapheme(&self, byte_index: usize) -> RopeSlice<'_>
fn graphemes(&self) -> Graphemes<'_> ⓘ
fn is_grapheme_boundary(&self, byte_offset: usize) -> bool
fn is_grapheme_start(&self, byte_index: usize) -> bool
fn snap_to_grapheme_start(&self, byte_index: usize) -> Option<usize>
fn last_grapheme_start(&self) -> Option<usize>
fn prev_grapheme_boundary(&self, byte_offset: usize) -> Option<usize>
fn next_grapheme_boundary(&self, byte_offset: usize) -> Option<usize>
fn floor_grapheme_boundary(&self, byte_offset: usize) -> usize
fn ceil_grapheme_boundary(&self, byte_offset: usize) -> usize
fn display_column(&self, byte_index: usize) -> usize
Auto Trait Implementations§
impl<'a> Freeze for RopeSlice<'a>
impl<'a> RefUnwindSafe for RopeSlice<'a>
impl<'a> Send for RopeSlice<'a>
impl<'a> Sync for RopeSlice<'a>
impl<'a> Unpin for RopeSlice<'a>
impl<'a> UnsafeUnpin for RopeSlice<'a>
impl<'a> UnwindSafe for RopeSlice<'a>
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.