[][src]Struct ropey::Rope

pub struct Rope { /* fields omitted */ }

A utf8 text rope.

Except where otherwise documented, all editing and query operations execute in worst-case O(log N) time in the length of the rope. Rope is designed to work efficiently even for huge (in the gigabytes) and pathological (all on one line) texts.

Editing Operations

The primary editing operations on Rope are insertion and removal of text. For example:

let mut rope = Rope::from_str("Hello みんなさん!");
rope.remove(6..11);
rope.insert(6, "world");

assert_eq!(rope, "Hello world!");

You can also split off the end of a Rope or append one Rope to another:

let mut rope = Rope::from_str("Hello みんなさん!");
let right_side = rope.split_off(6);

assert_eq!(rope, "Hello ");
assert_eq!(right_side, "みんなさん!");

rope.append(Rope::from_str("world!"));

assert_eq!(rope, "Hello world!");

Note that insert() and remove() are generally faster than split_off() and append().

Query Operations

Rope provides a rich set of efficient query functions, including querying rope length in bytes/chars/lines, fetching individual chars or lines, and converting between byte/char/line indices. For example, to find the starting char index of a given line:

let rope = Rope::from_str("Hello みんなさん!\nHow are you?\nThis text has multiple lines!");

assert_eq!(rope.line_to_char(0), 0);
assert_eq!(rope.line_to_char(1), 13);
assert_eq!(rope.line_to_char(2), 26);

Slicing

You can take immutable slices of a Rope using slice():

let mut rope = Rope::from_str("Hello みんなさん!");
let middle = rope.slice(3..8);

assert_eq!(middle, "lo みん");

Cloning

Cloning Ropes is extremely cheap, running in O(1) time and taking a small constant amount of memory for the new clone, regardless of text size. This is accomplished by data sharing between Rope clones. The memory used by clones only grows incrementally as the their contents diverge due to edits. All of this is thread safe, so clones can be sent freely between threads.

The primary intended use-case for this feature is to allow asynchronous processing of Ropes. For example, saving a large document to disk in a separate thread while the user continues to perform edits.

Methods

impl Rope[src]

pub fn new() -> Self[src]

Creates an empty Rope.

pub fn from_str(text: &str) -> Self[src]

Creates a Rope from a string slice.

Runs in O(N) time.

pub fn from_reader<T: Read>(reader: T) -> Result<Self>[src]

Creates a Rope from the output of a reader.

This is a convenience function. To do more sophisticated text loading, see RopeBuilder.

Runs in O(N) time.

Errors

  • If the reader returns an error, from_reader stops and returns that error.
  • If non-utf8 data is encountered, an IO error with kind InvalidData is returned.

Note: some data from the reader is likely consumed even if there is an error.

pub fn write_to<T: Write>(&self, writer: T) -> Result<()>[src]

Writes the contents of the Rope to a writer.

This is a convenience function. To do more sophisticated text output, see the Chunks iterator.

Runs in O(N) time.

Errors

  • If the writer returns an error, write_to stops and returns that error.

Note: some data may have been written even if an error is returned.

pub fn len_bytes(&self) -> usize[src]

Total number of bytes in the Rope.

Runs in O(1) time.

pub fn len_chars(&self) -> usize[src]

Total number of chars in the Rope.

Runs in O(1) time.

pub fn len_lines(&self) -> usize[src]

Total number of lines in the Rope.

Runs in O(1) time.

pub fn capacity(&self) -> usize[src]

Total size of the Rope's text buffer space, in bytes.

This includes unoccupied text buffer space. You can calculate the unoccupied space with capacity() - len_bytes(). In general, there will always be some unoccupied buffer space.

Runs in O(N) time.

pub fn shrink_to_fit(&mut self)[src]

Shrinks the Rope's capacity to the minimum possible.

This will rarely result in capacity() == len_bytes(). Rope stores text in a sequence of fixed-capacity chunks, so an exact fit only happens for texts that are both a precise multiple of that capacity and have code point boundaries that line up exactly with the capacity boundaries.

After calling this, the difference between capacity() and len_bytes() is typically under 1KB per megabyte of text in the Rope.

NOTE: calling this on a Rope clone causes it to stop sharing all data with its other clones. In such cases you will very likely be increasing total memory usage despite shrinking the Rope's capacity.

Runs in O(N) time, and uses O(log N) additional space during shrinking.

pub fn insert(&mut self, char_idx: usize, text: &str)[src]

Inserts text at char index char_idx.

Runs in O(M + log N) time, where N is the length of the Rope and M is the length of text.

Panics

Panics if char_idx is out of bounds (i.e. char_idx > len_chars()).

