some comments for dynamic_graph.hpp
This commit is contained in:
parent
f896aaf881
commit
f12fdeb23e
@ -161,9 +161,13 @@ template <typename EdgeDataT> class DynamicGraph
|
|||||||
EdgeIterator InsertEdge(const NodeIterator from, const NodeIterator to, const EdgeDataT &data)
|
EdgeIterator InsertEdge(const NodeIterator from, const NodeIterator to, const EdgeDataT &data)
|
||||||
{
|
{
|
||||||
Node &node = node_array[from];
|
Node &node = node_array[from];
|
||||||
EdgeIterator newFirstEdge = node.edges + node.first_edge;
|
EdgeIterator one_beyond_last_of_node = node.edges + node.first_edge;
|
||||||
if (newFirstEdge >= edge_list.size() || !isDummy(newFirstEdge))
|
// if we can't write at the end of this nodes edges
|
||||||
|
// that is: the end is the end of the edge_list,
|
||||||
|
// or the beginning of the next nodes edges
|
||||||
|
if (one_beyond_last_of_node == edge_list.size() || !isDummy(one_beyond_last_of_node))
|
||||||
{
|
{
|
||||||
|
// can we write before this nodes edges?
|
||||||
if (node.first_edge != 0 && isDummy(node.first_edge - 1))
|
if (node.first_edge != 0 && isDummy(node.first_edge - 1))
|
||||||
{
|
{
|
||||||
node.first_edge--;
|
node.first_edge--;
|
||||||
@ -171,20 +175,24 @@ template <typename EdgeDataT> class DynamicGraph
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// we have to move this nodes edges to the end of the edge_list
|
||||||
EdgeIterator newFirstEdge = (EdgeIterator)edge_list.size();
|
EdgeIterator newFirstEdge = (EdgeIterator)edge_list.size();
|
||||||
unsigned newSize = node.edges * 1.1 + 2;
|
unsigned newSize = node.edges * 1.1 + 2;
|
||||||
EdgeIterator requiredCapacity = newSize + edge_list.size();
|
EdgeIterator requiredCapacity = newSize + edge_list.size();
|
||||||
EdgeIterator oldCapacity = edge_list.capacity();
|
EdgeIterator oldCapacity = edge_list.capacity();
|
||||||
|
// make sure there is enough space at the end
|
||||||
if (requiredCapacity >= oldCapacity)
|
if (requiredCapacity >= oldCapacity)
|
||||||
{
|
{
|
||||||
edge_list.reserve(requiredCapacity * 1.1);
|
edge_list.reserve(requiredCapacity * 1.1);
|
||||||
}
|
}
|
||||||
edge_list.resize(edge_list.size() + newSize);
|
edge_list.resize(edge_list.size() + newSize);
|
||||||
|
// move the edges over and invalidate the old ones
|
||||||
for (const auto i : irange(0u, node.edges))
|
for (const auto i : irange(0u, node.edges))
|
||||||
{
|
{
|
||||||
edge_list[newFirstEdge + i] = edge_list[node.first_edge + i];
|
edge_list[newFirstEdge + i] = edge_list[node.first_edge + i];
|
||||||
makeDummy(node.first_edge + i);
|
makeDummy(node.first_edge + i);
|
||||||
}
|
}
|
||||||
|
// invalidate until the end of edge_list
|
||||||
for (const auto i : irange(node.edges + 1, newSize))
|
for (const auto i : irange(node.edges + 1, newSize))
|
||||||
{
|
{
|
||||||
makeDummy(newFirstEdge + i);
|
makeDummy(newFirstEdge + i);
|
||||||
@ -192,6 +200,8 @@ template <typename EdgeDataT> class DynamicGraph
|
|||||||
node.first_edge = newFirstEdge;
|
node.first_edge = newFirstEdge;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// get the position for the edge that is to be inserted
|
||||||
|
// and write it
|
||||||
Edge &edge = edge_list[node.first_edge + node.edges];
|
Edge &edge = edge_list[node.first_edge + node.edges];
|
||||||
edge.target = to;
|
edge.target = to;
|
||||||
edge.data = data;
|
edge.data = data;
|
||||||
|
Loading…
Reference in New Issue
Block a user