add function to set edge target

This commit is contained in:
Dennis Luxen 2013-12-12 18:32:12 -05:00
parent cef01f5dbc
commit e0dd4848b0

View File

@ -41,8 +41,8 @@ template< typename EdgeDataT>
class DynamicGraph { class DynamicGraph {
public: public:
typedef EdgeDataT EdgeData; typedef EdgeDataT EdgeData;
typedef uint32_t NodeIterator; typedef unsigned NodeIterator;
typedef uint32_t EdgeIterator; typedef unsigned EdgeIterator;
class InputEdge { class InputEdge {
public: public:
@ -101,15 +101,15 @@ class DynamicGraph {
~DynamicGraph(){ } ~DynamicGraph(){ }
uint32_t GetNumberOfNodes() const { unsigned GetNumberOfNodes() const {
return m_numNodes; return m_numNodes;
} }
uint32_t GetNumberOfEdges() const { unsigned GetNumberOfEdges() const {
return m_numEdges; return m_numEdges;
} }
uint32_t GetOutDegree( const NodeIterator n ) const { unsigned GetOutDegree( const NodeIterator n ) const {
return m_nodes[n].edges; return m_nodes[n].edges;
} }
@ -117,6 +117,10 @@ class DynamicGraph {
return NodeIterator( m_edges[e].target ); return NodeIterator( m_edges[e].target );
} }
void SetTarget( const EdgeIterator e, const NodeIterator n ) {
m_edges[e].target = n;
}
EdgeDataT &GetEdgeData( const EdgeIterator e ) { EdgeDataT &GetEdgeData( const EdgeIterator e ) {
return m_edges[e].data; return m_edges[e].data;
} }
@ -143,7 +147,7 @@ class DynamicGraph {
m_edges[node.firstEdge] = m_edges[node.firstEdge + node.edges]; m_edges[node.firstEdge] = m_edges[node.firstEdge + node.edges];
} else { } else {
EdgeIterator newFirstEdge = ( EdgeIterator ) m_edges.size(); EdgeIterator newFirstEdge = ( EdgeIterator ) m_edges.size();
uint32_t newSize = node.edges * 1.1 + 2; unsigned newSize = node.edges * 1.1 + 2;
EdgeIterator requiredCapacity = newSize + m_edges.size(); EdgeIterator requiredCapacity = newSize + m_edges.size();
EdgeIterator oldCapacity = m_edges.capacity(); EdgeIterator oldCapacity = m_edges.capacity();
if ( requiredCapacity >= oldCapacity ) { if ( requiredCapacity >= oldCapacity ) {
@ -170,9 +174,12 @@ class DynamicGraph {
//removes an edge. Invalidates edge iterators for the source node //removes an edge. Invalidates edge iterators for the source node
void DeleteEdge( const NodeIterator source, const EdgeIterator e ) { void DeleteEdge( const NodeIterator source, const EdgeIterator e ) {
Node &node = m_nodes[source]; Node &node = m_nodes[source];
#pragma omp atomic
--m_numEdges; --m_numEdges;
--node.edges; --node.edges;
const uint32_t last = node.firstEdge + node.edges; BOOST_ASSERT(UINT_MAX != node.edges);
const unsigned last = node.firstEdge + node.edges;
BOOST_ASSERT( UINT_MAX != last);
//swap with last edge //swap with last edge
m_edges[e] = m_edges[last]; m_edges[e] = m_edges[last];
makeDummy( last ); makeDummy( last );
@ -222,7 +229,7 @@ class DynamicGraph {
//index of the first edge //index of the first edge
EdgeIterator firstEdge; EdgeIterator firstEdge;
//amount of edges //amount of edges
uint32_t edges; unsigned edges;
}; };
struct Edge { struct Edge {