Graph.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2007 by Universidad Nacional de Colombia                *
00003  *   http://www.unal.edu.co                                                *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program is distributed in the hope that it will be useful,       *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
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 //              copy[*it] = newNode( g.inf( *it ) );
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 //      nodeMap = g.getNodeMap() ;
00067 //      edgeMap = g.getEdgeMap() ;
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 //      nodeMap = g.getNodeMap() ;
00104 //      edgeMap = g.getEdgeMap() ;
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 

Generated on Mon May 26 20:29:46 2008 for TARIS by  doxygen 1.5.4