pub fn insert_char(&mut self, char_idx: usize, ch: char)[src]

Inserts a single char ch at char index char_idx.

Runs in O(log N) time, where N is the length of the Rope.

Panics

Panics if char_idx is out of bounds (i.e. char_idx > len_chars()).

pub fn remove<R>(&mut self, char_range: R) where
    R: RangeBounds<usize>, 
[src]

Removes the text in the given char index range.

Uses range syntax, e.g. 2..7, 2.., etc. The range is in char indices.

Runs in O(M + log N) time, where N is the length of the Rope and M is the length of the range being removed.

Example

let mut rope = Rope::from_str("Hello world!");
rope.remove(5..);

assert_eq!("Hello", rope);

Panics

Panics if the start of the range is greater than the end, or if the end is out of bounds (i.e. end > len_chars()).

pub fn split_off(&mut self, char_idx: usize) -> Self[src]

Splits the Rope at char_idx, returning the right part of the split.

Panics

Panics if char_idx is out of bounds (i.e. char_idx > len_chars()).

pub fn append(&mut self, other: Self)[src]

Appends a Rope to the end of this one, consuming the other Rope.

pub fn byte_to_char(&self, byte_idx: usize) -> usize[src]

Returns the char index of the given byte.

Notes:

  • If the byte is in the middle of a multi-byte char, returns the index of the char that the byte belongs to.
  • byte_idx can be one-past-the-end, which will return one-past-the-end char index.

Panics

Panics if byte_idx is out of bounds (i.e. byte_idx > len_bytes()).

pub fn byte_to_line(&self, byte_idx: usize) -> usize[src]

Returns the line index of the given byte.

Notes:

  • Lines are zero-indexed. This is functionally equivalent to counting the line endings before the specified byte.
  • byte_idx can be one-past-the-end, which will return the last line index.

Panics

Panics if byte_idx is out of bounds (i.e. byte_idx > len_bytes()).

pub fn char_to_byte(&self, char_idx: usize) -> usize[src]

Returns the byte index of the given char.

Notes:

  • char_idx can be one-past-the-end, which will return one-past-the-end byte index.

Panics

Panics if char_idx is out of bounds (i.e. char_idx > len_chars()).

pub fn char_to_line(&self, char_idx: usize) -> usize[src]

Returns the line index of the given char.

Notes:

  • Lines are zero-indexed. This is functionally equivalent to counting the line endings before the specified char.
  • char_idx can be one-past-the-end, which will return the last line index.

Panics

Panics if char_idx is out of bounds (i.e. char_idx > len_chars()).

pub fn line_to_byte(&self, line_idx: usize) -> usize[src]

Returns the byte index of the start of the given line.

Notes:

  • Lines are zero-indexed.
  • line_idx can be one-past-the-end, which will return one-past-the-end byte index.

Panics

Panics if line_idx is out of bounds (i.e. line_idx > len_lines()).

pub fn line_to_char(&self, line_idx: usize) -> usize[src]

Returns the char index of the start of the given line.

Notes:

  • Lines are zero-indexed.
  • line_idx can be one-past-the-end, which will return one-past-the-end char index.

Panics

Panics if line_idx is out of bounds (i.e. line_idx > len_lines()).

pub fn byte(&self, byte_idx: usize) -> u8[src]

Returns the byte at byte_idx.

Panics

Panics if byte_idx is out of bounds (i.e. byte_idx >= len_bytes()).

pub fn char(&self, char_idx: usize) -> char[src]

Returns the char at char_idx.

Panics

Panics if char_idx is out of bounds (i.e. char_idx >= len_chars()).

pub fn line(&self, line_idx: usize) -> RopeSlice[src]

Returns the line at line_idx.

Note: lines are zero-indexed.

Panics

Panics if line_idx is out of bounds (i.e. line_idx >= len_lines()).

pub fn chunk_at_byte(&self, byte_idx: usize) -> (&str, usize, usize, usize)[src]

Returns the chunk containing the given byte index.

Also returns the byte and char indices of the beginning of the chunk and the index of the line that the chunk starts on.

The return value is organized as (chunk, chunk_byte_idx, chunk_char_idx, chunk_line_idx).

Panics

Panics if byte_idx is out of bounds (i.e. byte_idx > len_bytes()).

pub fn chunk_at_char(&self, char_idx: usize) -> (&str, usize, usize, usize)[src]

Returns the chunk containing the given char index.

Also returns the byte and char indices of the beginning of the chunk and the index of the line that the chunk starts on.

The return value is organized as (chunk, chunk_byte_idx, chunk_char_idx, chunk_line_idx).

