00001 00015 #ifndef Graph_H 00016 #define Graph_H 00017 00018 #include <OpenAnalysis/Utils/OA_ptr.hpp> 00019 #include <OpenAnalysis/Utils/BaseGraph.hpp> 00020 00021 namespace OA { 00022 00023 //-------------------------------------------------------------------- 00044 //-------------------------------------------------------------------- 00045 class Graph : public BaseGraph { 00046 public: 00047 class Edge; 00048 //------------------------------------------------------------------ 00051 class Node : public BaseGraph::Node { 00052 public: 00053 Node () 00054 { incident_edges = new std::list<OA_ptr<Edge> >; } 00055 virtual ~Node () { incident_edges->clear(); } 00056 private: 00057 OA_ptr<std::list<OA_ptr<Edge> > > incident_edges; 00058 friend class Graph; 00059 friend class Graph::Edge; 00060 }; 00061 //------------------------------------------------------------------ 00062 class Edge : public BaseGraph::Edge { 00063 public: 00064 Edge (OA_ptr<Node> n1, OA_ptr<Node> n2) : BaseGraph::Edge(n1, n2) {} 00065 virtual ~Edge () {} 00066 OA_ptr<Node> node1 () { 00067 OA_ptr<BaseGraph::Node> n = n1; // Stupid Sun CC 5.4 00068 return n.convert<Node>(); 00069 } 00070 OA_ptr<Node> node2 () { 00071 OA_ptr<BaseGraph::Node> n = n2; // Stupid Sun CC 5.4 00072 return n.convert<Node>(); 00073 } 00074 friend class Graph; 00075 00076 // just doing comparison on ptr val 00077 bool operator == (BaseGraph::Edge& other) { return this==&other; } 00078 }; 00079 //------------------------------------------------------------------ 00082 class NodesIterator : public BaseGraph::NodesIterator { 00083 public: 00084 NodesIterator (Graph& g) : BaseGraph::NodesIterator(g) {} 00085 virtual ~NodesIterator () {} 00086 OA_ptr<Node> current() { OA_ptr<BaseGraph::Node> bnode = (*mIter); 00087 return bnode.convert<Node>(); } 00088 00089 }; 00090 //------------------------------------------------------------------ 00093 class EdgesIterator : public BaseGraph::EdgesIterator { 00094 public: 00095 EdgesIterator (Graph& g) : BaseGraph::EdgesIterator(g) {} 00096 virtual ~EdgesIterator () {} 00097 OA_ptr<Edge> current() { OA_ptr<BaseGraph::Edge> bedge = (*mIter); 00098 return bedge.convert<Edge>(); } 00099 00100 }; 00101 00102 //------------------------------------------------------------------ 00103 00104 Graph() : BaseGraph() {} 00105 Graph(OA_ptr<Node> root) : BaseGraph(root) {} 00106 virtual ~Graph() {} 00107 00108 virtual void addEdge(OA_ptr<Graph::Edge> e); 00109 virtual void addNode(OA_ptr<Graph::Node> n); 00110 virtual void removeEdge(OA_ptr<Graph::Edge> e); 00111 virtual void removeNode(OA_ptr<Graph::Node> n); 00112 00113 private: 00114 OA_ptr<BaseGraph::Node> create_DFS_links (OA_ptr<BaseGraph::Node> start_node); 00115 OA_ptr<BaseGraph::Node> create_BFS_links (OA_ptr<BaseGraph::Node> start_node); 00116 }; 00117 //-------------------------------------------------------------------- 00118 00119 } // end of OA namespace 00120 00121 #endif
1.7.1