use NodeId;
pub struct NodeBuilder<T> {
data: T,
child_capacity: usize,
}
impl<T> NodeBuilder<T> {
pub fn new(data: T) -> NodeBuilder<T> {
NodeBuilder {
data: data,
child_capacity: 0,
}
}
pub fn with_child_capacity(mut self, child_capacity: usize) -> NodeBuilder<T> {
self.child_capacity = child_capacity;
self
}
pub fn build(self) -> Node<T> {
Node {
data: self.data,
parent: None,
children: Vec::with_capacity(self.child_capacity),
}
}
}
#[derive(Debug)]
#[cfg_attr(feature = "serde_support", derive(Serialize, Deserialize))]
pub struct Node<T> {
pub(crate) data: T,
pub(crate) parent: Option<NodeId>,
pub(crate) children: Vec<NodeId>,
}
impl<T> PartialEq for Node<T>
where
T: PartialEq,
{
fn eq(&self, other: &Node<T>) -> bool {
self.data == other.data
}
}
impl<T> Node<T> {
pub fn new(data: T) -> Node<T> {
NodeBuilder::new(data).build()
}
pub fn data(&self) -> &T {
&self.data
}
pub fn data_mut(&mut self) -> &mut T {
&mut self.data
}
pub fn replace_data(&mut self, mut data: T) -> T {
::std::mem::swap(&mut data, self.data_mut());
data
}
pub fn parent(&self) -> Option<&NodeId> {
self.parent.as_ref()
}
pub fn children(&self) -> &Vec<NodeId> {
&self.children
}
pub(crate) fn set_parent(&mut self, parent: Option<NodeId>) {
self.parent = parent;
}
pub(crate) fn add_child(&mut self, child: NodeId) {
self.children.push(child);
}
pub(crate) fn replace_child(&mut self, old: NodeId, new: NodeId) {
let index = self
.children()
.iter()
.enumerate()
.find(|&(_, id)| id == &old)
.unwrap()
.0;
let children = self.children_mut();
children.push(new);
children.swap_remove(index);
}
pub(crate) fn children_mut(&mut self) -> &mut Vec<NodeId> {
&mut self.children
}
pub(crate) fn set_children(&mut self, children: Vec<NodeId>) {
self.children = children;
}
pub(crate) fn take_children(&mut self) -> Vec<NodeId> {
use std::mem;
let mut empty = Vec::with_capacity(0);
mem::swap(&mut self.children, &mut empty);
empty }
}
#[cfg(test)]
mod node_builder_tests {
use super::NodeBuilder;
#[test]
fn test_new() {
let five = 5;
let node = NodeBuilder::new(5).build();
assert_eq!(node.data(), &five);
assert_eq!(node.children.capacity(), 0);
}
#[test]
fn test_with_child_capacity() {
let five = 5;
let node = NodeBuilder::new(5).with_child_capacity(10).build();
assert_eq!(node.data(), &five);
assert_eq!(node.children.capacity(), 10);
}
}
#[cfg(test)]
mod node_tests {
use super::super::snowflake::ProcessUniqueId;
use super::super::NodeId;
use super::Node;
#[test]
fn test_new() {
let node = Node::new(5);
assert_eq!(node.children.capacity(), 0);
}
#[test]
fn test_data() {
let five = 5;
let node = Node::new(five);
assert_eq!(node.data(), &five);
}
#[test]
fn test_data_mut() {
let mut five = 5;
let mut node = Node::new(five);
assert_eq!(node.data_mut(), &mut five);
}
#[test]
fn test_parent() {
let mut node = Node::new(5);
assert!(node.parent().is_none());
let parent_id: NodeId = NodeId {
tree_id: ProcessUniqueId::new(),
index: 0,
};
node.set_parent(Some(parent_id.clone()));
assert!(node.parent().is_some());
assert_eq!(node.parent().unwrap().clone(), parent_id);
}
#[test]
fn test_children() {
let mut node = Node::new(5);
assert_eq!(node.children().len(), 0);
let child_id: NodeId = NodeId {
tree_id: ProcessUniqueId::new(),
index: 0,
};
node.add_child(child_id.clone());
assert_eq!(node.children().len(), 1);
assert_eq!(node.children().get(0).unwrap(), &child_id);
let mut node = Node::new(5);
assert_eq!(node.children().len(), 0);
let child_id: NodeId = NodeId {
tree_id: ProcessUniqueId::new(),
index: 0,
};
node.children_mut().push(child_id.clone());
assert_eq!(node.children().len(), 1);
assert_eq!(node.children().get(0).unwrap(), &child_id);
}
#[test]
fn test_partial_eq() {
let node1 = Node::new(42);
let node2 = Node::new(42);
let node3 = Node::new(23);
assert_eq!(node1, node2);
assert_ne!(node1, node3);
assert_ne!(node2, node3);
}
}