math/graph.h

Go to the documentation of this file.
00001 #ifndef _GRAPH_H_
00002 #define _GRAPH_H_
00003 
00004 
00005 #include <vector>
00006 
00007 namespace Graph
00008 {
00009     
00010     //=============================================================================
00011     // class node
00012     //
00013     // This is the class for graph nodes
00014     //
00015     //=============================================================================
00016     class Node
00017     {
00018     public:
00019         void         AddEdge( const int edgeNum );
00020         int          GetEdgeNumber( const int index ) const;
00021         unsigned int GetNumEdges()   const;
00022         void         OffsetEdgeNumbers( const int offset );
00023     protected:
00024     private:
00025         std::vector< int > m_Edges;
00026     };
00027     
00028     //=============================================================================
00029     // class Edge 
00030     //
00031     // This is the class for graph edges
00032     //
00033     //=============================================================================
00034     class Edge
00035     {
00036     public:
00037         Edge();
00038         Edge( const int n0, const int n1 );
00039         Edge( const Edge& e );
00040         Edge& operator=( const Edge& e );
00041         
00042         int m_Node0;
00043         int m_Node1;
00044     };
00045     
00046     //=============================================================================
00047     // class GraphBase 
00048     //
00049     // This is the base class for graphs. it includes anything not template based
00050     //
00051     //=============================================================================
00052     class GraphBase
00053     {
00054     public:
00055         GraphBase();
00056         GraphBase( const GraphBase& right );
00057         ~GraphBase();
00058 
00059         void            Add( const GraphBase& right );
00060         int             AddNode();
00061         int             AddEdge( const int n0, const int n1 );
00062         bool            CheckIntegrity() const;
00063         void            Clear();
00064         Node&           GetNode( const int node );
00065         const Node&     GetNode( const int node ) const;
00066         unsigned int    GetNumEdges() const;
00067         unsigned int    GetNumNodes() const;
00068         const Edge&     GetEdge( const unsigned int edge ) const;
00069         std::vector< int > GetNeighbors( const int nodeNum ) const;
00070         GraphBase&      operator=( const GraphBase& right );
00071         
00072     protected:
00073         std::vector< Node > m_Nodes;
00074         std::vector< Edge > m_Edges;
00075     };
00076     //=============================================================================
00077     
00078     //=============================================================================
00079     // class Graph
00080     //
00081     // this is the class for graphs containing arbitrary data
00082     //
00083     //=============================================================================
00084     template< class NodeData, class EdgeData >
00085     class Graph : public GraphBase
00086     {
00087     public:
00088         void            Add( const Graph& right );
00089         int                             AddNode( const NodeData& nd );
00090         int             AddEdge( const int n0, const int n1 );
00091         int                             AddEdge( const int n0, const int n1, const EdgeData& ed );
00092         void            Clear();
00093         bool            ContainsNode( const NodeData& value ) const;
00094         const NodeData& GetNodeData( const int nodeNum ) const;
00095         void                    SetEdgeData( const int edgeNum, const EdgeData& ed );
00096     protected:
00097         std::vector< NodeData > m_NodeData;
00098         std::vector< EdgeData > m_EdgeData;
00099     }; //class Graph
00100     //=============================================================================
00101 
00102     //-----------------------------------------------------------------------------
00103     // Add
00104     //-----------------------------------------------------------------------------
00105     template< class NodeData, class EdgeData >
00106         void Graph< NodeData, EdgeData >::Add( const Graph< NodeData, EdgeData >& right )
00107     {
00108         GraphBase::Add( right );
00109         m_NodeData.insert( m_NodeData.end(), right.m_NodeData.begin(), right.m_NodeData.end() );
00110         m_EdgeData.insert( m_EdgeData.end(), right.m_EdgeData.begin(), right.m_EdgeData.end() );
00111     }
00112 
00113     //-----------------------------------------------------------------------------
00114     // AddNode
00115     //-----------------------------------------------------------------------------
00116     template< class NodeData, class EdgeData >
00117         int Graph< NodeData, EdgeData >::AddNode( const NodeData& nd )
00118     {
00119         GraphBase::AddNode();
00120         m_NodeData.push_back( nd );
00121         return m_NodeData.size() - 1;
00122     }
00123     
00124     //-----------------------------------------------------------------------------
00125     // AddEdge
00126     //-----------------------------------------------------------------------------
00127     template< class NodeData, class EdgeData >
00128         int Graph< NodeData, EdgeData >::AddEdge( const int n0, const int n1 )
00129     {
00130         return GraphBase::AddEdge( n0, n1 );
00131     }
00132 
00133     //-----------------------------------------------------------------------------
00134     // AddEdge
00135     //-----------------------------------------------------------------------------
00136     template< class NodeData, class EdgeData >
00137         int     Graph< NodeData, EdgeData >::AddEdge( const int n0, const int n1, const EdgeData& ed )
00138     {
00139         int edgeNumber = GraphBase::AddEdge( n0, n1 );
00140         SetEdgeData( edgeNumber, ed );
00141         return edgeNumber;
00142     }
00143     
00144     //-----------------------------------------------------------------------------
00145     // ContainsNode
00146     //-----------------------------------------------------------------------------
00147     template< class NodeData, class EdgeData >
00148         void Graph< NodeData, EdgeData >::Clear()
00149     {
00150         GraphBase::Clear();
00151         m_NodeData.clear();
00152         m_EdgeData.clear();
00153     }
00154 
00155     //-----------------------------------------------------------------------------
00156     // ContainsNode
00157     //-----------------------------------------------------------------------------
00158     template< class NodeData, class EdgeData >
00159         bool Graph< NodeData, EdgeData >::ContainsNode( const NodeData& value ) const
00160     {
00161         std::vector< NodeData>::const_iterator found = std::find( m_NodeData.begin(), m_NodeData.end(), value );
00162         return ( found != m_NodeData.end() );
00163     }
00164 
00165     //-----------------------------------------------------------------------------
00166     // GetNodeData
00167     //-----------------------------------------------------------------------------
00168     template< class NodeData, class EdgeData >
00169         const NodeData& Graph< NodeData, EdgeData >::GetNodeData( const int nodeNum ) const
00170     {
00171         #ifdef _DEBUG
00172             int size = m_NodeData.size();
00173             int numNodes = GetNumNodes();
00174             IJG_Assert( nodeNum < size );
00175             IJG_Assert( nodeNum < numNodes );
00176         #endif
00177         const NodeData& returnMe = m_NodeData[ nodeNum ];
00178         return returnMe;
00179     }
00180     
00181     //-----------------------------------------------------------------------------
00182     // SetEdgeData
00183     //-----------------------------------------------------------------------------
00184     template< class NodeData, class EdgeData >
00185         void Graph< NodeData, EdgeData >::SetEdgeData( const int edgeNum, const EdgeData& ed )
00186     {
00187         if( m_EdgeData.size() < edgeNum + 1 )
00188         {
00189             m_EdgeData.resize( edgeNum + 1 );
00190         }
00191         m_EdgeData[ edgeNum ] = ed;
00192     }
00193     
00194     //-----------------------------------------------------------------------------
00195 } //namespace Graph
00196 #endif

Generated on Sat Apr 1 21:30:38 2006 for Motion Planning Kernel by  doxygen 1.4.6-NO