Tulip  4.0.0
Better Visualization Through Research
 All Classes Files Functions Variables Enumerations Enumerator Properties Groups Pages
GraphImpl.h
1 /*
2  *
3  * This file is part of Tulip (www.tulip-software.org)
4  *
5  * Authors: David Auber and the Tulip development Team
6  * from LaBRI, University of Bordeaux 1 and Inria Bordeaux - Sud Ouest
7  *
8  * Tulip is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License
10  * as published by the Free Software Foundation, either version 3
11  * of the License, or (at your option) any later version.
12  *
13  * Tulip is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16  * See the GNU General Public License for more details.
17  *
18  */
19 ///@cond DOXYGEN_HIDDEN
20 
21 #ifndef Tulip_SUPERGRAPHIMPL_H
22 #define Tulip_SUPERGRAPHIMPL_H
23 
24 #ifndef DOXYGEN_NOTFOR_USER
25 
26 #include <set>
27 
28 #include <vector>
29 #include <list>
30 #include <tulip/GraphAbstract.h>
31 #include <tulip/GraphStorage.h>
32 #include <tulip/IdManager.h>
33 
34 namespace tlp {
35 template<class itType >
36 struct Iterator;
37 class GraphView;
38 class GraphUpdatesRecorder;
39 
40 ///Implementation of the graph support of the Graph.
41 class TLP_SCOPE GraphImpl:public GraphAbstract {
42 
43  friend class GraphUpdatesRecorder;
44  friend class TLPExport;
45 
46 public:
47  GraphImpl();
48  ~GraphImpl();
49  void clear();
50  //=========================================================================
51  bool isElement(const node ) const;
52  bool isElement(const edge ) const;
53  node addNode();
54  void addNodes(unsigned int nb, std::vector<node>& addedNodes);
55  void addNode(const node);
56  void addNodes(Iterator<node>* nodes);
57  edge addEdge(const node ,const node);
58  void addEdges(const std::vector<std::pair<node, node> >& edges,
59  std::vector<edge>& addedEdges);
60  void addEdge(const edge);
61  void addEdges(Iterator<edge>* edges);
62  void delNode(const tlp::node n, bool deleteInAllGraphs = false);
63  void delEdge(const tlp::edge e, bool deleteInAllGraphs = false);
64  void setEdgeOrder(const node,const std::vector<edge> & );
65  void swapEdgeOrder(const node,const edge , const edge );
66  //=========================================================================
67  Iterator<node>* getNodes() const;
68  Iterator<node>* getInNodes(const node )const;
69  Iterator<node>* getOutNodes(const node )const;
70  Iterator<node>* getInOutNodes(const node )const;
71  Iterator<edge>* getEdges()const;
72  Iterator<edge>* getInEdges(const node )const;
73  Iterator<edge>* getOutEdges(const node )const;
74  Iterator<edge>* getInOutEdges(const node )const;
75  // to ensure that loops appear only once
76  void getInOutEdges(const node, std::vector<edge>& edges,
77  bool loopsOnlyOnce = false)const;
78  //================================================================================
79  unsigned int deg(const node ) const;
80  unsigned int indeg(const node) const;
81  unsigned int outdeg(const node) const;
82  //================================================================================
83  virtual node source(const edge) const;
84  virtual node target(const edge) const;
85  virtual node opposite(const edge, const node n) const;
86  virtual const std::pair<node, node>& ends(const edge e) const;
87  virtual void setEnds(const edge, const node, const node);
88  virtual void reverse(const edge);
89  //================================================================================
90  unsigned int numberOfEdges()const;
91  unsigned int numberOfNodes()const;
92  //================================================================================
93  // updates management
94  virtual void push(bool unpopAllowed = true,
95  std::vector<PropertyInterface*>* propertiesToPreserveOnPop= NULL);
96  virtual void pop(bool unpopAllowed = true);
97  virtual void unpop();
98  virtual bool canPop();
99  virtual bool canUnpop();
100  virtual bool canPopThenUnpop();
101 
102  // observer interface
103  void treatEvents(const std::vector<Event> &);
104  void observableDestroyed(Observable*);
105 
106  // for subgraph id management
107  unsigned int getSubGraphId(unsigned int id);
108  void freeSubGraphId(unsigned int id);
109 
110  // to improve memory allocation
111  // attempt to reserve enough space to store nodes/edges
112  virtual void reserveNodes(unsigned int nbNodes);
113  virtual void reserveEdges(unsigned int nbEdges);
114 
115 protected:
116  // designed to reassign an id to a previously deleted elt
117  // used by GraphUpdatesRecorder
118  virtual node restoreNode(node);
119  virtual void restoreNodes(const std::vector<node>&);
120  virtual edge restoreEdge(edge, node source, node target);
121  virtual void restoreEdges(const std::vector<edge>& edges,
122  const std::vector<std::pair<node, node> >& ends);
123  // designed to only update own structures
124  // used by GraphUpdatesRecorder
125  virtual void removeNode(const node);
126  virtual void removeEdge(const edge);
127  // used by PropertyManager
128  virtual bool canDeleteProperty(Graph* g, PropertyInterface *prop);
129 
130 private :
131  GraphStorage storage;
132  IdManager graphIds;
133  std::list<GraphUpdatesRecorder*> previousRecorders;
134  std::list<Graph *> observedGraphs;
135  std::list<PropertyInterface*> observedProps;
136  std::list<GraphUpdatesRecorder*> recorders;
137 
138  void restoreAdj(node, std::vector<edge>&);
139  void observeUpdates(Graph*);
140  void unobserveUpdates();
141  void delPreviousRecorders();
142 };
143 
144 }
145 #endif
146 
147 #endif
148 ///@endcond