graph.h

00001 //==========================================================================
00002 //
00003 //   graph.h
00004 //
00005 //==========================================================================
00006 // $Id: graph.h,v 1.43 2002/11/06 08:49:35 raitner Exp $
00007 
00008 #ifndef GTL_GRAPH_H
00009 #define GTL_GRAPH_H
00010 
00011 #include <GTL/GTL.h>
00012 #include <GTL/node.h>
00013 #include <GTL/edge.h>
00014 #include <GTL/edge_map.h>
00015 #include <GTL/node_map.h>
00016 #include <GTL/gml_parser.h>
00017 
00018 #include <iostream>
00019 #include <string>
00020 
00021 __GTL_BEGIN_NAMESPACE
00022 
00041 class GTL_EXTERN graph
00042 {
00043 public:
00044     //================================================== Con-/Destructors
00045 
00049     graph();
00050 
00062     graph (const graph& G);
00063     
00073     graph (const graph& G, const list<node>& nodes);
00074     
00085     graph (const graph& G, 
00086         list<node>::const_iterator it, 
00087         list<node>::const_iterator end);
00088     
00092     virtual ~graph();
00093     
00094     //================================================== Directed/Undirected
00095 
00099     void make_directed();
00100 
00104     void make_undirected();
00105 
00106     //================================================== Tests / Information
00107     
00113     bool is_directed() const;
00114 
00120     bool is_undirected() const;
00121 
00133     bool is_bidirected(edge_map<edge>& rev) const;
00134 
00142     bool is_connected() const;
00143 
00150     bool is_acyclic() const;
00151 
00157     int number_of_nodes() const;
00158 
00164     int number_of_edges() const;
00165 
00172     node center() const;
00173 
00174     //================================================== Creation
00175     
00181     virtual node new_node();
00182     
00194     virtual edge new_edge(node s, node t);
00195 
00199     virtual edge new_edge(const list<node> &sources, const list<node> &targets);
00200 
00201     //================================================== Deletion
00202 
00213     void del_node(node n);
00214 
00219     void del_all_nodes(); 
00220 
00230     void del_edge(edge e);
00231 
00236     void del_all_edges(); 
00237 
00241     void clear();
00242 
00243     //================================================== Iterators
00244 
00248     typedef list<node>::const_iterator node_iterator;
00252     typedef list<edge>::const_iterator edge_iterator;
00253     
00259     node_iterator nodes_begin() const;
00260     
00266     node_iterator nodes_end() const;
00267     
00273     edge_iterator edges_begin() const;
00274     
00280     edge_iterator edges_end() const;
00281 
00282     //================================================== get nodes/edges
00283 
00288     list<node> all_nodes() const;
00289 
00294     list<edge> all_edges() const;
00295  
00299     node choose_node () const;
00300     
00301     //================================================== Hide / Restore
00302 
00311     void hide_edge (edge e);
00312     
00321     void restore_edge (edge e);
00322 
00334     list<edge> hide_node (node n);
00335 
00346     void restore_node (node n);
00347 
00359     void induced_subgraph (list<node>& subgraph_nodes);
00360 
00371     void restore_graph ();
00372 
00373     //================================================== Others
00374 
00380     list<edge> insert_reverse_edges();
00381     
00382     //================================================== I/O
00383 
00400     GML_error load (const string& filename, bool preserve_ids = false) 
00401         { return load (filename.c_str(), preserve_ids); }
00402 
00403     
00420     GML_error load (const char* filename, bool preserve_ids = false);
00421 
00430     int save (const char* filename) const;
00431 
00438     void save (ostream* file = &cout) const;
00439 
00440     //================================================== Node handlers
00441     
00448     virtual void pre_new_node_handler() {}
00449 
00457     virtual void post_new_node_handler(node n) {}
00458 
00466     virtual void pre_del_node_handler(node n) {}        
00467 
00474     virtual void post_del_node_handler() {}             
00475 
00483     virtual void pre_hide_node_handler(node n) {}          
00484 
00492     virtual void post_hide_node_handler(node n) {}         
00493 
00501     virtual void pre_restore_node_handler(node n) {}       
00502  
00510    virtual void post_restore_node_handler(node n) {}
00511 
00512    //================================================== Edge handlers
00513 
00522     virtual void pre_new_edge_handler(node s, node t) {}    
00523 
00531     virtual void post_new_edge_handler(edge e) {}          
00532 
00540     virtual void pre_del_edge_handler(edge e) {}           
00541 
00550     virtual void post_del_edge_handler(node, node) {}
00551     
00559     virtual void pre_hide_edge_handler(edge e) {}          
00560 
00568     virtual void post_hide_edge_handler(edge e) {}         
00569 
00577     virtual void pre_restore_edge_handler(edge e) {}       
00578  
00586    virtual void post_restore_edge_handler(edge e) {}
00587 
00588     //================================================== Global handlers
00589     
00600     virtual void pre_clear_handler()  {}
00601 
00612    virtual void post_clear_handler() {} 
00613 
00621     virtual void pre_make_directed_handler()  {}
00622 
00630     virtual void post_make_directed_handler()  {}
00631 
00639     virtual void pre_make_undirected_handler()  {}
00640 
00648     virtual void post_make_undirected_handler()  {}
00649 
00650 
00651     //================================================== I/O - Handler 
00652 
00661     virtual void pre_graph_save_handler (ostream* os) const { };
00662 
00672     virtual void save_graph_info_handler (ostream*) const { };
00673     
00683     virtual void save_node_info_handler (ostream*, node) const { };
00684 
00694     virtual void save_edge_info_handler (ostream*, edge) const { };
00695 
00704     virtual void after_graph_save_handler (ostream* ) const { };
00705 
00715     virtual void top_level_key_handler (GML_pair* list);
00716 
00727     virtual void load_node_info_handler (node n, GML_pair* list );
00728     
00739     virtual void load_edge_info_handler (edge e, GML_pair* list);
00740 
00749     virtual void load_graph_info_handler (GML_pair* list);
00750 
00751 private:
00752 
00753     //================================================== Flags
00754     
00755     mutable bool directed;
00756 
00757     //================================================== Visible Nodes/Edges
00758     
00759     list<node> nodes;
00760     list<edge> edges;
00761     int nodes_count, edges_count;
00762 
00763     //================================================== Hidden Nodes/Edges
00764     
00765     list<node> hidden_nodes;
00766     list<edge> hidden_edges;
00767     int hidden_nodes_count, hidden_edges_count; 
00768 
00769     //================================================== Node/edge numbering
00770 
00771     int new_node_id();
00772     int new_edge_id();
00773 
00774     //================================================== Copy 
00775     
00776     void copy (const graph& G, 
00777         list<node>::const_iterator it, 
00778         list<node>::const_iterator end);
00779 
00780 public: // needs to be public, because template friends are not possible
00784     int number_of_ids(node) const;
00785     
00789     int number_of_ids(edge) const;
00790     
00791 private:
00792     list<int> free_node_ids;
00793     list<int> free_edge_ids;
00794     int free_node_ids_count, free_edge_ids_count;
00795 
00796     //================================================== utilities
00797     
00798     void del_list(list<node> &);
00799     void del_list(list<edge> &);
00800 
00801     GTL_EXTERN friend ostream& operator<< (ostream& os, const graph& G);
00802 };
00803 
00804 __GTL_END_NAMESPACE
00805 
00806 //--------------------------------------------------------------------------
00807 //   Iteration
00808 //--------------------------------------------------------------------------
00809 
00810 #define forall_nodes(v,g) GTL_FORALL(v,g,graph::node_iterator,nodes_)
00811 #define forall_edges(v,g) GTL_FORALL(v,g,graph::edge_iterator,edges_)
00812     
00813 #endif // GTL_GRAPH_H
00814 
00815 //--------------------------------------------------------------------------
00816 //   end of file
00817 //--------------------------------------------------------------------------