Struct Node
pub struct Node<N>(/* private fields */)
where
N: NodeInfo;Expand description
A b-tree node storing leaves at the bottom, and with info retained at each node. It is implemented with atomic reference counting and copy-on-write semantics, so an immutable clone is a very cheap operation, and nodes can be shared across threads. Even so, it is designed to be updated in place, with efficiency similar to a mutable data structure, using uniqueness of reference count to detect when this operation is safe.
When the leaf is a string, this is a rope data structure (a persistent rope in functional programming jargon). However, it is not restricted to strings, and it is expected to be the basis for a number of data structures useful for text processing.
Implementations§
§impl Node<BreaksInfo>
impl Node<BreaksInfo>
pub fn new_no_break(len: usize) -> Node<BreaksInfo>
§impl Node<RopeInfo>
impl Node<RopeInfo>
pub fn edit_str<T>(&mut self, iv: T, new: &str)where
T: IntervalBounds,
👎Deprecated since 0.3.0: Use Rope::edit instead
pub fn edit_str<T>(&mut self, iv: T, new: &str)where
T: IntervalBounds,
Use Rope::edit instead
Edit the string, replacing the byte range [start..end] with new.
Time complexity: O(log n)
pub fn slice<T>(&self, iv: T) -> Node<RopeInfo>where
T: IntervalBounds,
pub fn slice<T>(&self, iv: T) -> Node<RopeInfo>where
T: IntervalBounds,
Returns a new Rope with the contents of the provided range.
pub fn is_codepoint_boundary(&self, offset: usize) -> bool
pub fn is_codepoint_boundary(&self, offset: usize) -> bool
Determine whether offset lies on a codepoint boundary.
pub fn prev_codepoint_offset(&self, offset: usize) -> Option<usize>
pub fn prev_codepoint_offset(&self, offset: usize) -> Option<usize>
Return the offset of the codepoint before offset.
pub fn next_codepoint_offset(&self, offset: usize) -> Option<usize>
pub fn next_codepoint_offset(&self, offset: usize) -> Option<usize>
Return the offset of the codepoint after offset.
pub fn at_or_next_codepoint_boundary(&self, offset: usize) -> Option<usize>
pub fn at_or_next_codepoint_boundary(&self, offset: usize) -> Option<usize>
Returns offset if it lies on a codepoint boundary. Otherwise returns
the codepoint after offset.
pub fn at_or_prev_codepoint_boundary(&self, offset: usize) -> Option<usize>
pub fn at_or_prev_codepoint_boundary(&self, offset: usize) -> Option<usize>
Returns offset if it lies on a codepoint boundary. Otherwise returns
the codepoint before offset.
pub fn prev_grapheme_offset(&self, offset: usize) -> Option<usize>
pub fn next_grapheme_offset(&self, offset: usize) -> Option<usize>
pub fn line_of_offset(&self, offset: usize) -> usize
pub fn line_of_offset(&self, offset: usize) -> usize
Return the line number corresponding to the byte index offset.
The line number is 0-based, thus this is equivalent to the count of newlines
in the slice up to offset.
Time complexity: O(log n)
§Panics
This function will panic if offset > self.len(). Callers are expected to
validate their input.
pub fn offset_of_line(&self, line: usize) -> usize
pub fn offset_of_line(&self, line: usize) -> usize
Return the byte offset corresponding to the line number line.
If line is equal to one plus the current number of lines,
this returns the offset of the end of the rope. Arguments higher
than this will panic.
The line number is 0-based.
Time complexity: O(log n)
§Panics
This function will panic if line > self.measure::<LinesMetric>() + 1.
Callers are expected to validate their input.
pub fn iter_chunks<T>(&self, range: T) -> ChunkIter<'_> ⓘwhere
T: IntervalBounds,
pub fn iter_chunks<T>(&self, range: T) -> ChunkIter<'_> ⓘwhere
T: IntervalBounds,
Returns an iterator over chunks of the rope.
Each chunk is a &str slice borrowed from the rope’s storage. The size
of the chunks is indeterminate but for large strings will generally be
in the range of 511-1024 bytes.
The empty string will yield a single empty slice. In all other cases, the slices will be nonempty.
Time complexity: technically O(n log n), but the constant factor is so tiny it is effectively O(n). This iterator does not allocate.
pub fn lines_raw<T>(&self, range: T) -> LinesRaw<'_> ⓘwhere
T: IntervalBounds,
pub fn lines_raw<T>(&self, range: T) -> LinesRaw<'_> ⓘwhere
T: IntervalBounds,
An iterator over the raw lines. The lines, except the last, include the terminating newline.
The return type is a Cow<str>, and in most cases the lines are slices
borrowed from the rope.
pub fn lines<T>(&self, range: T) -> Lines<'_> ⓘwhere
T: IntervalBounds,
pub fn lines<T>(&self, range: T) -> Lines<'_> ⓘwhere
T: IntervalBounds,
An iterator over the lines of a rope.
Lines are ended with either Unix (\n) or MS-DOS (\r\n) style line endings.
The line ending is stripped from the resulting string. The final line ending
is optional.
The return type is a Cow<str>, and in most cases the lines are slices borrowed
from the rope.
The semantics are intended to match str::lines().
pub fn byte_at(&self, offset: usize) -> u8
pub fn slice_to_cow<T>(&self, range: T) -> Cow<'_, str>where
T: IntervalBounds,
§impl<T> Node<SpansInfo<T>>where
T: Clone,
impl<T> Node<SpansInfo<T>>where
T: Clone,
pub fn transform<N>(
&self,
base_start: usize,
base_end: usize,
xform: &mut Transformer<'_, N>,
) -> Node<SpansInfo<T>>where
N: NodeInfo,
pub fn transform<N>(
&self,
base_start: usize,
base_end: usize,
xform: &mut Transformer<'_, N>,
) -> Node<SpansInfo<T>>where
N: NodeInfo,
Perform operational transformation on a spans object intended to be edited into a sequence at the given offset.
pub fn merge<F, O>(
&self,
other: &Node<SpansInfo<T>>,
f: F,
) -> Node<SpansInfo<O>>
pub fn merge<F, O>( &self, other: &Node<SpansInfo<T>>, f: F, ) -> Node<SpansInfo<O>>
Creates a new Spans instance by merging spans from other with self,
using a closure to transform values.
New spans are created from non-overlapping regions of existing spans, and by combining overlapping regions into new spans. In all cases, new values are generated by calling a closure that transforms the value of the existing span or spans.
§Panics
Panics if self and other have different lengths.
pub fn iter(&self) -> SpanIter<'_, T> ⓘ
pub fn iter_chunks<I>(&self, range: I) -> SpanIter<'_, T> ⓘwhere
I: IntervalBounds,
pub fn apply_shape<M>(&mut self, delta: &Delta<M>)where
M: NodeInfo,
pub fn apply_shape<M>(&mut self, delta: &Delta<M>)where
M: NodeInfo,
Applies a generic delta to self, inserting empty spans for any
added regions.
This is intended to be used to keep spans up to date with a Rope
as edits occur.
pub fn delete_after(&mut self, interval: Interval)
pub fn delete_after(&mut self, interval: Interval)
Deletes all spans that intersect with interval and that come after.
§impl<N> Node<N>where
N: NodeInfo,
impl<N> Node<N>where
N: NodeInfo,
pub fn from_leaf(l: <N as NodeInfo>::L) -> Node<N>
pub fn len(&self) -> usize
pub fn is_empty(&self) -> bool
pub fn info(&self) -> &N
pub fn ptr_eq(&self, other: &Node<N>) -> bool
pub fn ptr_eq(&self, other: &Node<N>) -> bool
Returns true if these two Nodes share the same underlying data.
This is principally intended to be used by the druid crate, without needing
to actually add a feature and implement druid’s Data trait.
pub fn concat(rope1: Node<N>, rope2: Node<N>) -> Node<N>
pub fn measure<M>(&self) -> usizewhere
M: Metric<N>,
pub fn subseq<T>(&self, iv: T) -> Node<N>where
T: IntervalBounds,
pub fn edit<T, IV>(&mut self, iv: IV, new: T)
pub fn count_unit<U, C>(&self, m: U) -> usize
pub fn count_unit<U, C>(&self, m: U) -> usize
Given the measured units, how many base units are there
pub fn measure_unit<U, C>(&self, base: usize) -> U
pub fn measure_unit<U, C>(&self, base: usize) -> U
Measure the tree given the base units
pub fn convert<U1, C1, U2, C2>(&self, m1: U1) -> U2where
C1: UnitConverter<N, U1>,
C2: UnitConverter<N, U2>,
U1: PartialOrd + Sub<Output = U1>,
U2: Default + Add<Output = U2>,
pub fn convert<U1, C1, U2, C2>(&self, m1: U1) -> U2where
C1: UnitConverter<N, U1>,
C2: UnitConverter<N, U2>,
U1: PartialOrd + Sub<Output = U1>,
U2: Default + Add<Output = U2>,
Convert the measured units between converters
pub fn convert_metrics<M1, M2>(&self, m1: usize) -> usize
§impl<N> Node<N>where
N: DefaultMetric,
impl<N> Node<N>where
N: DefaultMetric,
pub fn count<M>(&self, offset: usize) -> usizewhere
M: Metric<N>,
pub fn count<M>(&self, offset: usize) -> usizewhere
M: Metric<N>,
Measures the length of the text bounded by DefaultMetric::measure(offset) with another metric.
§Examples
use crate::xi_rope::{Rope, LinesMetric};
// the default metric of Rope is BaseMetric (aka number of bytes)
let my_rope = Rope::from("first line \n second line \n");
// count the number of lines in my_rope
let num_lines = my_rope.count::<LinesMetric>(my_rope.len());
assert_eq!(2, num_lines);pub fn count_base_units<M>(&self, offset: usize) -> usizewhere
M: Metric<N>,
pub fn count_base_units<M>(&self, offset: usize) -> usizewhere
M: Metric<N>,
Measures the length of the text bounded by M::measure(offset) with the default metric.
§Examples
use crate::xi_rope::{Rope, LinesMetric};
// the default metric of Rope is BaseMetric (aka number of bytes)
let my_rope = Rope::from("first line \n second line \n");
// get the byte offset of the line at index 1
let byte_offset = my_rope.count_base_units::<LinesMetric>(1);
assert_eq!(12, byte_offset);Trait Implementations§
§impl<'de> Deserialize<'de> for Node<RopeInfo>
impl<'de> Deserialize<'de> for Node<RopeInfo>
§fn deserialize<D>(
deserializer: D,
) -> Result<Node<RopeInfo>, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
fn deserialize<D>(
deserializer: D,
) -> Result<Node<RopeInfo>, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
Source§impl RopeText for Node<RopeInfo>
impl RopeText for Node<RopeInfo>
fn text(&self) -> &Node<RopeInfo>
fn len(&self) -> usize
fn is_empty(&self) -> bool
Source§fn offset_of_line(&self, line: usize) -> usize
fn offset_of_line(&self, line: usize) -> usize
fn offset_line_end(&self, offset: usize, caret: bool) -> usize
fn line_of_offset(&self, offset: usize) -> usize
fn offset_to_line_col(&self, offset: usize) -> (usize, usize)
Source§fn offset_of_line_col(&self, line: usize, col: usize) -> usize
fn offset_of_line_col(&self, line: usize, col: usize) -> usize
fn line_end_col(&self, line: usize, caret: bool) -> usize
Source§fn line_end_offset(&self, line: usize, caret: bool) -> usize
fn line_end_offset(&self, line: usize, caret: bool) -> usize
Source§fn line_content(&self, line: usize) -> Cow<'_, str>
fn line_content(&self, line: usize) -> Cow<'_, str>
Source§fn prev_grapheme_offset(
&self,
offset: usize,
count: usize,
limit: usize,
) -> usize
fn prev_grapheme_offset( &self, offset: usize, count: usize, limit: usize, ) -> usize
fn next_grapheme_offset( &self, offset: usize, count: usize, limit: usize, ) -> usize
fn prev_code_boundary(&self, offset: usize) -> usize
fn next_code_boundary(&self, offset: usize) -> usize
Source§fn select_word(&self, offset: usize) -> (usize, usize)
fn select_word(&self, offset: usize) -> (usize, usize)
Source§fn first_non_blank_character_on_line(&self, line: usize) -> usize
fn first_non_blank_character_on_line(&self, line: usize) -> usize
fn indent_on_line(&self, line: usize) -> String
Source§fn slice_to_cow(&self, range: Range<usize>) -> Cow<'_, str>
fn slice_to_cow(&self, range: Range<usize>) -> Cow<'_, str>
Cow string, for ‘nice’ ranges (small, and at the right
offsets) this will be a reference to the rope’s data. Otherwise, it allocates a new string.
You should be somewhat wary of requesting large parts of the rope, as it will allocate
a new string since it isn’t contiguous in memory for large chunks.Source§fn char_indices_iter<'a, T>(
&'a self,
range: T,
) -> CharIndicesJoin<CharIndices<'a>, Map<ChunkIter<'a>, fn(&str) -> CharIndices<'_>>> ⓘwhere
T: IntervalBounds,
fn char_indices_iter<'a, T>(
&'a self,
range: T,
) -> CharIndicesJoin<CharIndices<'a>, Map<ChunkIter<'a>, fn(&str) -> CharIndices<'_>>> ⓘwhere
T: IntervalBounds,
(utf8_offset, char) values in the given range.
This uses iter_chunks and so does not allocate, compared to Self::slice_to_cow which canSource§fn is_line_whitespace(&self, line: usize) -> bool
fn is_line_whitespace(&self, line: usize) -> bool
true if the given line contains no non-whitespace characters.fn move_left(&self, offset: usize, mode: Mode, count: usize) -> usize
fn move_right(&self, offset: usize, mode: Mode, count: usize) -> usize
fn find_nth_paragraph<F>( &self, offset: usize, count: usize, find_next: F, ) -> usize
fn move_n_paragraphs_forward(&self, offset: usize, count: usize) -> usize
fn move_n_paragraphs_backward(&self, offset: usize, count: usize) -> usize
fn move_n_words_forward(&self, offset: usize, count: usize) -> usize
fn move_n_wordends_forward( &self, offset: usize, count: usize, inserting: bool, ) -> usize
fn move_n_words_backward( &self, offset: usize, count: usize, mode: Mode, ) -> usize
fn move_word_backward_deletion(&self, offset: usize) -> usize
§impl Serialize for Node<RopeInfo>
impl Serialize for Node<RopeInfo>
§fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
fn serialize<S>(
&self,
serializer: S,
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>where
S: Serializer,
Auto Trait Implementations§
impl<N> Freeze for Node<N>
impl<N> RefUnwindSafe for Node<N>
impl<N> Send for Node<N>
impl<N> Sync for Node<N>
impl<N> Unpin for Node<N>
impl<N> UnsafeUnpin for Node<N>
impl<N> UnwindSafe for Node<N>
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<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().