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
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
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
00131 }
00132
00133
00134
00135
00136
00137 bool ExprTree::operator==(ExprTree &other)
00138 {
00139
00140 }
00141
00142 void
00143 ExprTree::output(IRHandlesIRInterface& ir)
00144 {
00145
00146 NodesIterator nodes_iter(*this);
00147
00148 sOutBuild->graphStart("EXPRESSION TREE");
00149
00150 OutputExprTreeVisitor OutputTreeVisitor(ir);
00151 acceptVisitor(OutputTreeVisitor);
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 sOutBuild->graphEnd("Expression Tree");
00173
00174 }
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187 void ExprTree::OpNode::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00188 {
00189 Node::dump(os,ir);
00190 os << "handle: " << ir->toString(mHandle) << std::endl;
00191 }
00192
00193 void ExprTree::OpNode::output(IRHandlesIRInterface& ir)
00194 {
00195 ostringstream label;
00196 label << "ET OpNode ( " << ir.toString(mHandle) << " )";
00197 sOutBuild->outputString( label.str() );
00198 }
00199
00200 void ExprTree::OpNode::acceptVisitor(ExprTreeVisitor& pVisitor)
00201 {
00202 pVisitor.visitOpNode(*this);
00203 }
00204
00205 bool ExprTree::OpNode::operator<(Node& other)
00206 {
00207 if(getOrder() < other.getOrder()) { return true; }
00208 else if(getOrder() > other.getOrder()) { return false; }
00209
00210
00211 OpNode& ref = static_cast<OpNode&>(other);
00212
00213 if( getHandle() < ref.getHandle() )
00214 {
00215 return true;
00216 } else {
00217 return false;
00218 }
00219
00220 }
00221
00222 bool ExprTree::OpNode::operator==(Node& other)
00223 {
00224 if(getOrder() != other.getOrder()) { return false; }
00225
00226
00227 OpNode& ref = static_cast<OpNode&>(other);
00228
00229 if( getHandle() == ref.getHandle() )
00230 {
00231 return true;
00232 } else {
00233 return false;
00234 }
00235
00236 }
00237
00238
00239
00240
00241 void ExprTree::CallNode::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00242 {
00243 Node::dump(os,ir);
00244 os << "handle: " << ir->toString(mHandle) << std::endl;
00245 }
00246
00247 void ExprTree::CallNode::output(IRHandlesIRInterface& ir)
00248 {
00249 ostringstream label;
00250 label << "ET CallNode ( " << ir.toString(mHandle) << " )";
00251 sOutBuild->outputString( label.str() );
00252 }
00253
00254 void ExprTree::CallNode::acceptVisitor(ExprTreeVisitor& pVisitor)
00255 {
00256 pVisitor.visitCallNode(*this);
00257 }
00258
00259 bool ExprTree::CallNode::operator<(Node& other)
00260 {
00261 if(getOrder() < other.getOrder()) { return true; }
00262 else if(getOrder() > other.getOrder()) { return false; }
00263
00264 return false;
00265
00266 CallNode& ref = static_cast<CallNode&>(other);
00267
00268 if( getHandle() < ref.getHandle() )
00269 {
00270 return true;
00271 } else {
00272 return false;
00273 }
00274
00275
00276 }
00277
00278 bool ExprTree::CallNode::operator==(Node& other)
00279 {
00280 if(getOrder() != other.getOrder()) { return false; }
00281
00282
00283 CallNode& ref = static_cast<CallNode&>(other);
00284
00285 if( getHandle() == ref.getHandle() )
00286 {
00287 return true;
00288 } else {
00289 return false;
00290 }
00291
00292 }
00293
00294
00295
00296
00297
00298 void ExprTree::MemRefNode::dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00299 {
00300 Node::dump(os,ir);
00301 os << "handle: " << ir->toString(mHandle) << std::endl;
00302 }
00303
00304 void ExprTree::MemRefNode::output(IRHandlesIRInterface& ir)
00305 {
00306 ostringstream label;
00307 label << "ET MemRefNode ( " << ir.toString(mHandle) << " )";
00308 sOutBuild->outputString( label.str() );
00309 }
00310
00311 void ExprTree::MemRefNode::acceptVisitor(ExprTreeVisitor& pVisitor)
00312 {
00313 pVisitor.visitMemRefNode(*this);
00314 }
00315 bool ExprTree::MemRefNode::operator<(Node& other)
00316 {
00317 if(getOrder() < other.getOrder()) { return true; }
00318 else if(getOrder() > other.getOrder()) { return false; }
00319
00320
00321 MemRefNode& ref = static_cast<MemRefNode&>(other);
00322
00323 if( getHandle() < ref.getHandle() )
00324 {
00325 return true;
00326 } else {
00327 return false;
00328 }
00329
00330 }
00331
00332 bool ExprTree::MemRefNode::operator==(Node& other)
00333 {
00334 if(getOrder() != other.getOrder()) { return false; }
00335
00336 MemRefNode& ref = static_cast<MemRefNode&>(other);
00337
00338 if( getHandle() == ref.getHandle() )
00339 {
00340 return true;
00341 } else {
00342 return false;
00343 }
00344
00345 }
00346
00347
00348
00349
00350 void ExprTree::ConstSymNode::dump(std::ostream& os,
00351 OA_ptr<IRHandlesIRInterface> ir)
00352 {
00353 Node::dump(os,ir);
00354 os << "handle: " << ir->toString(mHandle) << std::endl;
00355 }
00356
00357 void ExprTree::ConstSymNode::output(IRHandlesIRInterface& ir)
00358 {
00359 ostringstream label;
00360 label << "ET ConstSymNode ( " << ir.toString(mHandle) << " )";
00361 sOutBuild->outputString( label.str() );
00362 }
00363
00364 void ExprTree::ConstSymNode::acceptVisitor(ExprTreeVisitor& pVisitor)
00365 {
00366 pVisitor.visitConstSymNode(*this);
00367 }
00368 bool ExprTree::ConstSymNode::operator<(Node& other)
00369 {
00370 if(getOrder() < other.getOrder()) { return true; }
00371 else if(getOrder() > other.getOrder()) { return false; }
00372
00373
00374 ConstSymNode& ref = static_cast<ConstSymNode&>(other);
00375
00376 if( getHandle() < ref.getHandle() )
00377 {
00378 return true;
00379 } else {
00380 return false;
00381 }
00382
00383 }
00384
00385 bool ExprTree::ConstSymNode::operator==(Node& other)
00386 {
00387 if(getOrder() != other.getOrder()) { return false; }
00388
00389 ConstSymNode& ref = static_cast<ConstSymNode&>(other);
00390
00391 if( getHandle() == ref.getHandle() )
00392 {
00393 return true;
00394 } else {
00395 return false;
00396 }
00397
00398 }
00399
00400
00401
00402
00403 void ExprTree::ConstValNode::dump(std::ostream& os,
00404 OA_ptr<IRHandlesIRInterface> ir)
00405 {
00406 Node::dump(os,ir);
00407 os << "handle: " << ir->toString(mHandle) << std::endl;
00408 }
00409
00410 void ExprTree::ConstValNode::output(IRHandlesIRInterface& ir)
00411 {
00412 ostringstream label;
00413 label << "ET ConstValNode ( " << ir.toString(mHandle) << " )";
00414 sOutBuild->outputString( label.str() );
00415 }
00416
00417 void ExprTree::ConstValNode::acceptVisitor(ExprTreeVisitor& pVisitor)
00418 {
00419 pVisitor.visitConstValNode(*this);
00420 }
00421 bool ExprTree::ConstValNode::operator<(Node& other)
00422 {
00423 bool retval = false;
00424 if(getOrder() < other.getOrder()) { return true; }
00425 else
00426 if(getOrder() > other.getOrder()) { return false; }
00427
00428
00429 ConstValNode& ref = static_cast<ConstValNode&>(other);
00430
00431 if( getHandle() < ref.getHandle() )
00432 {
00433 return true;
00434 } else {
00435 return false;
00436 }
00437
00438 }
00439
00440 bool ExprTree::ConstValNode::operator==(Node& other)
00441 {
00442 std::cout << "this order" << getOrder();
00443 std::cout << "other order" << other.getOrder();
00444 if(getOrder() != other.getOrder()) { return false; }
00445 std::cout<<"comparing gethandle";
00446 ConstValNode& ref = static_cast<ConstValNode&>(other);
00447 std::cout<<"comparing gethandle";
00448 if( getHandle() == ref.getHandle() )
00449 {
00450 std::cout<<"comparing gethandle true";
00451 return true;
00452 } else {
00453 std::cout<<"comparing gethandle false";
00454 return false;
00455 }
00456
00457 }
00458
00459
00460
00461 void ExprTree::Edge::dump(std::ostream& os)
00462 {
00463 std::cout << "{Edge: parent: " << parent() << " child: " << child()
00464 << "}" << std::endl;
00465 }
00466
00467
00468 void
00469 ExprTree::Node::dump (std::ostream& os, OA_ptr<IRHandlesIRInterface> ir)
00470 {
00471 os << "{Node: "
00472 << " " << mName;
00473
00474 }
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502 }