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

View file

@ -32,12 +32,6 @@ fn main() {
println!("{} is a valid directory!", directory); println!("{} is a valid directory!", directory);
println!("Building tree for {}.", directory); println!("Building tree for {}.", directory);
bracket::run_bracket(); 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), Ok(_) => println!("{} is not a valid directory!", directory),
_ => println!("{} does not exist!", directory), _ => println!("{} does not exist!", directory),

View file

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

View file

@ -19,14 +19,14 @@ fn test_new() {
#[test] #[test]
fn test_fmt() { fn test_fmt() {
assert_eq!( assert_eq!(
format!("{}", btree!("foo", btree!("bar"),),), format!("{}", btree!("foo", Some(btree!("bar")),),),
"val = \"foo\"\n\n[left]\nval = \"bar\"\n" "val = \"foo\"\n\n[left]\nval = \"bar\"\n"
); );
} }
#[test] #[test]
fn test_fmt_node() { 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(&t.left), "16");
assert_eq!( assert_eq!(
Tree::fmt_node(&Some(Box::new(btree!(btree!("foo"))))), 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. /// // 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. /// // 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. /// // 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. /// // A tree with no children nodes.
/// let t_single = btree!(1) /// let t_single = btree!(1)
@ -76,13 +76,16 @@ pub struct Tree<T> {
#[macro_export] #[macro_export]
macro_rules! btree { macro_rules! btree {
($val:expr, $l:expr, $r:expr) => { ($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) => { ($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,) => { ($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) => { ($val:expr) => {
Tree::new($val, None, None) Tree::new($val, None, None)