Panics

Panics if char_idx is out of bounds (i.e. char_idx > len_chars()).

pub fn chunk_at_line_break(
    &self,
    line_break_idx: usize
) -> (&str, usize, usize, usize)
[src]

Returns the chunk containing the given line break.

Also returns the byte and char indices of the beginning of the chunk and the index of the line that the chunk starts on.

Note: for convenience, both the beginning and end of the rope are considered line breaks for the purposes of indexing. For example, in the string "Hello \n world!" 0 would give the first chunk, 1 would give the chunk containing the newline character, and 2 would give the last chunk.

The return value is organized as (chunk, chunk_byte_idx, chunk_char_idx, chunk_line_idx).

Panics

Panics if line_break_idx is out of bounds (i.e. line_break_idx > len_lines()).

pub fn slice<R>(&self, char_range: R) -> RopeSlice where
    R: RangeBounds<usize>, 
[src]

Gets an immutable slice of the Rope.

Uses range syntax, e.g. 2..7, 2.., etc.

Example

let rope = Rope::from_str("Hello world!");
let slice = rope.slice(..5);

assert_eq!("Hello", slice);

Panics

Panics if the start of the range is greater than the end, or if the end is out of bounds (i.e. end > len_chars()).

Important traits for Bytes<'a>
pub fn bytes(&self) -> Bytes[src]

Creates an iterator over the bytes of the Rope.

Important traits for Chars<'a>
pub fn chars(&self) -> Chars[src]

Creates an iterator over the chars of the Rope.

Important traits for Lines<'a>
pub fn lines(&self) -> Lines[src]

Creates an iterator over the lines of the Rope.

Important traits for Chunks<'a>
pub fn chunks(&self) -> Chunks[src]

Creates an iterator over the chunks of the Rope.

Trait Implementations

impl<'a> From<&'a str> for Rope[src]

impl<'a> From<Cow<'a, str>> for Rope[src]

impl From<String> for Rope[src]

impl<'a> From<RopeSlice<'a>> for Rope[src]

Will share data where possible.

Runs in O(log N) time.

impl From<Rope> for String[src]

impl<'a> From<&'a Rope> for String[src]

impl<'a> From<Rope> for Cow<'a, str>[src]

impl<'a> From<&'a Rope> for Cow<'a, str>[src]

Attempts to borrow the contents of the Rope, but will convert to an owned string if the contents is not contiguous in memory.

Runs in best case O(1), worst case O(N).

impl Eq for Rope[src]

impl Clone for Rope[src]

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

impl PartialEq<Rope> for Rope[src]

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests for !=.

impl<'a> PartialEq<&'a str> for Rope[src]

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests for !=.

impl<'a> PartialEq<Rope> for &'a str[src]

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests for !=.

impl PartialEq<str> for Rope[src]

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests for !=.

impl PartialEq<Rope> for str[src]

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests for !=.

impl<'a> PartialEq<String> for Rope[src]

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests for !=.

impl<'a> PartialEq<Rope> for String[src]

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests for !=.

impl<'a> PartialEq<Cow<'a, str>> for Rope[src]

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests for !=.

impl<'a> PartialEq<Rope> for Cow<'a, str>[src]

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests for !=.

impl<'a> PartialEq<Rope> for RopeSlice<'a>[src]

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests for !=.

impl<'a> PartialEq<RopeSlice<'a>> for Rope[src]

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests for !=.

impl PartialOrd<Rope> for Rope[src]

#[must_use]
fn lt(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests less than (for self and other) and is used by the < operator. Read more

#[must_use]
fn le(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

#[must_use]
fn gt(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests greater than (for self and other) and is used by the > operator. Read more

#[must_use]
fn ge(&self, other: &Rhs) -> bool
1.0.0
[src]

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

impl Ord for Rope[src]

fn max(self, other: Self) -> Self
1.21.0
[src]

Compares and returns the maximum of two values. Read more

fn min(self, other: Self) -> Self
1.21.0
[src]

Compares and returns the minimum of two values. Read more

fn clamp(self, min: Self, max: Self) -> Self[src]

🔬 This is a nightly-only experimental API. (clamp)

Restrict a value to a certain interval. Read more

impl Default for Rope[src]

impl Debug for Rope[src]

impl Display for Rope[src]

impl<'a> FromIterator<&'a str> for Rope[src]

impl<'a> FromIterator<Cow<'a, str>> for Rope[src]

impl FromIterator<String> for Rope[src]

Auto Trait Implementations

impl Send for Rope

impl Sync for Rope

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> From for T[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T, U> TryFrom for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]