ROSE 0.11.145.147
VirtualCFGIterator.h
1#include <featureTests.h>
2#ifdef ROSE_ENABLE_SOURCE_ANALYSIS
3
4#ifndef VIRTUAL_CFG_ITERATOR
5#define VIRTUAL_CFG_ITERATOR
6
7#include "virtualCFG.h"
8#include "DataflowCFG.h"
9//#include "baseCFGIterator.h"
10
11#include <list>
12#include <set>
13#include <string>
14
15namespace VirtualCFG{
16
17// Iterates over DataflowNodes in a VirtualCFG, respecting dependences in the graph.
18// Supports both forward and backward iteration.
19class iterator/* : public virtual BaseCFG::iterator*/
20{
21 //protected:
22 public:
23
24 std::list<DataflowNode> remainingNodes;
25 //map<DataflowNode, bool> visited;
26 std::set<DataflowNode> visited;
27 bool initialized;
28
29 public:
30 iterator();
31
32 iterator(const DataflowNode &start);
33 virtual ~iterator() { }
34
35 void init(const DataflowNode &start);
36
37 protected:
38 // returns true if the given DataflowNode is in the remainingNodes list and false otherwise
39 bool isRemaining(DataflowNode n);
40
41 // advances this iterator in the given direction. Forwards if fwDir=true and backwards if fwDir=false.
42 // if pushAllChildren=true, all of the current node's unvisited children (predecessors or successors,
43 // depending on fwDir) are pushed onto remainingNodes
44 void advance(bool fwDir, bool pushAllChildren);
45
46 public:
47 virtual void operator ++ (int);
48
49 bool eq(const iterator& other_it) const;
50
51 bool operator==(const iterator& other_it) const;
52
53 bool operator!=(const iterator& it) const;
54
55 DataflowNode& operator * ();
56
57 // Returns a fresh iterator that starts at node n
58 static iterator begin(DataflowNode n);
59
60 // Returns an empty iterator that can be compared to any other iterator to
61 // check if it has completed passing over its iteration space
62 static iterator end();
63
64 // Contains the state of an iterator, allowing iterators to be
65 // checkpointed and restarted.
66 class checkpoint/* : public virtual BaseCFG::iterator::checkpoint*/
67 {
68 std::list<DataflowNode> remainingNodes;
69 std::set<DataflowNode> visited;
70
71 public:
72 checkpoint(const std::list<DataflowNode>& remainingNodes, const std::set<DataflowNode>& visited);
73
74 checkpoint(const checkpoint& that);
75
76 std::string str(std::string indent="");
77
78 friend class iterator;
79 };
80
81 // Returns a checkpoint of this iterator's progress.
82 checkpoint getChkpt();
83
84 // Loads this iterator's state from the given checkpoint.
85 void restartFromChkpt(checkpoint& chkpt);
86
87 std::string str(std::string indent="");
88};
89
90class back_iterator : /*public virtual BaseCFG::backiterator, */public virtual iterator
91{
92 public:
94
95 back_iterator(const DataflowNode &end): iterator(end) { }
96
97 void operator ++ (int);
98};
99
100class dataflow : /*public virtual BaseCFG::dataflow, */public virtual iterator
101{
102 DataflowNode terminator;
103 public:
104 //dataflow(): iterator() {}
105
106 dataflow(const DataflowNode &terminator_arg);
107
108 //dataflow(const DataflowNode &start) : iterator(start) {}
109 dataflow(const DataflowNode &start, const DataflowNode &terminator_arg);
110
111 void init(const DataflowNode &start_arg, const DataflowNode &terminator_arg);
112
113 // Initializes this iterator's terminator node
114 /*void setTerminator(const DataflowNode &terminator) {
115 initialized = true;
116 this->terminator = terminator;
117 }*/
118
119 void add(const DataflowNode &next);
120
121 //void operator ++ (int);
122
123 // Contains the state of an dataflow iterator, allowing dataflow
124 // iterators to be checkpointed and restarted.
125 class checkpoint/* : public virtual BaseCFG::dataflow::checkpoint*/
126 {
128 DataflowNode terminator;
129
130 public:
131 checkpoint(const iterator::checkpoint& iChkpt, const DataflowNode& terminator);
132
133 checkpoint(const checkpoint &that);
134
135 std::string str(std::string indent="");
136
137 friend class dataflow;
138 };
139
140 // Returns a checkpoint of this dataflow iterator's progress.
141 checkpoint getChkpt();
142
143 // Loads this dataflow iterator's state from the given checkpoint.
144 void restartFromChkpt(checkpoint& chkpt);
145
146 std::string str(std::string indent="");
147};
148
149class back_dataflow: /*public virtual BaseCFG::back_dataflow,*/ public virtual dataflow
150{
151 public:
152 //back_dataflow(): back_iterator() {}
153
154 back_dataflow(const DataflowNode &terminator_arg) : dataflow(terminator_arg) {}
155
156 //back_dataflow(const DataflowNode &end) : iterator(end) {}
157
158 back_dataflow(const DataflowNode &end, const DataflowNode &terminator_arg);
159
160 void operator ++ (int);
161};
162}
163#endif
164#endif