loro/crates/rle/src/rle_tree.rs

85 lines
2 KiB
Rust
Raw Normal View History

2022-08-10 10:42:36 +00:00
use self::node::{InternalNode, Node};
use crate::{HasLength, Rle};
2022-08-05 10:47:51 +00:00
pub(self) use bumpalo::collections::vec::Vec as BumpVec;
2022-08-10 10:42:36 +00:00
use bumpalo::Bump;
use ouroboros::self_referencing;
2022-08-12 10:22:05 +00:00
use std::marker::{PhantomData, PhantomPinned};
2022-08-05 10:47:51 +00:00
use tree_trait::RleTreeTrait;
2022-08-10 07:41:21 +00:00
mod iter;
2022-08-05 10:47:51 +00:00
mod node;
2022-08-10 07:41:21 +00:00
#[cfg(test)]
mod test;
2022-08-05 10:47:51 +00:00
mod tree_trait;
#[derive(Debug)]
2022-08-05 12:04:49 +00:00
pub struct RleTreeRaw<'a, T: Rle, A: RleTreeTrait<T>> {
2022-08-05 10:47:51 +00:00
node: Node<'a, T, A>,
_pin: PhantomPinned,
_a: PhantomData<(A, T)>,
}
#[self_referencing]
2022-08-09 13:25:24 +00:00
pub struct RleTree<T: Rle + 'static, A: RleTreeTrait<T> + 'static> {
bump: Bump,
#[borrows(bump)]
2022-08-12 10:22:05 +00:00
tree: &'this mut RleTreeRaw<'this, T, A>,
2022-08-05 12:04:49 +00:00
}
impl<T: Rle + 'static, A: RleTreeTrait<T> + 'static> Default for RleTree<T, A> {
fn default() -> Self {
RleTreeBuilder {
bump: Bump::new(),
2022-08-12 10:22:05 +00:00
tree_builder: |bump| bump.alloc(RleTreeRaw::new(bump)),
}
.build()
}
}
2022-08-05 12:04:49 +00:00
impl<'a, T: Rle, A: RleTreeTrait<T>> RleTreeRaw<'a, T, A> {
#[inline]
fn new(bump: &'a Bump) -> Self {
2022-08-05 10:47:51 +00:00
Self {
node: Node::Internal(bump.alloc(InternalNode::new(bump, None))),
2022-08-05 10:47:51 +00:00
_pin: PhantomPinned,
_a: PhantomData,
}
}
2022-08-09 13:25:24 +00:00
#[inline]
pub fn insert(&mut self, index: A::Int, value: T) {
self.node
.as_internal_mut()
.unwrap()
.insert(index, value)
.unwrap();
2022-08-05 10:47:51 +00:00
}
/// return a cursor to the tree
2022-08-11 11:09:07 +00:00
pub fn get(&self, _index: A::Int) {
2022-08-05 10:47:51 +00:00
todo!()
}
2022-08-10 07:41:21 +00:00
pub fn iter(&self) -> iter::Iter<'_, 'a, T, A> {
iter::Iter::new(self.node.get_first_leaf())
2022-08-05 10:47:51 +00:00
}
2022-08-11 12:12:47 +00:00
pub fn delete_range(&mut self, start: Option<A::Int>, end: Option<A::Int>) {
self.node.as_internal_mut().unwrap().delete(start, end);
2022-08-05 10:47:51 +00:00
}
2022-08-11 11:09:07 +00:00
pub fn iter_range(&self, _from: A::Int, _to: A::Int) {
2022-08-05 10:47:51 +00:00
todo!()
}
#[cfg(test)]
fn debug_check(&mut self) {
self.node.as_internal_mut().unwrap().check();
2022-08-05 10:47:51 +00:00
}
}
2022-08-05 12:04:49 +00:00
2022-08-10 07:41:21 +00:00
impl<'a, T: Rle, A: RleTreeTrait<T>> HasLength for RleTreeRaw<'a, T, A> {
fn len(&self) -> usize {
self.node.len()
2022-08-05 12:04:49 +00:00
}
}