29 using Node = uint32_t;
30 using NodeQueue = std::deque<Node>;
39 VALID = 0b00000000000000000000000000000001
42 Node Parent, Child, Sibling;
45 Director() : Parent(0), Child(0), Sibling(0), Flags(VALID) { }
48 using Hierarchy = std::vector<Director>;
49 using Storage = std::vector<DataType>;
54 DirectedGraph() : Graph{ Director() }, Data{ DataType() }, Freed{ } { }
56 [[nodiscard]] Node Parent(Node node)
const {
return Graph[node].Parent; }
57 [[nodiscard]] Node FirstChild(Node node)
const {
return Graph[node].Child; }
58 [[nodiscard]] Node NextSibling(Node node)
const {
return Graph[node].Sibling; }
60 [[nodiscard]] Node LeftMost(Node node)
const
63 while(node = FirstChild(current)) current = node;
67 [[nodiscard]] uint32_t Depth(Node node)
const
78 Node Insert(
const DataType& data, Node parent)
82 Freed.push_back(
static_cast<Node
>(Graph.size()));
83 Graph.push_back(Director()); Data.push_back(DataType());
86 Node next = Freed.front(); Freed.pop_front();
87 Director& pnode = Graph[parent];
88 Director& node = Graph[next];
92 node.Sibling = pnode.Child;
94 node.Flags = Director::VALID;
104 void Erase(Node node)
106 if(node == 0)
return;
108 Director& erased = Graph[node];
109 erased.Flags &= ~Director::VALID;
110 Freed.push_back(node);
112 Graph[erased.Parent].Child = erased.Sibling;
114 NodeQueue stack{ erased.Child };
116 while(stack.empty() ==
false)
118 Node next = stack.front(); stack.pop_front();
119 Director& child = Graph[next];
120 child.Flags &= ~Director::VALID;
121 Freed.push_back(next);
123 if(child.Sibling) stack.push_front(child.Sibling);
124 if(child.Child) stack.push_front(child.Child);
128 DataType& operator[](Node node) {
return Data[node]; }
129 [[nodiscard]]
const DataType& operator[](Node node)
const {
return Data[node]; }
131 template<
typename V,
typename O>
132 void Traverse(V& visitor)
154 Node operator()(Node node)
156 node = VisitQueue.back(); VisitQueue.pop_back();
157 Director& current = Graph.Graph[node];
159 if(current.Sibling) VisitQueue.push_back(current.Sibling);
160 if(current.Child) VisitQueue.push_front(current.Child);
162 if(VisitQueue.empty())
return 0;
168 NodeQueue VisitQueue;
177 Node operator()(Node node)
179 Director& current = Graph.Graph[node];
181 if(current.Sibling) VisitQueue.push_front(current.Sibling);
182 if(current.Child) VisitQueue.push_front(current.Child);
184 if(VisitQueue.empty())
return 0;
185 Node next = VisitQueue.front(); VisitQueue.pop_front();
191 NodeQueue VisitQueue;
200 Node operator()(Node node)
202 if(node == 0) VisitQueue.push_back(Graph.LeftMost(node));
204 node = VisitQueue.front(); VisitQueue.pop_front();
205 Director& current = Graph.Graph[node];
209 if(Graph.NextSibling(current.Sibling)) VisitQueue.push_back(current.Parent);
210 VisitQueue.push_back(Graph.LeftMost(current.Sibling));
218 NodeQueue VisitQueue;
227 Node operator()(Node node)
229 if(VisitQueue.empty()) VisitQueue.push_back(Graph.LeftMost(node));
231 node = VisitQueue.front(); VisitQueue.pop_front();
232 if(node == 0)
return node;
233 Director& current = Graph.Graph[node];
235 VisitQueue.push_back(current.Sibling ? Graph.LeftMost(current.Sibling) : Graph.Parent(node));
242 NodeQueue VisitQueue;
245 template<
typename V,
typename O>
249 using VisitorType = V;
257 while(node = Order(node))
259 if(Visitor(Graph[node], node))
break;
265 VisitorType& Visitor;
Definition DirectedGraph.h:223