ExprTree.cpp

Go to the documentation of this file.
00001 
00014 // standard headers
00015 
00016 #include "ExprTree.hpp"
00017 
00018 // included here instead of in hpp file to remove circular reference
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 //FOR NOW COMMENTED     
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     // iterate over all nodes to get copy
00095     NodesIterator nIter(*subtree);
00096     for ( ; nIter.isValid(); ++nIter) {
00097       oldToNewNodeMap[nIter.current()] = nIter.current()->copy();
00098     }
00099 
00100     // iterate over all edges of the subtree
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   // print the contents of all the nodes
00117   //PreOrderIterator nodes_iter(*this);
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 /*  for ( ; nodes_iter.isValid(); ++nodes_iter) {
00152     OA_ptr<ExprTree::Node> node = nodes_iter.current();
00153     ostringstream align;
00154     align << indt;
00155     sOutBuild->outputString( align.str() );
00156     
00157     ostringstream pushIndent;
00158     pushIndent << pushIndt;
00159     sOutBuild->outputString( pushIndent.str() );
00160 
00161     //node->output(ir);
00162     node->acceptVisitor(OutputTreeVisitor);
00163   
00164     //ostringstream popIndent;
00165     //popIndent << popIndt << indt;
00166     //sOutBuild->outputString( popIndent.str() );
00167   }
00168 */
00169 
00170   sOutBuild->graphEnd("Expression Tree");
00171 
00172 }
00173 //---------------------------------------------------------------
00174 //Node
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    /* if(getOrder() < other.getOrder()) { return true; }
00185     else if(getOrder() > other.getOrder()) { return false; }
00186 
00187     // execution will reach here of two NamedRef objects are being compared
00188     Node& ref = static_cast<Node&>(other);
00189 
00190     if( getHandle() < ref.getHandle() )
00191     {
00192         return true;
00193     } else {
00194         return false;
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    /* if(getOrder() != other.getOrder()) { return false; }
00206 
00207     // execution reaches here if two NamedRef objects are being compared
00208     Node& ref = static_cast<Node&>(other);
00209 
00210     if( getHandle() == ref.getHandle() )
00211     {
00212         return true;
00213     } else {
00214         return false;
00215     }*/
00216 
00217 
00218 }
00219 
00220 
00221 
00222 
00223 
00224 
00225 //-------------------------------------------------------------------
00226 // OpNode
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     // execution will reach here of two NamedRef objects are being compared
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     // execution reaches here if two NamedRef objects are being compared
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 // CallNode
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     // execution will reach here of two UnnamedRef objects are being compared
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 // MemRefNode
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     // execution will reach here of two Deref objects are being compared
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 // ConstSymNode
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     // execution will reach here of two Deref objects are being compared
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 // ConstValNode
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     // execution will reach here of two Deref objects are being compared
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         //<< ", attr:  " << mAttr;
00499 }
00500 
00501 //--------------------------------------------------------------------
00502 /*
00503 void
00504 ExprTree::Node::str(ostream& os){
00505   if (isSym()) {
00506     os << symHndl << ":";
00507   }
00508   if (isConst()) {
00509     os << constHndl << ":";
00510   }
00511   if (isAttr()) {
00512     os << attr << ":";
00513   }
00514 }
00515 
00516 //-----------------------------------------------------------------
00517 void ExprTree::str(ostream &os){
00518   PreOrderIterator nodes_iter(*this);
00519   for ( ; (bool)nodes_iter; ++nodes_iter) {
00520     ExprTree::Node* node = 
00521       dynamic_cast<ExprTree::Node*>((Tree::Node*)nodes_iter);
00522     node->str(os);
00523   }
00524 }
00525 */
00526 
00527 } // end of OA namespace