00001 #ifndef _GRAPH_H_
00002 #define _GRAPH_H_
00003
00004
00005 #include <vector>
00006
00007 namespace Graph
00008 {
00009
00010
00011
00012
00013
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
00030
00031
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
00048
00049
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
00080
00081
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 };
00100
00101
00102
00103
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
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
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
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
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
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
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
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 }
00196 #endif