Graph.hpp

Go to the documentation of this file.
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