33#include <unordered_set>
56 [](
const Vertex* ptr) { return ptr == nullptr; });
64 VertexIDMap::iterator it =
_vertices.find(
id);
65 if (it ==
_vertices.end())
return nullptr;
70 VertexIDMap::const_iterator it =
_vertices.find(
id);
71 if (it ==
_vertices.end())
return nullptr;
76 auto result =
_vertices.insert(std::make_pair(v->
id(), v));
86 if (v != v2)
return false;
101 }
else if (e->
vertices().size() == 3) {
106 }
else if (e->
vertices().size() > 3) {
107 std::unordered_set<Vertex*> vertexPointer;
109 std::inserter(vertexPointer, vertexPointer.begin()));
110 if (vertexPointer.size() != e->
vertices().size())
return false;
113 std::pair<EdgeSet::iterator, bool> result =
_edges.insert(e);
114 if (!result.second)
return false;
117 v->edges().insert(e);
126 if (vOld) vOld->
edges().erase(e);
128 if (v) v->
edges().insert(e);
133 VertexIDMap::iterator it =
_vertices.find(vBig->
id());
141 for (EdgeSet::iterator it = tmp.begin(); it != tmp.end(); ++it) {
143 for (
size_t i = 0; i < e->
vertices().size(); i++) {
153 VertexIDMap::iterator it =
_vertices.find(v->
id());
155 assert(it->second == v);
157 for (EdgeSet::iterator it = tmp.begin(); it != tmp.end(); ++it) {
159 for (
size_t i = 0; i < e->
vertices().size(); i++) {
170 assert(0 &&
"inconsistency in detaching vertex, ");
173 VertexIDMap::iterator it =
_vertices.find(v->
id());
175 assert(it->second == v);
178 for (EdgeSet::iterator it = tmp.begin(); it != tmp.end(); ++it) {
180 assert(0 &&
"error in erasing vertex");
189 EdgeSet::iterator it =
_edges.find(e);
190 if (it ==
_edges.end())
return false;
192 for (std::vector<Vertex*>::iterator vit = e->
vertices().begin();
193 vit != e->
vertices().end(); ++vit) {
196 it = v->
edges().find(e);
197 assert(it != v->
edges().end());
198 v->
edges().erase(it);
207#if G2O_DELETE_IMPLICITLY_OWNED_OBJECTS
211 for (EdgeSet::iterator it =
_edges.begin(); it !=
_edges.end(); ++it)
DataContainer * _dataContainer
int numUndefinedVertices() const
Edge(int id=InvalidId)
creates and empty edge with no vertices
void setVertex(size_t i, Vertex *v)
const VertexContainer & vertices() const
const Vertex * vertex(size_t i) const
virtual void resize(size_t size)
abstract Vertex, your types must derive from that one
Vertex(int id=InvalidId)
creates a vertex having an ID specified by the argument
int id() const
returns the id
const EdgeSet & edges() const
returns the set of hyper-edges that are leaving/entering in this vertex
virtual void setId(int newId)
virtual ~HyperGraph()
destroys the hyper-graph and all the vertices of the graph
virtual bool addEdge(Edge *e)
virtual bool removeEdge(Edge *e)
virtual bool setEdgeVertex(Edge *e, int pos, Vertex *v)
virtual bool removeVertex(Vertex *v, bool detach=false)
virtual bool mergeVertices(Vertex *vBig, Vertex *vSmall, bool erase)
std::set< Edge * > EdgeSet
virtual void clear()
clears the graph and empties all structures.
virtual bool changeId(Vertex *v, int newId)
virtual bool addVertex(Vertex *v)
HyperGraph()
constructs an empty hyper graph
virtual bool detachVertex(Vertex *v)