icentral_predecessor_map/
predecessor_map.rs1crate::ix!();
2
3
4#[derive(Clone,Debug)]
7pub struct PredecessorMap {
8 name: String,
9 data: MaybeIndexedMap<NodeId>,
10}
11
12impl PredecessorMap {
13
14 pub fn new_from_nodes(nodes: Vec<NodeId>, name: &str) -> Self {
15
16 debug!("creating new PredecessorMap named {} from {} nodes", name, nodes.len());
17
18 let mut builder = Self::empty_mapped(name);
19
20 for node in nodes {
21
22 builder.set_predecessor_for_node(
23 node,
24 NodeId::bad()
25 );
26 }
27
28 builder
29 }
30
31 pub fn empty_indexed(name: &str) -> Self {
32
33 debug!("creating new empty_indexed PredecessorMap named {}", name);
34
35 Self {
36 name: name.to_owned(),
37 data: MaybeIndexedMap::empty_indexed()
38 }
39 }
40
41 pub fn empty_mapped(name: &str) -> Self {
42
43 debug!("creating new empty_mapped PredecessorMap named {}", name);
44
45 Self {
46 name: name.to_owned(),
47 data: MaybeIndexedMap::empty_mapped()
48 }
49 }
50
51 pub fn new(len: usize, name: &str) -> Self {
52
53 debug!("creating new PredecessorMap named {} of len {}", name, len);
54
55 Self {
56 name: name.to_owned(),
57 data: MaybeIndexedMap::new(len,NodeId::bad()),
58 }
59 }
60
61 pub fn len(&self) -> usize {
62 self.data.len()
63 }
64
65 pub fn has_predecessor(&self, node: NodeId) -> bool {
66
67 let has_predecessor = self.predecessor_for_node(node) != NodeId::bad();
68
69 debug!("in {}, checking whether node {} has predecessor in the map -- has? {}", self.name, node, has_predecessor);
70
71 has_predecessor
72 }
73
74 pub fn is_tree_root(&self, node: NodeId) -> bool {
75
76 let is_root = self.predecessor_for_node(node) == NodeId::bad();
77
78 debug!("in {}, checking whether node {} is the tree_root -- is? {}", self.name, node, is_root);
79
80 is_root
81 }
82
83 pub fn predecessor_for_node(&self, node: NodeId) -> NodeId {
84
85 debug!("in {}, getting predecessor for node {}", self.name, node);
86
87 self.data[node]
88 }
89
90 pub fn set_predecessor_for_node(&mut self, node: NodeId, val: NodeId) {
91
92 debug!("in {}, setting predecessor for node {} to {}", self.name, node, val);
93
94 self.data.set(node, val);
95 }
96
97 pub fn reinit(&mut self, len: usize) {
98
99 debug!("reinitializing PredecessorMap {} with len {}", self.name, len);
100
101 self.data.refill(len,NodeId::bad());
102 }
103}