13namespace fpmas {
namespace graph {
33 std::vector<api::utils::Callback<NodeType*>*> insert_node_callbacks;
34 std::vector<api::utils::Callback<NodeType*>*> erase_node_callbacks;
35 std::vector<api::utils::Callback<EdgeType*>*> insert_edge_callbacks;
36 std::vector<api::utils::Callback<EdgeType*>*> erase_edge_callbacks;
58 void insert(NodeType*)
override;
59 void insert(EdgeType*)
override;
61 void erase(NodeType*)
override;
62 void erase(EdgeType*)
override;
65 insert_node_callbacks.push_back(callback);
69 return insert_node_callbacks;
73 erase_node_callbacks.push_back(callback);
77 return erase_node_callbacks;
81 insert_edge_callbacks.push_back(callback);
85 return insert_edge_callbacks;
89 erase_edge_callbacks.push_back(callback);
93 return erase_edge_callbacks;
106 void clear()
override;
111 template<
typename NodeType,
typename EdgeType>
113 this->nodes = std::move(graph.nodes);
114 this->edges = std::move(graph.edges);
115 this->insert_node_callbacks = std::move(graph.insert_node_callbacks);
116 this->insert_edge_callbacks = std::move(graph.insert_edge_callbacks);
117 this->erase_node_callbacks = std::move(graph.erase_node_callbacks);
118 this->erase_edge_callbacks = std::move(graph.erase_edge_callbacks);
121 template<
typename NodeType,
typename EdgeType>
124 for(
auto callback : insert_node_callbacks)
126 for(
auto callback : erase_node_callbacks)
128 for(
auto callback : insert_edge_callbacks)
130 for(
auto callback : erase_edge_callbacks)
133 this->nodes = std::move(graph.nodes);
134 this->edges = std::move(graph.edges);
135 this->insert_node_callbacks = std::move(graph.insert_node_callbacks);
136 this->insert_edge_callbacks = std::move(graph.insert_edge_callbacks);
137 this->erase_node_callbacks = std::move(graph.erase_node_callbacks);
138 this->erase_edge_callbacks = std::move(graph.erase_edge_callbacks);
144 template<
typename NodeType,
typename EdgeType>
146 FPMAS_LOGD(-1,
"GRAPH",
"Insert node %s",
FPMAS_C_STR(node->getId()));
147 this->nodes.insert({node->getId(), node});
148 for(
auto callback : insert_node_callbacks)
149 callback->call(node);
152 template<
typename NodeType,
typename EdgeType>
155 -1,
"GRAPH",
"Insert edge %s-{%i} (%p) (from %s to %s)",
156 FPMAS_C_STR(edge->getId()), edge->getLayer(), edge,
160 this->edges.insert({edge->getId(), edge});
161 for(
auto callback : insert_edge_callbacks)
162 callback->call(edge);
165 template<
typename NodeType,
typename EdgeType>
167 FPMAS_LOGD(-1,
"GRAPH",
"Erase node %s",
FPMAS_C_STR(node->getId()));
169 for(
auto* edge : node->getIncomingEdges()) {
173 "Unlink incoming edge %s",
179 for(
auto* edge : node->getOutgoingEdges()) {
183 "Unlink incoming edge %s",
189 auto id = node->getId();
193 for(
auto callback : erase_node_callbacks)
194 callback->call(node);
198 FPMAS_LOGD(-1,
"GRAPH",
"Node %s removed.",
FPMAS_C_STR(
id));
201 template<
typename NodeType,
typename EdgeType>
203 auto id = edge->getId();
205 -1,
"GRAPH",
"Erase edge %s-{%i} (%p) (from %s to %s)",
212 edge->getSourceNode()->unlinkOut(edge);
213 edge->getTargetNode()->unlinkIn(edge);
216 this->edges.erase(
id);
218 for(
auto callback : erase_edge_callbacks)
219 callback->call(edge);
223 FPMAS_LOGD(-1,
"GRAPH",
"Edge %s removed.",
FPMAS_C_STR(
id));
226 template<
typename NodeType,
typename EdgeType>
229 return this->nodes.find(
id)->second;
232 template<
typename NodeType,
typename EdgeType>
235 return this->nodes.find(
id)->second;
238 template<
typename NodeType,
typename EdgeType>
244 template<
typename NodeType,
typename EdgeType>
247 return this->edges.find(
id)->second;
250 template<
typename NodeType,
typename EdgeType>
253 return this->edges.find(
id)->second;
256 template<
typename NodeType,
typename EdgeType>
262 template<
typename NodeType,
typename EdgeType>
265 std::vector<EdgeType*> _edges;
266 for(
auto edge : this->edges)
267 _edges.push_back(edge.second);
269 for(
auto edge : _edges) {
273 std::vector<NodeType*> _nodes;
274 for(
auto node : this->nodes)
275 _nodes.push_back(node.second);
277 for(
auto node : _nodes) {
282 template<
typename NodeType,
typename EdgeType>
285 for(
auto callback : insert_node_callbacks)
287 for(
auto callback : erase_node_callbacks)
289 for(
auto callback : insert_edge_callbacks)
291 for(
auto callback : erase_edge_callbacks)
std::unordered_map< EdgeIdType, EdgeType *, EdgeIdHash > EdgeMap
Definition: graph.h:56
std::unordered_map< NodeIdType, NodeType *, NodeIdHash > NodeMap
Definition: graph.h:50
EdgeType::IdType EdgeIdType
Definition: graph.h:34
NodeType::IdType NodeIdType
Definition: graph.h:23
Graph()
Definition: graph.h:45
void addCallOnEraseEdge(api::utils::Callback< EdgeType * > *callback) override
Definition: graph.h:88
const EdgeMap & getEdges() const override
Definition: graph.h:258
const NodeMap & getNodes() const override
Definition: graph.h:240
void addCallOnEraseNode(api::utils::Callback< NodeType * > *callback) override
Definition: graph.h:72
std::vector< api::utils::Callback< NodeType * > * > onEraseNodeCallbacks() const override
Definition: graph.h:76
EdgeType * getEdge(EdgeIdType) override
Definition: graph.h:246
std::vector< api::utils::Callback< NodeType * > * > onInsertNodeCallbacks() const override
Definition: graph.h:68
void addCallOnInsertNode(api::utils::Callback< NodeType * > *callback) override
Definition: graph.h:64
NodeType * getNode(NodeIdType) override
Definition: graph.h:228
void insert(NodeType *) override
Definition: graph.h:145
void clear() override
Definition: graph.h:263
void erase(NodeType *) override
Definition: graph.h:166
std::vector< api::utils::Callback< EdgeType * > * > onEraseEdgeCallbacks() const override
Definition: graph.h:92
std::vector< api::utils::Callback< EdgeType * > * > onInsertEdgeCallbacks() const override
Definition: graph.h:84
void addCallOnInsertEdge(api::utils::Callback< EdgeType * > *callback) override
Definition: graph.h:80
#define FPMAS_C_STR(arg)
Definition: macros.h:24