Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
graph.h
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file graph.h
1 /* This software is distributed under the GNU Lesser General Public License */
2 //==========================================================================
3 //
4 // graph.h
5 //
6 //==========================================================================
7 // $Id: graph.h,v 1.43 2002/11/06 08:49:35 raitner Exp $
8 
9 #ifndef GTL_GRAPH_H
10 #define GTL_GRAPH_H
11 
12 #include <GTL/GTL.h>
13 #include <GTL/node.h>
14 #include <GTL/edge.h>
15 #include <GTL/edge_map.h>
16 #include <GTL/node_map.h>
17 #include <GTL/gml_parser.h>
18 
19 #include <iostream>
20 #include <string>
21 
23 
43 {
44 public:
45  //================================================== Con-/Destructors
46 
50  graph();
51 
63  graph (const graph& G);
64 
74  graph (const graph& G, const list<node>& nodes);
75 
86  graph (const graph& G,
87  list<node>::const_iterator it,
88  list<node>::const_iterator end);
89 
93  virtual ~graph();
94 
95  //================================================== Directed/Undirected
96 
100  void make_directed();
101 
105  void make_undirected();
106 
107  //================================================== Tests / Information
108 
114  bool is_directed() const;
115 
121  bool is_undirected() const;
122 
134  bool is_bidirected(edge_map<edge>& rev) const;
135 
143  bool is_connected() const;
144 
151  bool is_acyclic() const;
152 
158  int number_of_nodes() const;
159 
165  int number_of_edges() const;
166 
173  node center() const;
174 
175  //================================================== Creation
176 
182  virtual node new_node();
183 
195  virtual edge new_edge(node s, node t);
196 
200  virtual edge new_edge(const list<node> &sources, const list<node> &targets);
201 
202  //================================================== Deletion
203 
214  void del_node(node n);
215 
220  void del_all_nodes();
221 
231  void del_edge(edge e);
232 
237  void del_all_edges();
238 
242  void clear();
243 
244  //================================================== Iterators
245 
249  typedef list<node>::const_iterator node_iterator;
253  typedef list<edge>::const_iterator edge_iterator;
254 
260  node_iterator nodes_begin() const;
261 
267  node_iterator nodes_end() const;
268 
274  edge_iterator edges_begin() const;
275 
281  edge_iterator edges_end() const;
282 
283  //================================================== get nodes/edges
284 
289  list<node> all_nodes() const;
290 
295  list<edge> all_edges() const;
296 
300  node choose_node () const;
301 
302  //================================================== Hide / Restore
303 
312  void hide_edge (edge e);
313 
322  void restore_edge (edge e);
323 
335  list<edge> hide_node (node n);
336 
347  void restore_node (node n);
348 
360  void induced_subgraph (list<node>& subgraph_nodes);
361 
372  void restore_graph ();
373 
374  //================================================== Others
375 
381  list<edge> insert_reverse_edges();
382 
383  //================================================== I/O
384 
401  GML_error load (const string& filename, bool preserve_ids = false)
402  { return load (filename.c_str(), preserve_ids); }
403 
404 
421  GML_error load (const char* filename, bool preserve_ids = false);
422 
431  int save (const char* filename) const;
432 
439  void save (ostream* file = &cout) const;
440 
441  //================================================== Node handlers
442 
449  virtual void pre_new_node_handler() {}
450 
458  virtual void post_new_node_handler(node n) {}
459 
467  virtual void pre_del_node_handler(node n) {}
468 
475  virtual void post_del_node_handler() {}
476 
484  virtual void pre_hide_node_handler(node n) {}
485 
493  virtual void post_hide_node_handler(node n) {}
494 
502  virtual void pre_restore_node_handler(node n) {}
503 
511  virtual void post_restore_node_handler(node n) {}
512 
513  //================================================== Edge handlers
514 
523  virtual void pre_new_edge_handler(node s, node t) {}
524 
532  virtual void post_new_edge_handler(edge e) {}
533 
541  virtual void pre_del_edge_handler(edge e) {}
542 
551  virtual void post_del_edge_handler(node, node) {}
552 
560  virtual void pre_hide_edge_handler(edge e) {}
561 
569  virtual void post_hide_edge_handler(edge e) {}
570 
578  virtual void pre_restore_edge_handler(edge e) {}
579 
587  virtual void post_restore_edge_handler(edge e) {}
588 
589  //================================================== Global handlers
590 
601  virtual void pre_clear_handler() {}
602 
613  virtual void post_clear_handler() {}
614 
622  virtual void pre_make_directed_handler() {}
623 
631  virtual void post_make_directed_handler() {}
632 
640  virtual void pre_make_undirected_handler() {}
641 
650 
651 
652  //================================================== I/O - Handler
653 
662  virtual void pre_graph_save_handler (ostream* os) const { };
663 
673  virtual void save_graph_info_handler (ostream*) const { };
674 
684  virtual void save_node_info_handler (ostream*, node) const { };
685 
695  virtual void save_edge_info_handler (ostream*, edge) const { };
696 
705  virtual void after_graph_save_handler (ostream* ) const { };
706 
716  virtual void top_level_key_handler (GML_pair* list);
717 
728  virtual void load_node_info_handler (node n, GML_pair* list );
729 
740  virtual void load_edge_info_handler (edge e, GML_pair* list);
741 
750  virtual void load_graph_info_handler (GML_pair* list);
751 
752 private:
753 
754  //================================================== Flags
755 
756  mutable bool directed;
757 
758  //================================================== Visible Nodes/Edges
759 
760  list<node> nodes;
761  list<edge> edges;
762  int nodes_count, edges_count;
763 
764  //================================================== Hidden Nodes/Edges
765 
766  list<node> hidden_nodes;
767  list<edge> hidden_edges;
768  int hidden_nodes_count, hidden_edges_count;
769 
770  //================================================== Node/edge numbering
771 
772  int new_node_id();
773  int new_edge_id();
774 
775  //================================================== Copy
776 
777  void copy (const graph& G,
778  list<node>::const_iterator it,
779  list<node>::const_iterator end);
780 
781 public: // needs to be public, because template friends are not possible
785  int number_of_ids(node) const;
786 
790  int number_of_ids(edge) const;
791 
792 private:
793  list<int> free_node_ids;
794  list<int> free_edge_ids;
795  int free_node_ids_count, free_edge_ids_count;
796 
797  //================================================== utilities
798 
799  void del_list(list<node> &);
800  void del_list(list<edge> &);
801 
802  GTL_EXTERN friend ostream& operator<< (ostream& os, const graph& G);
803 };
804 
806 
807 //--------------------------------------------------------------------------
808 // Iteration
809 //--------------------------------------------------------------------------
810 
811 #define forall_nodes(v,g) GTL_FORALL(v,g,graph::node_iterator,nodes_)
812 #define forall_edges(v,g) GTL_FORALL(v,g,graph::edge_iterator,edges_)
813 
814 #endif // GTL_GRAPH_H
815 
816 //--------------------------------------------------------------------------
817 // end of file
818 //--------------------------------------------------------------------------