21 #ifndef TLPGRAPHRECORDER_H
22 #define TLPGRAPHRECORDER_H
26 #include <unordered_map>
27 #include <unordered_set>
30 #include <tulip/Graph.h>
31 #include <tulip/MutableContainer.h>
35 struct less<
tlp::Graph *> {
47 class GraphStorageIdsMemento;
49 class GraphUpdatesRecorder :
public Observable {
50 friend class GraphImpl;
53 bool recordingStopped;
57 bool newValuesRecorded;
58 const bool oldIdsStateRecorded;
61 std::unordered_map<Graph *, std::unordered_set<node>> graphAddedNodes;
63 std::unordered_set<node> addedNodes;
65 std::unordered_map<Graph *, std::unordered_set<node>> graphDeletedNodes;
67 std::map<Graph *, std::unordered_set<edge>> graphAddedEdges;
69 std::unordered_map<edge, std::pair<node, node>> addedEdgesEnds;
71 std::map<Graph *, std::unordered_set<edge>> graphDeletedEdges;
73 std::unordered_map<edge, std::pair<node, node>> deletedEdgesEnds;
75 std::unordered_set<edge> revertedEdges;
77 std::unordered_map<edge, std::pair<node, node>> oldEdgesEnds;
79 std::unordered_map<edge, std::pair<node, node>> newEdgesEnds;
81 std::unordered_map<node, std::vector<edge>> oldContainers;
83 std::unordered_map<node, std::vector<edge>> newContainers;
86 const GraphStorageIdsMemento *oldIdsState;
88 const GraphStorageIdsMemento *newIdsState;
91 std::list<std::pair<Graph *, Graph *>> addedSubGraphs;
93 std::list<std::pair<Graph *, Graph *>> deletedSubGraphs;
96 std::unordered_map<Graph *, std::set<PropertyInterface *>> addedProperties;
98 std::unordered_map<Graph *, std::set<PropertyInterface *>> deletedProperties;
100 std::unordered_map<Graph *, DataSet> oldAttributeValues;
102 std::unordered_map<Graph *, DataSet> newAttributeValues;
105 std::unordered_map<PropertyInterface *, std::set<node>> updatedPropsAddedNodes;
108 std::unordered_map<PropertyInterface *, std::set<edge>> updatedPropsAddedEdges;
111 std::unordered_map<PropertyInterface *, DataMem *> oldNodeDefaultValues;
113 std::unordered_map<PropertyInterface *, DataMem *> newNodeDefaultValues;
115 std::unordered_map<PropertyInterface *, DataMem *> oldEdgeDefaultValues;
117 std::unordered_map<PropertyInterface *, DataMem *> newEdgeDefaultValues;
119 std::unordered_map<PropertyInterface *, std::string> renamedProperties;
121 struct RecordedValues {
122 PropertyInterface *values;
123 MutableContainer<bool> *recordedNodes;
124 MutableContainer<bool> *recordedEdges;
126 RecordedValues(PropertyInterface *prop =
nullptr, MutableContainer<bool> *rn =
nullptr,
127 MutableContainer<bool> *re =
nullptr)
128 : values(prop), recordedNodes(rn), recordedEdges(re) {}
132 std::unordered_map<PropertyInterface *, RecordedValues> oldValues;
134 std::unordered_map<PropertyInterface *, RecordedValues> newValues;
139 void deleteDeletedObjects();
141 void deleteValues(std::unordered_map<PropertyInterface *, RecordedValues> &values);
143 void deleteDefaultValues(std::unordered_map<PropertyInterface *, DataMem *> &values);
145 void recordEdgeContainer(std::unordered_map<node, std::vector<edge>> &, GraphImpl *, node,
146 edge e = edge(),
bool loop =
false);
147 void recordEdgeContainer(std::unordered_map<node, std::vector<edge>> &, GraphImpl *, node,
148 const std::vector<edge> &,
unsigned int);
150 void removeFromEdgeContainer(std::unordered_map<node, std::vector<edge>> &containers, edge e,
153 void removeGraphData(Graph *);
157 void recordNewValues(GraphImpl *);
158 void recordNewNodeValues(PropertyInterface *p);
159 void recordNewEdgeValues(PropertyInterface *p);
162 void startRecording(GraphImpl *);
165 void stopRecording(Graph *);
167 void restartRecording(Graph *);
169 void doUpdates(GraphImpl *,
bool undo);
174 bool dontObserveProperty(PropertyInterface *);
176 bool isAddedOrDeletedProperty(Graph *, PropertyInterface *);
179 GraphUpdatesRecorder(
bool allowRestart =
true,
180 const GraphStorageIdsMemento *prevIdsMemento =
nullptr);
181 ~GraphUpdatesRecorder()
override;
185 void addNode(Graph *g,
const node n);
188 void addEdge(Graph *g,
const edge e);
190 void addEdges(Graph *g,
unsigned int nbAddedEdges);
193 void delNode(Graph *g,
const node n);
196 void delEdge(Graph *g,
const edge e);
199 void reverseEdge(Graph *g,
const edge e);
202 void beforeSetEnds(Graph *g,
const edge e);
205 void afterSetEnds(Graph *g,
const edge e);
208 void addSubGraph(Graph *g, Graph *sg);
211 void delSubGraph(Graph *g, Graph *sg);
214 void addLocalProperty(Graph *g,
const std::string &name);
217 void delLocalProperty(Graph *g,
const std::string &name);
220 void beforeSetAttribute(Graph *g,
const std::string &name);
223 void removeAttribute(Graph *g,
const std::string &name);
227 void beforeSetNodeValue(PropertyInterface *p,
const node n);
230 void beforeSetAllNodeValue(PropertyInterface *p);
233 void beforeSetEdgeValue(PropertyInterface *p,
const edge e);
236 void beforeSetAllEdgeValue(PropertyInterface *p);
239 void propertyRenamed(PropertyInterface *p);
243 void treatEvent(
const Event &ev)
override;
unsigned int getId() const
Gets the unique identifier of the graph.