Correct wrong allocation, use std::vector for node array and pass PODs

by value not ref
This commit is contained in:
DennisOSRM 2013-02-12 15:23:09 +01:00
parent 4d017f5d49
commit 906d28fa5d

View File

@ -59,8 +59,8 @@ class DynamicGraph {
{ {
m_numNodes = nodes; m_numNodes = nodes;
m_numEdges = ( EdgeIterator ) graph.size(); m_numEdges = ( EdgeIterator ) graph.size();
m_nodes.reserve( m_numNodes ); m_nodes.reserve( m_numNodes +1);
m_nodes.resize( m_numNodes ); m_nodes.resize( m_numNodes +1);
EdgeIterator edge = 0; EdgeIterator edge = 0;
EdgeIterator position = 0; EdgeIterator position = 0;
for ( NodeIterator node = 0; node < m_numNodes; ++node ) { for ( NodeIterator node = 0; node < m_numNodes; ++node ) {
@ -98,40 +98,33 @@ class DynamicGraph {
return m_numEdges; return m_numEdges;
} }
unsigned GetOutDegree( const NodeIterator &n ) const unsigned GetOutDegree( const NodeIterator n ) const {
{
return m_nodes[n].edges; return m_nodes[n].edges;
} }
NodeIterator GetTarget( const EdgeIterator &e ) const NodeIterator GetTarget( const EdgeIterator e ) const {
{
return NodeIterator( m_edges[e].target ); return NodeIterator( m_edges[e].target );
} }
EdgeDataT &GetEdgeData( const EdgeIterator &e ) EdgeDataT &GetEdgeData( const EdgeIterator e ) {
{
return m_edges[e].data; return m_edges[e].data;
} }
const EdgeDataT &GetEdgeData( const EdgeIterator &e ) const const EdgeDataT &GetEdgeData( const EdgeIterator e ) const {
{
return m_edges[e].data; return m_edges[e].data;
} }
EdgeIterator BeginEdges( const NodeIterator &n ) const EdgeIterator BeginEdges( const NodeIterator n ) const {
{
//assert( EndEdges( n ) - EdgeIterator( _nodes[n].firstEdge ) <= 100 ); //assert( EndEdges( n ) - EdgeIterator( _nodes[n].firstEdge ) <= 100 );
return EdgeIterator( m_nodes[n].firstEdge ); return EdgeIterator( m_nodes[n].firstEdge );
} }
EdgeIterator EndEdges( const NodeIterator &n ) const EdgeIterator EndEdges( const NodeIterator n ) const {
{
return EdgeIterator( m_nodes[n].firstEdge + m_nodes[n].edges ); return EdgeIterator( m_nodes[n].firstEdge + m_nodes[n].edges );
} }
//adds an edge. Invalidates edge iterators for the source node //adds an edge. Invalidates edge iterators for the source node
EdgeIterator InsertEdge( const NodeIterator &from, const NodeIterator &to, const EdgeDataT &data ) EdgeIterator InsertEdge( const NodeIterator from, const NodeIterator to, const EdgeDataT &data ) {
{
Node &node = m_nodes[from]; Node &node = m_nodes[from];
EdgeIterator newFirstEdge = node.edges + node.firstEdge; EdgeIterator newFirstEdge = node.edges + node.firstEdge;
if ( newFirstEdge >= m_edges.size() || !isDummy( newFirstEdge ) ) { if ( newFirstEdge >= m_edges.size() || !isDummy( newFirstEdge ) ) {
@ -165,7 +158,7 @@ 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];
--m_numEdges; --m_numEdges;
--node.edges; --node.edges;
@ -176,8 +169,7 @@ class DynamicGraph {
} }
//removes all edges (source,target) //removes all edges (source,target)
int DeleteEdgesTo( const NodeIterator source, const NodeIterator target ) int DeleteEdgesTo( const NodeIterator source, const NodeIterator target ) {
{
int deleted = 0; int deleted = 0;
for ( EdgeIterator i = BeginEdges( source ), iend = EndEdges( source ); i < iend - deleted; ++i ) { for ( EdgeIterator i = BeginEdges( source ), iend = EndEdges( source ); i < iend - deleted; ++i ) {
if ( m_edges[i].target == target ) { if ( m_edges[i].target == target ) {
@ -197,8 +189,7 @@ class DynamicGraph {
} }
//searches for a specific edge //searches for a specific edge
EdgeIterator FindEdge( const NodeIterator &from, const NodeIterator &to ) const EdgeIterator FindEdge( const NodeIterator from, const NodeIterator to ) const {
{
for ( EdgeIterator i = BeginEdges( from ), iend = EndEdges( from ); i != iend; ++i ) { for ( EdgeIterator i = BeginEdges( from ), iend = EndEdges( from ); i != iend; ++i ) {
if ( m_edges[i].target == to ) { if ( m_edges[i].target == to ) {
return i; return i;
@ -209,13 +200,11 @@ class DynamicGraph {
protected: protected:
bool isDummy( EdgeIterator edge ) const bool isDummy( EdgeIterator edge ) const {
{
return m_edges[edge].target == (std::numeric_limits< NodeIterator >::max)(); return m_edges[edge].target == (std::numeric_limits< NodeIterator >::max)();
} }
void makeDummy( EdgeIterator edge ) void makeDummy( EdgeIterator edge ) {
{
m_edges[edge].target = (std::numeric_limits< NodeIterator >::max)(); m_edges[edge].target = (std::numeric_limits< NodeIterator >::max)();
} }
@ -234,9 +223,8 @@ class DynamicGraph {
NodeIterator m_numNodes; NodeIterator m_numNodes;
EdgeIterator m_numEdges; EdgeIterator m_numEdges;
DeallocatingVector< Node > m_nodes; std::vector< Node > m_nodes;
DeallocatingVector< Edge > m_edges; DeallocatingVector< Edge > m_edges;
}; };
#endif // DYNAMICGRAPH_H_INCLUDED #endif // DYNAMICGRAPH_H_INCLUDED