Go to the documentation of this file.00001
00015 #ifndef NewExprTree_H
00016 #define NewExprTree_H
00017 #include <set>
00018 #include <map>
00019
00020
00021 #include <OpenAnalysis/IRInterface/IRHandles.hpp>
00022 #include <OpenAnalysis/Utils/OA_ptr.hpp>
00023 #include <OpenAnalysis/Utils/Tree.hpp>
00024 #include <OpenAnalysis/IRInterface/ConstValBasicInterface.hpp>
00025 #include <OpenAnalysis/IRInterface/OpBasicInterface.hpp>
00026 #include <OpenAnalysis/MemRefExpr/MemRefExpr.hpp>
00027
00028 #include <OpenAnalysis/ExprTree/ExprTree.hpp>
00029
00030 namespace OA {
00031 using namespace std;
00032
00033 class NewExprTree;
00034
00035
00036 class NewExprTreeVisitor;
00037
00038
00039
00040
00044 class NewExprTree : public ExprTree {
00045 public:
00046 class Node;
00047 class Edge;
00048
00049 public:
00050 NewExprTree();
00051 virtual ~NewExprTree();
00052
00053 OA_ptr<Node> getRoot() {
00054 OA_ptr<Tree::Node> n = Tree::getRoot();
00055 return n.convert<Node>();
00056 }
00057
00058
00060 void acceptVisitor(NewExprTreeVisitor& pVisitor);
00061
00062
00063
00064
00065 void connect(OA_ptr<Node> src, OA_ptr<Node> dst)
00066 { OA_ptr<Edge> e; e = new Edge(src,dst); addEdge(e); }
00067 void disconnect(OA_ptr<Edge> e) { removeEdge(e.convert<Tree::Edge>()); }
00068 void copyAndConnectSubTree(OA_ptr<Node> src, OA_ptr<NewExprTree> subtree);
00069
00070
00071
00072
00073
00074
00075 bool operator<(NewExprTree &rhs);
00076 bool operator==(NewExprTree &rhs);
00077 private:
00078 bool compareTreesRootedAt(OA_ptr<Node> rootLHS, OA_ptr<Node> rootRHS);
00079 public:
00080
00081
00082 class Node : public Tree::Node {
00083 public:
00084 Node()
00085 : Tree::Node() { }
00086 Node(const std::string& x)
00087 : Tree::Node(), mName(x) { }
00088 virtual ~Node() { }
00089
00090
00091 std::string& getName() { return mName; }
00092
00094 virtual OA_ptr<Node> copy() = 0;
00095
00097 virtual bool isaOpNode() { return false; }
00098 virtual bool isaCallNode() { return false; }
00099 virtual bool isaMemRefNode() { return false; }
00100 virtual bool isaConstSymNode() { return false; }
00101 virtual bool isaConstValNode() { return false; }
00102
00104
00105
00106
00107 virtual void acceptVisitor(NewExprTreeVisitor&) = 0;
00108 virtual void dump(std::ostream& os) { Tree::Node::dump(os); }
00109 virtual void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00110
00111
00112
00113
00114 virtual void output(IRHandlesIRInterface& ir) { Tree::Node::output(ir); }
00115
00116
00117
00118
00119 virtual bool operator<(Node& rhs) = 0;
00120 virtual int getOrder() = 0;
00121
00122 private:
00123 std::string mName;
00124
00125 };
00126
00127 class OpNode : public Node {
00128 public:
00129 OpNode() : Node("OpNode") { }
00130 OpNode(OA_ptr<OpBasicInterface> op) : Node("OpNode"), mOpInterface(op) {}
00131 virtual ~OpNode() { }
00132
00134 OA_ptr<Node> copy()
00135 { OA_ptr<Node> ret; ret = new OpNode(mOpInterface); return ret; }
00136
00137 bool isaOpNode() { return true; }
00138 OA_ptr<OpBasicInterface> getOpInterface() { return mOpInterface; }
00139 void dump(std::ostream& os) { Node::dump(os); }
00140 void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00141
00142 void acceptVisitor(NewExprTreeVisitor& pVisitor);
00143
00144
00145
00146
00147 void output(IRHandlesIRInterface& ir);
00148
00149
00150
00151
00152 bool operator<(Node& rhs);
00153 bool operator<(OpNode& rhs);
00154 virtual int getOrder() { return sOrder; }
00155
00156 private:
00157 static const int sOrder = 100;
00158 OA_ptr<OpBasicInterface> mOpInterface;
00159 };
00160
00161 class CallNode : public Node {
00162 public:
00163 CallNode() : Node("CallNode") { }
00164 CallNode(CallHandle h) : Node("CallNode"), mHandle(h) {}
00165 virtual ~CallNode() { }
00166
00168 OA_ptr<Node> copy()
00169 { OA_ptr<Node> ret; ret = new CallNode(mHandle); return ret; }
00170
00171 bool isaCallNode() { return true; }
00172 CallHandle getHandle() { return mHandle; }
00173 void dump(std::ostream& os) { Node::dump(os); }
00174 void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00175
00176 void acceptVisitor(NewExprTreeVisitor& pVisitor);
00177
00178
00179
00180
00181 void output(IRHandlesIRInterface& ir) ;
00182
00183
00184
00185
00186 bool operator<(Node& rhs);
00187 bool operator<(CallNode& rhs);
00188 virtual int getOrder() { return sOrder; }
00189
00190 private:
00191
00192 static const int sOrder = 500;
00193 CallHandle mHandle;
00194 };
00195
00196 class MemRefNode : public Node {
00197 public:
00198 MemRefNode() : Node("MemRefNode") { }
00199 MemRefNode(OA_ptr<MemRefExpr> mre) : Node("MemRefNode"), mMRE(mre) {}
00200 virtual ~MemRefNode() { }
00201
00203 OA_ptr<Node> copy()
00204 { OA_ptr<Node> ret; ret = new MemRefNode(mMRE); return ret; }
00205
00206 bool isaMemRefNode() { return true; }
00207 OA_ptr<MemRefExpr> getMRE() { return mMRE; }
00208 void dump(std::ostream& os) { Node::dump(os); }
00209 void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00210
00211 void acceptVisitor(NewExprTreeVisitor& pVisitor);
00212
00213
00214
00215
00216 void output(IRHandlesIRInterface& ir) ;
00217
00218
00219
00220
00221 bool operator<(Node& rhs);
00222 bool operator<(MemRefNode& rhs);
00223 virtual int getOrder() { return sOrder; }
00224
00225 private:
00226 static const int sOrder = 200;
00227 OA_ptr<MemRefExpr> mMRE;
00228 };
00229
00230 class ConstSymNode : public Node {
00231 public:
00232 ConstSymNode() : Node("ConstSymNode") { }
00233 ConstSymNode(ConstSymHandle h) : Node("ConstSymNode"), mHandle(h) {}
00234 virtual ~ConstSymNode() { }
00235
00237 OA_ptr<Node> copy()
00238 { OA_ptr<Node> ret; ret = new ConstSymNode(mHandle); return ret; }
00239
00240 bool isaConstSymNode() { return true; }
00241 ConstSymHandle getHandle() { return mHandle; }
00242 void dump(std::ostream& os) { Node::dump(os); }
00243 void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00244
00245 void acceptVisitor(NewExprTreeVisitor& pVisitor);
00246
00247
00248
00249
00250 void output(IRHandlesIRInterface& ir) ;
00251
00252
00253
00254
00255 bool operator<(Node& rhs);
00256 bool operator<(ConstSymNode& rhs);
00257 virtual int getOrder() { return sOrder; }
00258
00259 private:
00260 static const int sOrder = 300;
00261 ConstSymHandle mHandle;
00262 };
00263
00264 class ConstValNode : public Node {
00265 public:
00266 ConstValNode() : Node("ConstValNode") { }
00267 ConstValNode(OA_ptr<ConstValBasicInterface> constInter) :
00268 Node("ConstValNode"),
00269 mConstValInter(constInter)
00270 { }
00271 virtual ~ConstValNode() { }
00272
00274 OA_ptr<Node> copy()
00275 { OA_ptr<Node> ret; ret = new ConstValNode(mConstValInter); return ret; }
00276
00277 bool isaConstValNode() { return true; }
00278 OA_ptr<ConstValBasicInterface> getConstValInterface() {
00279 return mConstValInter;
00280 }
00281 void dump(std::ostream& os) { Node::dump(os); }
00282 void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00283
00284 void acceptVisitor(NewExprTreeVisitor& pVisitor);
00285
00286
00287
00288
00289 void output(IRHandlesIRInterface& ir) ;
00290
00291
00292
00293
00294 bool operator<(Node& rhs);
00295 bool operator<(ConstValNode& rhs);
00296 virtual int getOrder() { return sOrder; }
00297
00298 private:
00299 static const int sOrder = 400;
00300 OA_ptr<ConstValBasicInterface> mConstValInter;
00301 };
00302
00303
00304 class Edge : public Tree::Edge {
00305 public:
00306 Edge(OA_ptr<Node> n1, OA_ptr<Node> n2)
00307 : Tree::Edge(n1, n2) { }
00308 virtual ~Edge() { }
00309
00310
00311 OA_ptr<Node> parent () const {
00312 OA_ptr<Tree::Node> n = Tree::Edge::parent();
00313 return n.convert<Node>();
00314 }
00315 OA_ptr<Node> source () const { return parent(); }
00316 OA_ptr<Node> tail () const { return parent(); }
00317 OA_ptr<Node> child () const {
00318 OA_ptr<Tree::Node> n = Tree::Edge::child();
00319 return n.convert<Node>();
00320 }
00321 OA_ptr<Node> sink () const { return child(); }
00322 OA_ptr<Node> head () const { return child(); }
00323
00324 void dump(std::ostream& os);
00325 void dump() { dump(std::cout); }
00326
00327 private:
00328 };
00329
00330
00331
00338 class NodesIterator : public Tree::NodesIterator {
00339 public:
00340 NodesIterator (Tree& t) : Tree::NodesIterator(t) {}
00341 virtual ~NodesIterator () {}
00342 OA_ptr<Node> current() const {
00343 OA_ptr<Tree::Node> n = Tree::NodesIterator::current();
00344 return n.convert<Node>();
00345 }
00346 };
00347
00348
00355 class EdgesIterator : public Tree::EdgesIterator {
00356 public:
00357 EdgesIterator (Tree& t) : Tree::EdgesIterator(t) {}
00358 virtual ~EdgesIterator () {}
00359 OA_ptr<Edge> current() const {
00360 OA_ptr<Tree::Edge> e = Tree::EdgesIterator::current();
00361 return e.convert<Edge>();
00362 }
00363 };
00364
00365
00369 class OutEdgesIterator : public Tree::OutEdgesIterator {
00370 public:
00371 OutEdgesIterator (Node& n) : Tree::OutEdgesIterator(n) {}
00372 virtual ~OutEdgesIterator () {}
00373 OA_ptr<Edge> current() const {
00374 OA_ptr<Tree::Edge> e = Tree::OutEdgesIterator::current();
00375 return e.convert<Edge>();
00376 }
00377 };
00378
00379
00384 class ChildNodesIterator : public Tree::ChildNodesIterator {
00385 public:
00386 ChildNodesIterator (Node& n) : Tree::ChildNodesIterator(n) {}
00387 ~ChildNodesIterator () {}
00388 OA_ptr<Node> current() const {
00389 OA_ptr<Tree::Node> n = Tree::ChildNodesIterator::current();
00390 return n.convert<Node>();
00391 }
00392 };
00393
00394 void str(std::ostream& os);
00395
00396 void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00397
00398
00399
00400
00401
00402 void output(IRHandlesIRInterface& ir) ;
00403
00404
00408 class PreOrderIterator : public Tree::PreOrderIterator {
00409 public:
00410 PreOrderIterator (Tree& t) : Tree::PreOrderIterator(t) {}
00411 virtual ~PreOrderIterator () {}
00412 OA_ptr<Node> current() const {
00413 OA_ptr<Tree::Node> n = PreOrderIterator::current();
00414 return n.convert<Node>();
00415 }
00416 };
00417
00421 class PostOrderIterator : public Tree::PostOrderIterator {
00422 public:
00423 PostOrderIterator (Tree& t) : Tree::PostOrderIterator(t) {}
00424 virtual ~PostOrderIterator () {}
00425 OA_ptr<Node> current() const {
00426 OA_ptr<Tree::Node> n = PostOrderIterator::current();
00427 return n.convert<Node>();
00428 }
00429 };
00430
00434 class ReversePostOrderIterator : public Tree::ReversePostOrderIterator {
00435 public:
00436 ReversePostOrderIterator (Tree& t) : Tree::ReversePostOrderIterator(t) {}
00437 virtual ~ReversePostOrderIterator () {}
00438 OA_ptr<Node> current() const {
00439 OA_ptr<Tree::Node> n = Tree::ReversePostOrderIterator::current();
00440 return n.convert<Node>();
00441 }
00442 };
00443
00444 };
00445
00446
00447 }
00448
00449 #endif