rctree is a "DOM-like" tree implemented using reference counting.
This a fork of the rust-forest rctree.
"DOM-like" here means that data structures can be used to represent the parsed content of an HTML or XML document, like the DOM does, but don't necessarily have the exact same API as the DOM. That is:
The lifetime of nodes is managed through reference counting. To avoid reference cycles which would cause memory leaks, the tree is asymmetric: each node holds optional strong references to its next sibling and first child, but only optional weak references to its parent, previous sibling, and last child.
Nodes are destroyed as soon as there is no strong reference left to them. The structure is such that holding a reference to the root is sufficient to keep the entire tree alive. However, if for example the only reference that exists from outside the tree is one that you use to traverse it, you will not be able to go back "up" the tree to ancestors and previous siblings after going "down", as those nodes will have been destroyed.
Weak references to destroyed nodes are treated as if they were not set at all. (E.g. a node can become a root when its parent is destroyed.)
Since nodes are aliased (have multiple references to them),
RefCell
is used for interior mutability.
Advantages:
Node
user-visible type to manipulate the tree, with methods.Disadvantages:
NodeRef
-> Node
.make_copy
, make_deep_copy
, has_children
and root
methods.Node
implements PartialEq
now.std
features like Rc::ptr_eq
, Ref
and RefMut
instead of handwritten one.borrow_mut
, detach
, append
, prepend
, insert_after
, insert_before
,
make_copy
and make_deep_copy
are marked as mut
.append
, prepend
, insert_after
and insert_before
methods will panic if
the provided child/sibling is the same the same node.Dependency: Rust >= 1.17
The library consists of a single file which you can copy to your project.
This is a preferable solution since you can tweak the crate for your needs.
Add this to your Cargo.toml
:
toml
[dependencies]
rctree = "0.2"
rctree is licensed under the MIT.