DGraphImplement.hpp

Go to the documentation of this file.
00001 
00017 #ifndef DGraphImplement_H
00018 #define DGraphImplement_H
00019 
00020 #include "DGraphInterface.hpp"
00021 #include <OpenAnalysis/Utils/OA_ptr.hpp>
00022 #include <map>
00023 #include <set>
00024 #include <list>
00025 
00026 namespace OA {
00027   namespace DGraph {
00028     
00029   class EdgesIteratorImplement : public virtual EdgesIteratorInterface {
00030       friend class DGraphImplement;
00031       friend class NodeImplement;
00032 
00033       public:
00034         OA_ptr<EdgeInterface> current() const { return *mIter; }
00035         void operator++() { ++mIter; }      // prefix
00036         void operator++(int) {++*this; }    // postfix
00037         bool isValid() const { return (mIter != mEdgeList->end()); }
00038         void reset() { mIter = mEdgeList->begin(); }
00039 
00040       private:
00041         OA_ptr<std::list<OA_ptr<EdgeInterface> > > mEdgeList;
00042         std::list<OA_ptr<EdgeInterface> >::iterator mIter;
00043 
00044       protected: 
00045         // only subclasses can call this constructor
00046         // it can not take a const OA_ptr because it is doing a convert
00047         EdgesIteratorImplement(OA_ptr<EdgesIteratorInterface> ni);
00048         EdgesIteratorImplement(OA_ptr<std::list<OA_ptr<EdgeInterface> > > elist);
00049     };
00050 
00051 
00052   class NodesIteratorImplement : public virtual NodesIteratorInterface {
00053       friend class DGraphImplement;
00054       friend class NodeImplement;
00055 
00056       public:
00057         OA_ptr<NodeInterface> current() const { return *mIter; }
00058         void operator++() { ++mIter; }
00059         void operator++(int) { ++*this; }
00060         bool isValid() const {  return (mIter != mNodeList->end()); } 
00061         void reset() { mIter = mNodeList->begin(); }
00062 
00063       private:
00064         OA_ptr<std::list<OA_ptr<NodeInterface> > > mNodeList;
00065         std::list<OA_ptr<NodeInterface> >::iterator mIter;
00066 
00067       protected: 
00068         // only subclasses can call this constructor
00069         // it can not take a const OA_ptr because it is doing a convert
00070         NodesIteratorImplement(OA_ptr<NodesIteratorInterface> ni);
00071         NodesIteratorImplement(OA_ptr<std::list<OA_ptr<NodeInterface> > > nlist);
00072       
00073     };
00074 
00075 
00076 
00077 
00078  class NodeImplement : public virtual NodeInterface {
00079       public:
00080         NodeImplement() ;
00081          
00082         //========================================================  
00083         // Information
00084         //========================================================
00085         unsigned int getId () const;
00086         int num_incoming () const;
00087         int num_outgoing () const;
00088       
00090         bool isAnEntry() const;
00091   
00093         bool isAnExit() const;
00094 
00095         //========================================================  
00096         // Iterators
00097         //========================================================
00098         OA_ptr<EdgesIteratorInterface> getIncomingEdgesIterator() const;
00099         
00100         OA_ptr<EdgesIteratorInterface> getOutgoingEdgesIterator() const;
00101 
00102         OA_ptr<NodesIteratorInterface> getSourceNodesIterator() const;
00103 
00104         OA_ptr<NodesIteratorInterface> getSinkNodesIterator() const;
00105 
00106         //========================================================  
00107         // Comparison operators
00108         //========================================================
00109         bool operator== (NodeInterface& other);
00110         
00111         bool operator< (NodeInterface& other);
00112 
00113         //========================================================  
00114         // Output
00115         //========================================================
00116         void output(IRHandlesIRInterface& ir);
00117         
00118         void dump(std::ostream& os);
00119 
00120         //========================================================  
00121         // Construction
00122         //========================================================
00123         void addIncomingEdge(OA_ptr<EdgeInterface> e);
00124 
00125         void addOutgoingEdge(OA_ptr<EdgeInterface> e);
00126 
00127         void removeIncomingEdge(OA_ptr<EdgeInterface> e);
00128 
00129         void removeOutgoingEdge(OA_ptr<EdgeInterface> e);
00130 
00131 
00132       private:
00133         OA_ptr<std::list<OA_ptr<EdgeInterface> > > mIncomingEdges;
00134         OA_ptr<std::list<OA_ptr<EdgeInterface> > > mOutgoingEdges;
00135         unsigned int mId;
00136         static unsigned int sNextId;
00137     };
00138  
00139 
00140     // lt_Node: function object that compares by id.  Useful for sorting.
00141     class lt_Node : public DGraph::lt_NodeInterface {
00142       public:
00143       // return true if n1 < n2; false otherwise
00144       bool operator()(const OA_ptr<NodeInterface> n1,
00145                       const OA_ptr<NodeInterface> n2) const; 
00146     };
00147 
00148 
00149   class EdgeImplement : public virtual EdgeInterface {
00150       public:
00151         EdgeImplement(OA_ptr<NodeInterface> source, 
00152                       OA_ptr<NodeInterface> sink);
00153 
00154         //========================================================  
00155         // Information
00156         //========================================================
00157         virtual unsigned int getId () const { return mId; }
00158 
00159         
00160         virtual OA_ptr<NodeInterface> getSource() const;
00161         
00162         virtual OA_ptr<NodeInterface> getSink() const;
00163 
00164         //========================================================  
00165         // Comparison operators
00166         //========================================================
00167         bool operator== (EdgeInterface& other);
00168         
00169         bool operator< (EdgeInterface& other);
00170 
00171         //========================================================  
00172         // Output
00173         //========================================================
00174         void output(IRHandlesIRInterface& ir); 
00175 
00176         void dump(std::ostream& os);
00177 
00178      //========================================================  
00179      // Construction
00180      //========================================================
00182         
00183       private:
00184         OA_ptr<NodeInterface> mSourceNode;
00185         OA_ptr<NodeInterface> mSinkNode;
00186         unsigned int mId;
00187         static unsigned int sNextId;
00188     };
00189 
00190 
00191   // lt_Edge: function object that compares by source and sink node
00192   // ids.  Useful for sorting.  Not used to put edges in sets or other
00193   // STL containers.
00194   class lt_Edge : public lt_EdgeInterface {
00195   public:
00196     // DO NOT change this to use edge Id because
00197     // code exists that assumes this compares by source and sink node ids
00198     // if another one is wanted then just make a new functor
00199     bool operator()(const OA_ptr<EdgeInterface> e1,
00200                     const OA_ptr<EdgeInterface> e2) const;
00201   };
00202 
00203 
00204   class DGraphImplement : public virtual DGraphInterface {
00205       public:
00206 
00207         DGraphImplement(); 
00208         
00209         ~DGraphImplement() { } 
00210 
00211 
00212         OA_ptr<NodesIteratorInterface> getNodesIterator() const;
00213         OA_ptr<NodesIteratorInterface> getEntryNodesIterator() const;
00214         OA_ptr<NodesIteratorInterface> getExitNodesIterator() const;
00215         OA_ptr<NodesIteratorInterface>
00216                  getReversePostDFSIterator(DGraph::DGraphEdgeDirection pOrient);
00217 
00218         OA_ptr<NodesIteratorInterface>
00219                  getDFSIterator(OA_ptr<NodeInterface> n);
00220         
00221         OA_ptr<EdgesIteratorInterface> getEdgesIterator() const;
00222         void addNode(OA_ptr<NodeInterface> n);
00223         void addEdge(OA_ptr<EdgeInterface> e);
00224         void removeEdge(OA_ptr<EdgeInterface> e);
00225         void removeNode(OA_ptr<NodeInterface> n);
00226 
00227         int getNumNodes() { return mNodeSet->size(); }
00228         int getNumEdges() { return mEdgeSet->size(); }
00229 
00230         void output(IRHandlesIRInterface& ir);
00231        
00232         virtual std::string getGraphName();
00233 
00234         // temporary workaround until expression graphs have been 
00235         // properly factored out (specialized) from DGraphImplement
00236         OA_ptr<NodeInterface> getExprGraphRootNode() const;
00237 
00238       //========================================================  
00239       // Helper methods
00240       //========================================================
00241       private:
00242         std::map<OA_ptr<NodeInterface>,bool> mVisitMap;
00243 
00244         void createDFSList(OA_ptr<NodeInterface> pNode, OA_ptr<std::list<OA_ptr<NodeInterface> > > pList);
00245     
00247         OA_ptr<std::list<OA_ptr<NodeInterface> > > create_entry_list() const;
00248 
00249         OA_ptr<std::list<OA_ptr<NodeInterface> > > create_exit_list() const;
00250 
00251         OA_ptr<std::list<OA_ptr<NodeInterface> > >
00252           create_reverse_post_order_list(DGraphEdgeDirection pOrient); 
00253         
00254         void reverse_postorder_recurse( OA_ptr<NodeInterface> pNode,
00255                                        DGraphEdgeDirection pOrient,
00256                                        OA_ptr<std::list<OA_ptr<NodeInterface> > > pList );
00257 
00258         friend class NodesIteratorImplement;
00259        
00260       private:
00261         OA_ptr<std::set<OA_ptr<NodeInterface> > > mNodeSet;
00262         OA_ptr<std::set<OA_ptr<EdgeInterface> > > mEdgeSet;
00263     };
00264 
00265   } //end of namespace DGraph
00266 } //end of namespace OA
00267 
00268 #endif

Generated on Sat Oct 31 05:21:21 2009 for OpenAnalysis by  doxygen 1.6.1