Changing btree implementation

This commit is contained in:
vandomej 2021-06-03 00:54:23 -07:00
parent f3720847ed
commit de22c5ddc5
5 changed files with 22 additions and 22 deletions

View file

@ -24,13 +24,16 @@ impl tree::Tree<Uuid> {
// }
/// Constructs a tree with a given height while simultaneously running a simulation on each node.
fn build_tree(h: u32) -> Option<Box<tree::Tree<Uuid>>> {
fn build_tree(h: u32) -> Option<tree::Tree<Uuid>> {
// Recursively building a tree and running the simulation after wards to ensure a bottom-up
// execution order.
if h != 0 {
let tree = tree::Tree::new(Uuid::new_v4(), build_tree(h - 1), build_tree(h - 1));
let tree = btree!(
Uuid::new_v4(),
build_tree(h - 1),
build_tree(h - 1));
tree.run_simulation();
Some(Box::new(tree))
Some(tree)
} else {
None
}
@ -42,7 +45,7 @@ fn build_tree(h: u32) -> Option<Box<tree::Tree<Uuid>>> {
pub fn run_bracket() {
let mut height = 1;
let mut tree = FileLinked::new(
*build_tree(height).expect("Error getting result from build_tree"),
build_tree(height).expect("Error getting result from build_tree"),
"for_tests",
)
.expect("Unable to create file linked object from tree");
@ -52,10 +55,10 @@ pub fn run_bracket() {
println!("=========================================");
println!("Running bracket...");
height += 1;
tree.replace(tree::Tree::new(
tree.replace(btree!(
Uuid::new_v4(),
Some(Box::new(tree.readonly().clone())),
build_tree(height),
Some(tree.readonly().clone()),
build_tree(height)
))
.expect("Error building up tree node");
tree.readonly().run_simulation();

View file

@ -32,12 +32,6 @@ fn main() {
println!("{} is a valid directory!", directory);
println!("Building tree for {}.", directory);
bracket::run_bracket();
println!("\n\nReading tree from temp file.");
let tree: file_linked::FileLinked<tree::Tree<uuid::Uuid>> =
file_linked::FileLinked::from_file("./for_tests")
.expect("Unable to read tree from existing file");
println!("Value read from file:\n{}", tree);
}
Ok(_) => println!("{} is not a valid directory!", directory),
_ => println!("{} does not exist!", directory),

View file

@ -3,7 +3,7 @@ use super::super::tree::Tree;
#[test]
fn test_mutate() -> Result<(), String> {
let tree = btree!(1, btree!(2), btree!(3, btree!(4),));
let tree = btree!(1, Some(btree!(2)), Some(btree!(3, Some(btree!(4)),)));
let mut linked_tree = FileLinked::new(tree, "blah.txt")?;
assert_eq!(

View file

@ -19,14 +19,14 @@ fn test_new() {
#[test]
fn test_fmt() {
assert_eq!(
format!("{}", btree!("foo", btree!("bar"),),),
format!("{}", btree!("foo", Some(btree!("bar")),),),
"val = \"foo\"\n\n[left]\nval = \"bar\"\n"
);
}
#[test]
fn test_fmt_node() {
let t = btree!(17, btree!(16), btree!(12));
let t = btree!(17, Some(btree!(16)), Some(btree!(12)));
assert_eq!(Tree::fmt_node(&t.left), "16");
assert_eq!(
Tree::fmt_node(&Some(Box::new(btree!(btree!("foo"))))),

View file

@ -62,13 +62,13 @@ pub struct Tree<T> {
///
/// ```
/// // A tree with two child nodes.
/// let t = btree!(1, btree!(2), btree!(3));
/// let t = btree!(1, Some(btree!(2)), Some(btree!(3)));
///
/// // A tree with only a left node.
/// let t_left = btree!(1, btree!(2),);
/// let t_left = btree!(1, Some(btree!(2)),);
///
/// // A tree with only a right node.
/// let t_right = btree!(1, ,btree!(3));
/// let t_right = btree!(1, ,Some(btree!(3)));
///
/// // A tree with no children nodes.
/// let t_single = btree!(1)
@ -76,13 +76,16 @@ pub struct Tree<T> {
#[macro_export]
macro_rules! btree {
($val:expr, $l:expr, $r:expr) => {
$crate::tree::Tree::new($val, Some(Box::new($l)), Some(Box::new($r)))
$crate::tree::Tree::new(
$val,
$l.and_then(|l| Some(Box::new(l))),
$r.and_then(|r| Some(Box::new(r))))
};
($val:expr, , $r:expr) => {
$crate::tree::Tree::new($val, None, Some(Box::new($r)))
$crate::tree::Tree::new($val, None, $r.and_then(|r| Some(Box::new(r))))
};
($val:expr, $l:expr,) => {
$crate::tree::Tree::new($val, Some(Box::new($l)), None)
$crate::tree::Tree::new($val, $l.and_then(|l| Some(Box::new(l))), None)
};
($val:expr) => {
Tree::new($val, None, None)