OpenADFortTk (including Open64 and OpenAnalysis references)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Tree.cpp
Go to the documentation of this file.
1 
21 // Mint headers
22 #include "Tree.hpp"
23 
24 namespace OA {
25 
26 template <class T> void deque_erase (std::deque<T> d, T elt);
27 
28 //--------------------------------------------------------------------
34 {
35  mQueue = n.outgoing;
36  mIter = mQueue->begin();
37  OA_ptr<Edge> e; e = 0;
38  if (mIter != mQueue->end()) {
39  e = *mIter;
40  }
41  while ((e.ptrEqual(0)) && (mIter != mQueue->end())) {
42  ++mIter;
43  e = *mIter;
44  }
45 }
46 //--------------------------------------------------------------------
47 
48 //--------------------------------------------------------------------
50 void
52 {
53  ++mIter;
54  OA_ptr<Edge> e; e = 0;
55  if (mIter != mQueue->end())
56  e = *mIter;
57  while ((e.ptrEqual(0)) && (mIter != mQueue->end())) {
58  ++mIter;
59  e = *mIter;
60  }
61 }
62 //--------------------------------------------------------------------
63 
64 
65 //--------------------------------------------------------------------
74 {
75  if (! t.root_node.ptrEqual(0)) {
76  if (t.preorder_needed) {
77  // reset all the preoder_next links
78  std::set<OA_ptr<Node> >::iterator ni = t.node_set->begin();
79  while (ni != t.node_set->end()) {
80  OA_ptr<Node> n = *ni;
81  n->next_preorder = 0;
82  ++ni;
83  }
85  t.preorder_needed = false;
86  }
87  }
88  p = t.root_node;
89 }
90 //--------------------------------------------------------------------
91 
92 
93 //--------------------------------------------------------------------
101 {
102  OA_ptr<Node> last;
103 
104  ChildNodesIterator iter(*n);
105  if (!iter.isValid()) {
106  n->next_preorder = 0;
107  last = n;
108  }
109  else {
110  last = n;
111  do {
112  last->next_preorder = iter.current();
113  last = create_preorder_links(iter.current());
114  ++iter;
115  } while (iter.isValid());
116  }
117  return last;
118 }
119 //--------------------------------------------------------------------
120 
121 //--------------------------------------------------------------------
130 {
131  if (! t.root_node.ptrEqual(0)) {
132  if (t.postorder_needed) {
133  // reset all the preoder_next links
134  std::set<OA_ptr<Node> >::iterator ni = t.node_set->begin();
135  while (ni != t.node_set->end()) {
136  OA_ptr<Node> n = *ni;
137  n->next_postorder = NULL;
138  n->prev_postorder = NULL;
139  ++ni;
140  }
141  OA_ptr<Node> nullNode; nullNode = NULL;
142  t.create_postorder_links(t.root_node, nullNode);
143  t.postorder_needed = false;
144  t.rpostorder_needed = false;
145  }
146  }
147  p = t.mPostOrderStart;
148 }
149 //--------------------------------------------------------------------
150 
151 
152 //--------------------------------------------------------------------
160 {
161  OA_ptr<Node> retLast = last;
162 
163  ChildNodesIterator iter(*n);
164  for (; iter.isValid(); ++iter) {
165  retLast = create_postorder_links(iter.current(),retLast);
166  }
167 
168  // links for this node
169  if (retLast.ptrEqual(NULL)) { // this is the first node in postorder
170  mPostOrderStart = n;
171  } else {
172  retLast->next_postorder = n;
173  }
174  n->prev_postorder = retLast;
175  retLast = n;
176 
177  return retLast;
178 }
179 //--------------------------------------------------------------------
180 
181 
182 //--------------------------------------------------------------------
185 void
188 {
189  if (e.ptrEqual(0)) {
190  throw EmptyEdge();
191  }
192  if (edge_set->find(e) != edge_set->end()) {
193  throw DuplicateEdge(e);
194  }
195  if (e->in_use) {
196  throw EdgeInUse(e);
197  }
198  if ((e->child_node.ptrEqual(0)) || (e->parent_node.ptrEqual(0))) {
199  throw EmptyEndPoint(e);
200  }
201  if (!e->child_node->incoming.ptrEqual(0)) {
202  throw SecondParent(e);
203  }
204 
205  // insert the nodes if they don't already exist in the graph
206  if (node_set->find(e->parent_node) == node_set->end()) {
207  addNode(e->parent_node);
208  }
209  if (node_set->find(e->child_node) == node_set->end()) {
210  addNode(e->child_node);
211  }
212 
213  // insert the edge in the corresponding lists of the two nodes
214  e->parent_node->outgoing->push_back(e);
215  e->child_node->incoming = e;
216 
217  // finally, insert the edge itself in the tree
218  e->in_use = true;
219  edge_set->insert(e);
221 }
222 //--------------------------------------------------------------------
223 
224 
225 //--------------------------------------------------------------------
227 void
230 {
231  if (n.ptrEqual(0)) {
232  throw EmptyNode();
233  }
234  if (node_set->find(n) != node_set->end()) {
235  throw DuplicateNode(n);
236  }
237  if (n->in_use) {
238  throw NodeInUse(n);
239  }
240  if (root_node.ptrEqual(0)) {
241  root_node = n;
242  }
243  n->in_use = true;
244  node_set->insert(n);
246 }
247 //--------------------------------------------------------------------
248 
249 
250 //--------------------------------------------------------------------
254 void
256  throw (Tree::EmptyNode)
257 {
258  if (n.ptrEqual(0)) {
259  throw EmptyNode();
260  }
261  OA_ptr<Edge> nullEdge; nullEdge = 0;
262  n->outgoing->push_back(nullEdge);
263 }
264 //--------------------------------------------------------------------
265 
266 
267 //--------------------------------------------------------------------
268 void
271 {
272  if (e.ptrEqual(0)) {
273  throw EmptyEdge();
274  }
275  if (edge_set->erase(e) == 0) {
276  throw NonexistentEdge(e);
277  }
279  e->in_use = false;
280  deque_erase<OA_ptr<Edge> >(*(e->parent_node->outgoing), e);
281  e->child_node->incoming = 0;
282 }
283 //--------------------------------------------------------------------
284 
285 
286 //--------------------------------------------------------------------
287 void
290 {
291  if (n.ptrEqual(0)) {
292  throw EmptyNode();
293  }
294  if ((n.ptrEqual(root_node)) && (!edge_set->empty() || (node_set->size() > 1)))
296  if (node_set->erase(n) == 0)
297  throw NonexistentNode(n);
299  n->in_use = false;
300  if (n == root_node)
301  root_node = 0;
302 
303  if (! n->incoming.ptrEqual(0)) {
304  edge_set->erase(n->incoming);
305  deque_erase<OA_ptr<Edge> >(*(n->incoming->parent_node->outgoing),
306  n->incoming);
307  }
308 
309  OutEdgesIterator out(*n);
310  while (out.isValid()) {
311  OA_ptr<Edge> e = out.current();
312  e->child_node->incoming = 0;
313  edge_set->erase(e);
314  ++out;
315  }
316 }
317 //--------------------------------------------------------------------------------------------------------------------
318 
319 
320 //--------------------------------------------------------------------
323 template <class T>
324 void
325 deque_erase (std::deque<T> d, T elt)
326 {
327  typename std::deque<T>::iterator iter = d.begin();
328  while (iter != d.end()) {
329  T k = *iter;
330  if (k == elt) {
331  d.erase(iter);
332  break;
333  }
334  }
335 }
336 //--------------------------------------------------------------------------------------------------------------------
337 
338 
339 //--------------------------------------------------------------------------------------------------------------------
345 /*
346 OA_ptr<Tree::Node>
347 Tree::clone (OA_ptr<Tree::Node> subtree)
348 {
349  OA_ptr<Node> new_root = subtree->new_copy();
350  OutEdgesIterator edge_iter(*subtree);
351  while (edge_iter.isValid()) {
352  OA_ptr<Edge> out_edge = edge_iter.current();
353  if (! out_edge.ptrEqual(0)) {
354  OA_ptr<Node> new_child = clone(out_edge->sink());
355  addEdge(out_edge->new_copy(new_root, new_child));
356  }
357  else {
358  OA_ptr<Edge> nullEdge; nullEdge = 0;
359  new_root->outgoing->push_back(nullEdge);
360  }
361  ++edge_iter;
362  }
363  return new_root;
364 }
365 */
366 //--------------------------------------------------------------------------------------------------------------------
367 
368 } // end of OA namespace