display_node/implementations/
bin_tree.rs1use std::{fmt::Display, mem::swap};
2
3use crate::DisplayableNode;
4
5pub struct BinaryTree<D> {
6 data: D,
7 children: [Option<Box<BinaryTree<D>>>; 2],
8}
9#[macro_export]
10macro_rules! bt {
11 (
12 $value:expr,
13 $left:expr,
14 $right:expr
15 ) => {{
16 BinaryTree::assemble(($value), Some($left), Some($right))
17 }};
18
19 (
20 $value:expr,
21 ,
22 $right:expr
23 ) => {{
24 BinaryTree::assemble(($value), None, Some($right))
25 }};
26
27 (
28 $value:expr,
29 $left:expr,
30
31 ) => {{
32 BinaryTree::assemble(($value), Some($left), None)
33 }};
34
35 (
36 $value:expr
37 ) => {{
38 BinaryTree::new(($value))
39 }};
40}
41
42impl<D> BinaryTree<D> {
43 pub fn new(data: D) -> Self {
44 Self {
45 data,
46 children: [None, None],
47 }
48 }
49
50 pub fn assemble(data: D, x: Option<BinaryTree<D>>, y: Option<BinaryTree<D>>) -> Self {
51 let x = x.map(|x| Box::new(x));
52 let y = y.map(|y| Box::new(y));
53 Self {
54 data,
55 children: [x, y],
56 }
57 }
58
59 pub fn children(&self) -> (Option<&BinaryTree<D>>, Option<&BinaryTree<D>>) {
60 let [x, y] = &self.children;
61 let x = x.as_ref().map(|boxed_x| boxed_x.as_ref());
62 let y = y.as_ref().map(|boxed_y| boxed_y.as_ref());
63 (x, y)
64 }
65
66 pub fn x_ref(&self) -> Option<&BinaryTree<D>> {
67 self.children[0].as_ref().map(|boxed| boxed.as_ref())
68 }
69
70 pub fn y_ref(&self) -> Option<&BinaryTree<D>> {
71 self.children[1].as_ref().map(|boxed| boxed.as_ref())
72 }
73
74 pub fn x_mut(&mut self) -> Option<&mut BinaryTree<D>> {
75 self.children[0].as_mut().map(|boxed| boxed.as_mut())
76 }
77
78 pub fn y_mut(&mut self) -> Option<&mut BinaryTree<D>> {
79 self.children[1].as_mut().map(|boxed| boxed.as_mut())
80 }
81
82 pub fn set_x(&mut self, x: BinaryTree<D>) -> Option<BinaryTree<D>> {
83 let mut outer = Some(Box::new(x));
84 let outer_ref = &mut outer;
85 let inner_ref = &mut self.children[0];
86 swap(outer_ref, inner_ref);
87 outer.map(|boxed| *boxed)
88 }
89
90 pub fn set_y(&mut self, y: BinaryTree<D>) -> Option<BinaryTree<D>> {
91 let mut outer = Some(Box::new(y));
92 let outer_ref = &mut outer;
93 let inner_ref = &mut self.children[1];
94 swap(outer_ref, inner_ref);
95 outer.map(|boxed| *boxed)
96 }
97
98 pub fn data(&self) -> &D {
99 &self.data
100 }
101
102 pub fn data_put(&mut self) -> &mut D {
103 &mut self.data
104 }
105}
106
107impl<D: Display> DisplayableNode for BinaryTree<D> {
108 fn label(&self) -> Option<String> {
109 let data = self.data();
110 Some(format!("{data}"))
111 }
112
113 fn children(&self) -> Vec<&Self> {
114 match self.children() {
115 (Some(left), Some(right)) => vec![left, right],
116 (Some(left), None) => vec![left],
117 (None, Some(right)) => vec![right],
118 (None, None) => vec![],
119 }
120 }
121}
122
123#[test]
124fn it_works() {
125 let tree = bt!(
126 1,
127 bt!(
128 2,
129 ,
130 bt!(5)
131 ),
132 bt!(3, bt!(4, bt!(7),), bt!(6))
133 );
134
135 println!("{}", tree.display());
136}