icentral_node_stack/
node_stack.rs1crate::ix!();
2
3#[derive(Clone,Debug)]
4pub struct NodeIdStack {
5 name: String,
6 data: Vec<NodeId>,
7}
8
9impl NodeIdStack {
10
11 pub fn new(first: NodeId, name: &str) -> Self {
12
13 debug!("creating new NodeIdStack named {} from initial node {}", name, first);
14
15 let mut stack = NodeIdStack::empty(name);
16
17 stack.push(first);
18
19 stack
20 }
21
22 pub fn len(&self) -> usize {
23 self.data.len()
24 }
25}
26
27impl CreateNamedEmpty for NodeIdStack {
28
29 fn empty(name: &str) -> Self {
30 Self {
31 name: name.to_owned(),
32 data: vec![],
33 }
34 }
35}
36
37impl Clear for NodeIdStack {
38
39 fn clear(&mut self) {
40
41 debug!("clearing NodeIdStack {} of len: {}", self.name, self.len());
42
43 self.data.clear();
44 }
45}
46
47impl NodeAtIndex for NodeIdStack {
48
49 fn node_at_index(&self, idx: usize) -> NodeId {
50 self.data[idx]
51 }
52}
53
54impl SetNodeAtIndex for NodeIdStack {
55
56 fn set_node_at_index(&mut self, idx: usize, n: NodeId) {
57
58 debug!("setting node {} at idx {} of NodeIdStack {}", n, idx, self.name);
59
60 self.data[idx] = n;
61 }
62}
63
64impl Push for NodeIdStack {
65
66 type Item = NodeId;
67
68 fn push(&mut self, n: Self::Item) {
69
70 debug!("pushing node {} into NodeIdStack {}", n, self.name);
71
72 self.data.push(n);
73 }
74}
75
76impl Pop for NodeIdStack {
77
78 type Item = NodeId;
79
80 fn pop(&mut self) -> Option<Self::Item> {
81
82 let n = self.data.pop();
83
84 debug!("popped node {:?} from NodeIdStack, {}", n, self.name);
85
86 n
87 }
88}