21 #ifndef Tulip_SUPERGRAPHIMPL_H
22 #define Tulip_SUPERGRAPHIMPL_H
28 #include <tulip/GraphAbstract.h>
29 #include <tulip/GraphStorage.h>
30 #include <tulip/IdManager.h>
33 template <
class itType>
36 class GraphUpdatesRecorder;
39 class TLP_SCOPE GraphImpl :
public GraphAbstract {
41 friend class GraphUpdatesRecorder;
42 friend class TLPExport;
46 ~GraphImpl()
override;
47 void clear()
override;
50 inline bool isElement(
const node n)
const override {
51 return storage.isElement(n);
53 bool isElement(
const edge e)
const override {
54 return storage.isElement(e);
56 edge existEdge(
const node source,
const node target,
bool directed =
true)
const override;
57 node addNode()
override;
58 void addNodes(
unsigned int nb)
override;
59 void addNodes(
unsigned int nb, std::vector<node> &addedNodes)
override;
60 void addNode(
const node)
override;
61 void addNodes(Iterator<node> *nodes)
override;
62 edge addEdge(
const node,
const node)
override;
63 void addEdges(
const std::vector<std::pair<node, node>> &edges)
override;
64 void addEdges(
const std::vector<std::pair<node, node>> &edges,
65 std::vector<edge> &addedEdges)
override;
66 void addEdge(
const edge)
override;
67 void addEdges(Iterator<edge> *edges)
override;
68 void delNode(
const tlp::node n,
bool deleteInAllGraphs =
false)
override;
69 void delEdge(
const tlp::edge e,
bool deleteInAllGraphs =
false)
override;
70 inline void setEdgeOrder(
const node n,
const std::vector<edge> &v)
override {
71 storage.setEdgeOrder(n, v);
73 inline void swapEdgeOrder(
const node n,
const edge e1,
const edge e2)
override {
74 storage.swapEdgeOrder(n, e1, e2);
77 inline const std::vector<node> &nodes()
const override {
78 return storage.nodes();
80 inline unsigned int nodePos(
const node n)
const override {
81 return storage.nodePos(n);
83 Iterator<node> *getNodes()
const override;
84 Iterator<node> *getInNodes(
const node)
const override;
85 Iterator<node> *getOutNodes(
const node)
const override;
86 Iterator<node> *getInOutNodes(
const node)
const override;
87 inline const std::vector<edge> &edges()
const override {
88 return storage.edges();
90 inline unsigned int edgePos(
const edge e)
const override {
91 return storage.edgePos(e);
93 Iterator<edge> *getEdges()
const override;
94 Iterator<edge> *getInEdges(
const node)
const override;
95 Iterator<edge> *getOutEdges(
const node)
const override;
96 Iterator<edge> *getInOutEdges(
const node)
const override;
97 std::vector<edge> getEdges(
const node source,
const node target,
98 bool directed =
true)
const override;
99 bool getEdges(
const node source,
const node target,
bool directed, std::vector<edge> &edges,
100 const Graph *sg =
nullptr,
bool onlyFirst =
false)
const {
101 return storage.getEdges(source, target, directed, edges, sg, onlyFirst);
103 inline const std::vector<edge> &allEdges(
const node n)
const override {
104 return storage.adj(n);
107 inline unsigned int deg(
const node n)
const override {
108 assert(isElement(n));
109 return storage.deg(n);
111 inline unsigned int indeg(
const node n)
const override {
112 assert(isElement(n));
113 return storage.indeg(n);
115 inline unsigned int outdeg(
const node n)
const override {
116 assert(isElement(n));
117 return storage.outdeg(n);
120 inline node source(
const edge e)
const override {
121 assert(isElement(e));
122 return storage.source(e);
124 inline node target(
const edge e)
const override {
125 assert(isElement(e));
126 return storage.target(e);
128 inline node opposite(
const edge e,
const node n)
const override {
129 assert(isElement(e));
130 return storage.opposite(e, n);
132 inline const std::pair<node, node> &ends(
const edge e)
const override {
133 return storage.ends(e);
135 inline void setSource(
const edge e,
const node newSrc)
override {
136 assert(isElement(e));
137 this->setEnds(e, newSrc, node());
139 inline void setTarget(
const edge e,
const node newTgt)
override {
140 assert(isElement(e));
141 this->setEnds(e, node(), newTgt);
143 void setEnds(
const edge,
const node,
const node)
override;
144 void reverse(
const edge)
override;
146 inline unsigned int numberOfEdges()
const override {
147 return storage.numberOfEdges();
149 inline unsigned int numberOfNodes()
const override {
150 return storage.numberOfNodes();
152 inline void sortElts()
override {
157 void push(
bool unpopAllowed =
true,
158 std::vector<PropertyInterface *> *propertiesToPreserveOnPop =
nullptr)
override;
159 void pop(
bool unpopAllowed =
true)
override;
160 void popIfNoUpdates()
override;
161 void unpop()
override;
162 bool canPop()
override;
163 bool canUnpop()
override;
164 bool canPopThenUnpop()
override;
167 void treatEvents(
const std::vector<Event> &)
override;
170 unsigned int getSubGraphId(
unsigned int id);
171 void freeSubGraphId(
unsigned int id);
175 void reserveNodes(
unsigned int nbNodes)
override;
176 void reserveEdges(
unsigned int nbEdges)
override;
181 void restoreNode(node)
override;
182 void restoreEdge(edge, node source, node target)
override;
185 void removeNode(
const node)
override;
186 void removeEdge(
const edge)
override;
188 bool canDeleteProperty(Graph *g, PropertyInterface *prop)
override;
191 GraphStorage storage;
193 std::list<GraphUpdatesRecorder *> previousRecorders;
194 std::list<Graph *> observedGraphs;
195 std::list<PropertyInterface *> observedProps;
196 std::list<GraphUpdatesRecorder *> recorders;
198 void observeUpdates(Graph *);
199 void unobserveUpdates();
200 void delPreviousRecorders();
Graph * newGraph()
Creates a new, empty graph.
The edge struct represents an edge in a Graph object.
The node struct represents a node in a Graph object.