Go to the documentation of this file.00001
00014
00015
00016 #include "ExprTree.hpp"
00017
00018
00019 #include <OpenAnalysis/ExprTree/ExprTreeVisitor.hpp>
00020 #include <OpenAnalysis/ExprTree/OutputExprTreeVisitor.hpp>
00021
00022 namespace OA {
00023
00024
00025 ExprTree::ExprTree()
00026 {
00027 }
00028
00029 ExprTree::~ExprTree()
00030 {
00031 }
00032
00033 OA_ptr<std::set<OA_ptr<ExprTree> > >
00034 intersectExprTreeSets(std::set<OA_ptr<ExprTree> >& set1,
00035 std::set<OA_ptr<ExprTree> >& set2)
00036 {
00037 OA_ptr<set<OA_ptr<ExprTree> > > temp;
00038 temp = new set<OA_ptr<ExprTree> >;
00039 std::set_intersection(set1.begin(), set1.end(),
00040 set2.begin(), set2.end(),
00041 std::inserter(*temp,temp->end()));
00042 return temp;
00043 }
00044
00045
00046 OA_ptr<std::set<OA_ptr<ExprTree> > >
00047 unionExprTreeSets(std::set<OA_ptr<ExprTree> >& set1, std::set<OA_ptr<ExprTree> >& set2)
00048 {
00049 OA_ptr<std::set<OA_ptr<ExprTree> > > temp;
00050 temp = new std::set<OA_ptr<ExprTree> >;
00051
00052 std::set<OA_ptr<ExprTree> >::iterator setIter;
00053 int count1=0;
00054 for (setIter=set1.begin(); setIter!=set1.end(); setIter++) {
00055 OA_ptr<ExprTree> loc = *setIter;
00056 count1++;
00057 }
00058
00059 int count2=0;
00060 for (setIter=set2.begin(); setIter!=set2.end(); setIter++) {
00061 OA_ptr<ExprTree> loc = *setIter;
00062 count2++;
00063 }
00064
00065 std::set_union(set1.begin(), set1.end(),
00066 set2.begin(), set2.end(),
00067 std::inserter(*temp,temp->end()));
00068 return temp;
00069 }
00070
00071
00072
00073
00074
00075
00077 void ExprTree::acceptVisitor(ExprTreeVisitor& pVisitor)
00078 {
00079 pVisitor.visitExprTreeBefore(*this);
00080 getRoot()->acceptVisitor(pVisitor);
00081 pVisitor.visitExprTreeAfter(*this);
00082 }
00083
00089
00090 void ExprTree::copyAndConnectSubTree(OA_ptr<Node> src, OA_ptr<ExprTree> subtree)
00091 {
00092 std::map<OA_ptr<Node>,OA_ptr<Node> > oldToNewNodeMap;
00093
00094
00095 NodesIterator nIter(*subtree);
00096 for ( ; nIter.isValid(); ++nIter) {
00097 oldToNewNodeMap[nIter.current()] = nIter.current()->copy();
00098 }
00099
00100
00101 EdgesIterator eIter(*subtree);
00102 for ( ; eIter.isValid(); ++eIter ) {
00103 OA_ptr<Edge> edge = eIter.current();
00104 connect( oldToNewNodeMap[edge->source()],
00105 oldToNewNodeMap[edge->sink()] );
00106 }
00107 connect(src,oldToNewNodeMap[subtree->getRoot()]);
00108 }
00109
00110
00111 void
00112 ExprTree::dump (std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00113 {
00114 os << "===== ExprTree: =====" << std::endl;
00115
00116
00117
00118 NodesIterator nodes_iter(*this);
00119 for ( ; nodes_iter.isValid(); ++nodes_iter) {
00120 OA_ptr<ExprTree::Node> node = nodes_iter.current();
00121 node->dump(os,ir);
00122 }
00123
00124 os << "====================" << std::endl << std::endl;
00125 }
00126
00127 bool ExprTree::operator<(ExprTree &other)
00128 {
00129
00130 return getRoot() < other.getRoot();
00131 }
00132
00133
00134
00135 bool ExprTree::operator==(ExprTree &other)
00136 {
00137 return getRoot() == other.getRoot();
00138 }
00139
00140 void
00141 ExprTree::output(IRHandlesIRInterface& ir)
00142 {
00143
00144 NodesIterator nodes_iter(*this);
00145
00146 sOutBuild->graphStart("EXPRESSION TREE");
00147
00148 OutputExprTreeVisitor OutputTreeVisitor(ir);
00149 acceptVisitor(OutputTreeVisitor);
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 sOutBuild->graphEnd("Expression Tree");
00171
00172 }
00173
00174
00175
00176
00177 bool ExprTree::Node::operator<(Node& other)
00178 {
00179 bool retval = false;
00180 if(getOrder() < other.getOrder()) { retval = true; }
00181 return retval;
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 }
00198
00199 bool ExprTree::Node::operator==(Node& other)
00200 {
00201 bool retval = false;
00202 if(getOrder() == other.getOrder()) { retval = true; }
00203 return retval;
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 }
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 void ExprTree::OpNode::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00230 {
00231 Node::dump(os,ir);
00232 os << "handle: " << ir->toString(mHandle) << std::endl;
00233 }
00234
00235 void ExprTree::OpNode::output(IRHandlesIRInterface& ir)
00236 {
00237 ostringstream label;
00238 label << "ET OpNode ( " << ir.toString(mHandle) << " )";
00239 sOutBuild->outputString( label.str() );
00240 }
00241
00242 void ExprTree::OpNode::acceptVisitor(ExprTreeVisitor& pVisitor)
00243 {
00244 pVisitor.visitOpNode(*this);
00245 }
00246
00247 bool ExprTree::OpNode::operator<(Node& other)
00248 {
00249 if(getOrder() < other.getOrder()) { return true; }
00250 else if(getOrder() > other.getOrder()) { return false; }
00251
00252
00253 OpNode& ref = static_cast<OpNode&>(other);
00254
00255 if( getHandle() < ref.getHandle() )
00256 {
00257 return true;
00258 } else {
00259 return false;
00260 }
00261
00262 }
00263
00264 bool ExprTree::OpNode::operator==(Node& other)
00265 {
00266 if(getOrder() != other.getOrder()) { return false; }
00267
00268
00269 OpNode& ref = static_cast<OpNode&>(other);
00270
00271 if( getHandle() == ref.getHandle() )
00272 {
00273 return true;
00274 } else {
00275 return false;
00276 }
00277
00278 }
00279
00280
00281
00282
00283 void ExprTree::CallNode::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00284 {
00285 Node::dump(os,ir);
00286 os << "handle: " << ir->toString(mHandle) << std::endl;
00287 }
00288
00289 void ExprTree::CallNode::output(IRHandlesIRInterface& ir)
00290 {
00291 ostringstream label;
00292 label << "ET CallNode ( " << ir.toString(mHandle) << " )";
00293 sOutBuild->outputString( label.str() );
00294 }
00295
00296 void ExprTree::CallNode::acceptVisitor(ExprTreeVisitor& pVisitor)
00297 {
00298 pVisitor.visitCallNode(*this);
00299 }
00300
00301 bool ExprTree::CallNode::operator<(Node& other)
00302 {
00303 if(getOrder() < other.getOrder()) { return true; }
00304 else if(getOrder() > other.getOrder()) { return false; }
00305
00306 return false;
00307
00308 CallNode& ref = static_cast<CallNode&>(other);
00309
00310 if( getHandle() < ref.getHandle() )
00311 {
00312 return true;
00313 } else {
00314 return false;
00315 }
00316
00317
00318 }
00319
00320 bool ExprTree::CallNode::operator==(Node& other)
00321 {
00322 return false;
00323 }
00324
00325
00326
00327
00328
00329 void ExprTree::MemRefNode::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00330 {
00331 Node::dump(os,ir);
00332 os << "handle: " << ir->toString(mHandle) << std::endl;
00333 }
00334
00335 void ExprTree::MemRefNode::output(IRHandlesIRInterface& ir)
00336 {
00337 ostringstream label;
00338 label << "ET MemRefNode ( " << ir.toString(mHandle) << " )";
00339 sOutBuild->outputString( label.str() );
00340 }
00341
00342 void ExprTree::MemRefNode::acceptVisitor(ExprTreeVisitor& pVisitor)
00343 {
00344 pVisitor.visitMemRefNode(*this);
00345 }
00346 bool ExprTree::MemRefNode::operator<(Node& other)
00347 {
00348 if(getOrder() < other.getOrder()) { return true; }
00349 else if(getOrder() > other.getOrder()) { return false; }
00350
00351
00352 MemRefNode& ref = static_cast<MemRefNode&>(other);
00353
00354 if( getHandle() < ref.getHandle() )
00355 {
00356 return true;
00357 } else {
00358 return false;
00359 }
00360
00361 }
00362
00363 bool ExprTree::MemRefNode::operator==(Node& other)
00364 {
00365 if(getOrder() != other.getOrder()) { return false; }
00366
00367 MemRefNode& ref = static_cast<MemRefNode&>(other);
00368
00369 if( getHandle() == ref.getHandle() )
00370 {
00371 return true;
00372 } else {
00373 return false;
00374 }
00375
00376 }
00377
00378
00379
00380
00381 void ExprTree::ConstSymNode::dump(std::ostream& os,
00382 OA_ptr<IRHandlesIRInterface> ir)
00383 {
00384 Node::dump(os,ir);
00385 os << "handle: " << ir->toString(mHandle) << std::endl;
00386 }
00387
00388 void ExprTree::ConstSymNode::output(IRHandlesIRInterface& ir)
00389 {
00390 ostringstream label;
00391 label << "ET ConstSymNode ( " << ir.toString(mHandle) << " )";
00392 sOutBuild->outputString( label.str() );
00393 }
00394
00395 void ExprTree::ConstSymNode::acceptVisitor(ExprTreeVisitor& pVisitor)
00396 {
00397 pVisitor.visitConstSymNode(*this);
00398 }
00399 bool ExprTree::ConstSymNode::operator<(Node& other)
00400 {
00401 if(getOrder() < other.getOrder()) { return true; }
00402 else if(getOrder() > other.getOrder()) { return false; }
00403
00404
00405 ConstSymNode& ref = static_cast<ConstSymNode&>(other);
00406
00407 if( getHandle() < ref.getHandle() )
00408 {
00409 return true;
00410 } else {
00411 return false;
00412 }
00413
00414 }
00415
00416 bool ExprTree::ConstSymNode::operator==(Node& other)
00417 {
00418 if(getOrder() != other.getOrder()) { return false; }
00419
00420 ConstSymNode& ref = static_cast<ConstSymNode&>(other);
00421
00422 if( getHandle() == ref.getHandle() )
00423 {
00424 return true;
00425 } else {
00426 return false;
00427 }
00428
00429 }
00430
00431
00432
00433
00434 void ExprTree::ConstValNode::dump(std::ostream& os,
00435 OA_ptr<IRHandlesIRInterface> ir)
00436 {
00437 Node::dump(os,ir);
00438 os << "handle: " << ir->toString(mHandle) << std::endl;
00439 }
00440
00441 void ExprTree::ConstValNode::output(IRHandlesIRInterface& ir)
00442 {
00443 ostringstream label;
00444 label << "ET ConstValNode ( " << ir.toString(mHandle) << " )";
00445 sOutBuild->outputString( label.str() );
00446 }
00447
00448 void ExprTree::ConstValNode::acceptVisitor(ExprTreeVisitor& pVisitor)
00449 {
00450 pVisitor.visitConstValNode(*this);
00451 }
00452 bool ExprTree::ConstValNode::operator<(Node& other)
00453 {
00454 bool retval = false;
00455 if(getOrder() < other.getOrder()) { return true; }
00456 else
00457 if(getOrder() > other.getOrder()) { return false; }
00458
00459
00460 ConstValNode& ref = static_cast<ConstValNode&>(other);
00461
00462 if( getHandle() < ref.getHandle() )
00463 {
00464 return true;
00465 } else {
00466 return false;
00467 }
00468
00469 }
00470
00471 bool ExprTree::ConstValNode::operator==(Node& other)
00472 {
00473 if(getOrder() != other.getOrder()) { return false; }
00474 ConstValNode& ref = static_cast<ConstValNode&>(other);
00475 if( getHandle() == ref.getHandle() )
00476 {
00477 return true;
00478 } else {
00479 return false;
00480 }
00481
00482 }
00483
00484
00485
00486 void ExprTree::Edge::dump(std::ostream& os)
00487 {
00488 std::cout << "{Edge: parent: " << parent() << " child: " << child()
00489 << "}" << std::endl;
00490 }
00491
00492
00493 void
00494 ExprTree::Node::dump (std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00495 {
00496 os << "{Node: "
00497 << " " << mName;
00498
00499 }
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527 }