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
1.6.1