00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00025 Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::Graph() : graph()
00026 {
00027 nodeMap = map< Node, NODE_TYPE >() ;
00028 edgeMap = map< Edge, EDGE_TYPE >() ;
00029 }
00030
00031 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00032 Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::Graph( const Graph& g )
00033 {
00034 this->copy( g ) ;
00035 }
00036
00037 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00038 Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::Graph( const Graph& g, const list<Node>& listNode )
00039 {
00040 node_map<Node> copy(g, node());
00041
00042 for( list<Node>::const_iterator it = listNode.begin(); it != listNode.end(); ++it)
00043 {
00044 Node tmp = new_node();
00045 copy[*it] = tmp ;
00046 nodeMap[ tmp ] = g.inf(*it) ;
00047
00048
00049 }
00050
00051 for( list<Node>::const_iterator it = listNode.begin(); it != listNode.end(); ++it){
00052
00053 node::out_edges_iterator e_it, e_end;
00054
00055 for (e_it = (*it).out_edges_begin(), e_end = (*it).out_edges_end(); e_it != e_end; ++e_it) {
00056
00057 if ( copy[e_it->target()] != node() ) {
00058
00059 new_edge( copy[e_it->source()], copy[e_it->target()] );
00060
00061 }
00062
00063 }
00064 }
00065
00066
00067
00068 }
00069
00070 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00071 void Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::operator = ( const Graph& g )
00072 {
00073 this->copy( g ) ;
00074 }
00075
00076 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00077 void Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::copy( const Graph& g )
00078 {
00079 node_map<node> copy(g, node());
00080
00081 for( graph::node_iterator it = g.nodes_begin(); it != g.nodes_end(); ++it)
00082 {
00083 Node tmp = new_node();
00084 copy[*it] = tmp ;
00085 nodeMap[ tmp ] = g.inf(*it) ;
00086 }
00087
00088 for( graph::node_iterator it = g.nodes_begin(); it != g.nodes_end(); ++it){
00089
00090 node::out_edges_iterator e_it, e_end;
00091
00092 for (e_it = (*it).out_edges_begin(), e_end = (*it).out_edges_end(); e_it != e_end; ++e_it) {
00093
00094 if ( copy[e_it->target()] != node() ) {
00095
00096 new_edge( copy[e_it->source()], copy[e_it->target()] );
00097
00098 }
00099
00100 }
00101 }
00102
00103
00104
00105 }
00106
00110 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00111 Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::~Graph()
00112 {
00113 nodeMap.clear() ;
00114 edgeMap.clear() ;
00115 }
00116
00120 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00121 void Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::assign( const GRAPH_TYPE& x )
00122 {
00123 this->x = x ;
00124 }
00125
00129 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00130 const GRAPH_TYPE& Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::inf()
00131 {
00132 return x ;
00133 }
00134
00139 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00140 void Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::removeNode( Node n )
00141 {
00142 if( !n.is_hidden() ){
00143 for( typename Node::inout_edges_iterator it = n.inout_edges_begin(); it != n.inout_edges_end(); ++it ){
00144 edgeMap.erase(*it) ;
00145 }
00146 }else{
00147 cout << "Warning!!!: Not implement, remove node hidden" << endl ;
00148 }
00149
00150 del_node( n ) ;
00151 nodeMap.erase( n ) ;
00152 }
00153
00158 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00159 Node Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::newNode( const NODE_TYPE& x )
00160 {
00161 Node n = new_node() ;
00162 nodeMap[n] = x ;
00163 return n ;
00164 }
00165
00171 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00172 void Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::assign( Node n, const NODE_TYPE& x )
00173 {
00174 nodeMap[n] = x ;
00175 }
00176
00182 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00183 NODE_TYPE& Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::inf( Node n )
00184 {
00185 return nodeMap[n] ;
00186 }
00187
00193 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00194 NODE_TYPE Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::inf( Node n ) const
00195 {
00196 return nodeMap.find(n)->second ;
00197 }
00198
00205 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00206 Edge Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::newEdge( Node source, Node target, const EDGE_TYPE& x )
00207 {
00208 Edge e = new_edge( source, target ) ;
00209 edgeMap[e] = x ;
00210 return e ;
00211 }
00212
00218 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00219 void Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::assign( Edge n, const EDGE_TYPE& x )
00220 {
00221 edgeMap[n] = x ;
00222 }
00223
00229 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00230 EDGE_TYPE& Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::inf( Edge n )
00231 {
00232 return edgeMap[n] ;
00233 }
00234
00239 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00240 void Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::removeEdge( Edge e )
00241 {
00242 }
00243
00244 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00245 map< Node, NODE_TYPE > Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::getNodeMap() const
00246 {
00247 return nodeMap ;
00248 }
00249
00250 template < class NODE_TYPE, class EDGE_TYPE, class GRAPH_TYPE >
00251 map< Edge, EDGE_TYPE > Graph< NODE_TYPE, EDGE_TYPE, GRAPH_TYPE >::getEdgeMap() const
00252 {
00253 return edgeMap ;
00254 }
00255