CompareExprTree.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    
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 /*  for ( ; nodes_iter.isValid(); ++nodes_iter) {
00154     OA_ptr<ExprTree::Node> node = nodes_iter.current();
00155     ostringstream align;
00156     align << indt;
00157     sOutBuild->outputString( align.str() );
00158     
00159     ostringstream pushIndent;
00160     pushIndent << pushIndt;
00161     sOutBuild->outputString( pushIndent.str() );
00162 
00163     //node->output(ir);
00164     node->acceptVisitor(OutputTreeVisitor);
00165   
00166     //ostringstream popIndent;
00167     //popIndent << popIndt << indt;
00168     //sOutBuild->outputString( popIndent.str() );
00169   }
00170 */
00171 
00172   sOutBuild->graphEnd("Expression Tree");
00173 
00174 }
00175 //---------------------------------------------------------------
00176 //Node
00177 //---------------------------------------------------------------
00178 
00179 
00180 
00181 
00182 
00183 //-------------------------------------------------------------------
00184 // OpNode
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     // execution will reach here of two NamedRef objects are being compared
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     // execution reaches here if two NamedRef objects are being compared
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 // CallNode
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     // execution will reach here of two UnnamedRef objects are being compared
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     // execution reaches here if two UnnamedRef objects are being compared
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 // MemRefNode
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     // execution will reach here of two Deref objects are being compared
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 // ConstSymNode
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     // execution will reach here of two Deref objects are being compared
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 // ConstValNode
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     // execution will reach here of two Deref objects are being compared
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         //<< ", attr:  " << mAttr;
00474 }
00475 
00476 //--------------------------------------------------------------------
00477 /*
00478 void
00479 ExprTree::Node::str(ostream& os){
00480   if (isSym()) {
00481     os << symHndl << ":";
00482   }
00483   if (isConst()) {
00484     os << constHndl << ":";
00485   }
00486   if (isAttr()) {
00487     os << attr << ":";
00488   }
00489 }
00490 
00491 //-----------------------------------------------------------------
00492 void ExprTree::str(ostream &os){
00493   PreOrderIterator nodes_iter(*this);
00494   for ( ; (bool)nodes_iter; ++nodes_iter) {
00495     ExprTree::Node* node = 
00496       dynamic_cast<ExprTree::Node*>((Tree::Node*)nodes_iter);
00497     node->str(os);
00498   }
00499 }
00500 */
00501 
00502 } // end of OA namespace