Skip to content

Commit

Permalink
introduce some final methods in EdgeAccess, and less duplicate calls …
Browse files Browse the repository at this point in the history
…due to new init method
  • Loading branch information
Peter committed Jul 14, 2015
1 parent c931b09 commit ed18207
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 62 deletions.
68 changes: 30 additions & 38 deletions core/src/main/java/com/graphhopper/storage/BaseGraph.java
Original file line number Diff line number Diff line change
Expand Up @@ -102,12 +102,9 @@ public BaseGraph( Directory dir, final EncodingManager encodingManager, boolean
this.edgeAccess = new EdgeAccess(edges, bitUtil)
{
@Override
final EdgeIterable createSingleEdge( int edgeId )
final EdgeIterable createSingleEdge()
{
EdgeIterable ei = new EdgeIterable(BaseGraph.this, this, EdgeFilter.ALL_EDGES);
ei.setEdgeId(edgeId);
ei.nextEdgeId = EdgeIterable.NO_EDGE;
return ei;
return new EdgeIterable(BaseGraph.this, this, EdgeFilter.ALL_EDGES);
}

@Override
Expand All @@ -129,20 +126,20 @@ final int getEntryBytes()
}

@Override
long toPointer( int edgeId )
final long toPointer( int edgeId )
{
assert isInBounds(edgeId) : "edgeId " + edgeId + " not in bounds [0," + edgeCount + ")";
return (long) edgeId * edgeEntryBytes;
}

@Override
boolean isInBounds( int edgeId )
final boolean isInBounds( int edgeId )
{
return edgeId < edgeCount && edgeId >= 0;
}

@Override
public final long reverseFlags( long edgePointer, long flags )
final long reverseFlags( long edgePointer, long flags )
{
return encodingManager.reverseFlags(flags);
}
Expand Down Expand Up @@ -501,19 +498,20 @@ public EdgeIterable( BaseGraph baseGraph, EdgeAccess edgeAccess, EdgeFilter filt
this.edgeAccess = edgeAccess;
}

protected void setEdgeId( int edgeId )
final void setEdgeId( int edgeId )
{
this.nextEdgeId = this.edgeId = edgeId;
if (nextEdgeId != EdgeIterator.NO_EDGE)
}

final boolean init( int tmpEdgeId, int expectedAdjNode )
{
setEdgeId(tmpEdgeId);
if (tmpEdgeId != EdgeIterator.NO_EDGE)
{
selectEdgeAccess();
this.edgePointer = edgeAccess.toPointer(nextEdgeId);
this.edgePointer = edgeAccess.toPointer(tmpEdgeId);
}
}

// TODO some duplicate code for the calling side
boolean initWithAdjNode( int expectedAdjNode )
{
// expect only edgePointer is properly initialized via setEdgeId
baseNode = edgeAccess.edges.getInt(edgePointer + edgeAccess.E_NODEA);
if (baseNode == EdgeAccess.NO_NODE)
Expand All @@ -536,14 +534,15 @@ boolean initWithAdjNode( int expectedAdjNode )
return false;
}

void _setBaseNode( int baseNode )
final void _setBaseNode( int baseNode )
{
this.baseNode = baseNode;
}

@Override
public EdgeIterator setBaseNode( int baseNode )
{
// always use base graph edge access
setEdgeId(baseGraph.edgeAccess.getEdgeRef(baseNode));
_setBaseNode(baseNode);
return this;
Expand All @@ -566,7 +565,7 @@ protected void selectEdgeAccess()
}

@Override
public boolean next()
public final boolean next()
{
int i = 0;
boolean foundNext = false;
Expand Down Expand Up @@ -598,11 +597,6 @@ public boolean next()
return foundNext;
}

private long getEdgePointer()
{
return edgePointer;
}

@Override
public final double getDistance()
{
Expand All @@ -617,7 +611,7 @@ public final EdgeIteratorState setDistance( double dist )
}

@Override
public long getFlags()
public final long getFlags()
{
return edgeAccess.getFlags_(edgePointer, reverse);
}
Expand All @@ -630,13 +624,13 @@ public final EdgeIteratorState setFlags( long fl )
}

@Override
public int getAdditionalField()
public final int getAdditionalField()
{
return baseGraph.edges.getInt(edgePointer + baseGraph.E_ADDITIONAL);
}

@Override
public EdgeIteratorState setAdditionalField( int value )
public final EdgeIteratorState setAdditionalField( int value )
{
baseGraph.setAdditionalEdgeField(edgePointer, value);
return null;
Expand Down Expand Up @@ -676,7 +670,7 @@ public EdgeIteratorState setName( String name )
}

@Override
public boolean getBoolean( int key, boolean reverse, boolean _default )
public final boolean getBoolean( int key, boolean reverse, boolean _default )
{
// for non-existent keys return default
return _default;
Expand All @@ -689,15 +683,14 @@ public EdgeIteratorState detach( boolean reverseArg )
throw new IllegalStateException("call next before detaching or setEdgeId (edgeId:" + edgeId + " vs. next " + nextEdgeId + ")");

EdgeIterable iter = new EdgeIterable(baseGraph, edgeAccess, filter);
iter.setEdgeId(edgeId);
boolean ret;
if (reverseArg)
{
ret = iter.initWithAdjNode(baseNode);
ret = iter.init(edgeId, baseNode);
// for #162
iter.reverse = !reverse;
} else
ret = iter.initWithAdjNode(adjNode);
ret = iter.init(edgeId, adjNode);
assert ret;
return iter;
}
Expand Down Expand Up @@ -736,16 +729,15 @@ EdgeIteratorState copyProperties( EdgeIteratorState from, EdgeIteratorState to )
* @return EdgeIteratorState of newly created edge
*/
@Override
public EdgeIteratorState edge( int a, int b )
public EdgeIteratorState edge( int nodeA, int nodeB )
{
if (isFrozen())
throw new IllegalStateException("Cannot create edge if graph is already frozen");

ensureNodeIndex(Math.max(a, b));
int edge = edgeAccess.internalEdgeAdd(nextEdgeId(), a, b);
ensureNodeIndex(Math.max(nodeA, nodeB));
int edgeId = edgeAccess.internalEdgeAdd(nextEdgeId(), nodeA, nodeB);
EdgeIterable iter = new EdgeIterable(this, edgeAccess, EdgeFilter.ALL_EDGES);
iter.setEdgeId(edge);
boolean ret = iter.initWithAdjNode(b);
boolean ret = iter.init(edgeId, nodeB);
assert ret;
if (extStorage.isRequireEdgeField())
iter.setAdditionalField(extStorage.getDefaultEdgeFieldValue());
Expand Down Expand Up @@ -792,8 +784,8 @@ EdgeIteratorState getEdgeProps( EdgeAccess tmpEdgeAccess, int edgeId, int adjNod
if (adjNode < 0 && adjNode != Integer.MIN_VALUE || adjNode >= nodeCount)
throw new IllegalStateException("adjNode " + adjNode + " out of bounds [0," + nf(nodeCount) + ")");

EdgeIterable edge = tmpEdgeAccess.createSingleEdge(edgeId);
if (edge.initWithAdjNode(adjNode))
EdgeIterable edge = tmpEdgeAccess.createSingleEdge();
if (edge.init(edgeId, adjNode))
return edge;

// if edgeId exists but adjacent nodes do not match
Expand Down Expand Up @@ -971,7 +963,7 @@ void inPlaceNodeRemove( int removeNodeCount )
edgeAccess.invalidateEdge(edgeToRemovePointer);
} else
{
prev = adjNodesToDelIter.getEdgePointer();
prev = adjNodesToDelIter.edgePointer;
}
}
}
Expand Down Expand Up @@ -1260,7 +1252,7 @@ private int stringHashCode( String str )
protected static class AllEdgeIterator implements AllEdgesIterator
{
protected long edgePointer;
protected int edgeId = -1;
protected int edgeId = -1;
protected EdgeAccess edgeAccess;
private int nodeA;
private int nodeB;
Expand Down
39 changes: 16 additions & 23 deletions core/src/main/java/com/graphhopper/storage/CHGraphImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,9 @@ public class CHGraphImpl implements CHGraph, Storable<CHGraph>
this.chEdgeAccess = new EdgeAccess(shortcuts, baseGraph.bitUtil)
{
@Override
final EdgeIterable createSingleEdge( int edgeId )
final EdgeIterable createSingleEdge()
{
EdgeSkipIteratorImpl ei = new EdgeSkipIteratorImpl(baseGraph, this, EdgeFilter.ALL_EDGES);
ei.setEdgeId(edgeId);
ei.nextEdgeId = EdgeIterable.NO_EDGE;
return ei;
return new EdgeSkipIteratorImpl(baseGraph, this, EdgeFilter.ALL_EDGES);
}

@Override
Expand Down Expand Up @@ -94,7 +91,7 @@ final long toPointer( int shortcutId )
}

@Override
boolean isInBounds( int shortcutId )
final boolean isInBounds( int shortcutId )
{
int tmp = shortcutId - baseGraph.edgeCount;
return tmp < shortcutCount && tmp >= 0;
Expand Down Expand Up @@ -162,9 +159,8 @@ public EdgeSkipIterState shortcut( int a, int b )
checkNodeId(b);

int scId = chEdgeAccess.internalEdgeAdd(nextShortcutId(), a, b);
EdgeSkipIteratorImpl iter = new EdgeSkipIteratorImpl(baseGraph, chEdgeAccess, EdgeFilter.ALL_EDGES);
iter.setEdgeId(scId);
boolean ret = iter.initWithAdjNode(b);
EdgeSkipIteratorImpl iter = new EdgeSkipIteratorImpl(baseGraph, chEdgeAccess, EdgeFilter.ALL_EDGES);
boolean ret = iter.init(scId, b);
assert ret;
iter.setSkippedEdges(EdgeIterator.NO_EDGE, EdgeIterator.NO_EDGE);
return iter;
Expand Down Expand Up @@ -193,9 +189,8 @@ public EdgeSkipIterState edge( int a, int b )
// increase edge array not for shortcuts
baseGraph.ensureNodeIndex(Math.max(a, b));
int edgeId = baseGraph.edgeAccess.internalEdgeAdd(baseGraph.nextEdgeId(), a, b);
EdgeSkipIteratorImpl iter = new EdgeSkipIteratorImpl(baseGraph, baseGraph.edgeAccess, EdgeFilter.ALL_EDGES);
iter.setEdgeId(edgeId);
boolean ret = iter.initWithAdjNode(b);
EdgeSkipIteratorImpl iter = new EdgeSkipIteratorImpl(baseGraph, baseGraph.edgeAccess, EdgeFilter.ALL_EDGES);
boolean ret = iter.init(edgeId, b);
assert ret;
return iter;
}
Expand Down Expand Up @@ -280,8 +275,7 @@ public EdgeSkipIteratorImpl( BaseGraph baseGraph, EdgeAccess edgeAccess, EdgeFil
@Override
public final EdgeSkipIterator setBaseNode( int baseNode )
{
if (!baseGraph.isFrozen())
throw new IllegalStateException("Traversal CHGraph is only possible if BaseGraph is frozen");
assert baseGraph.isFrozen() : "Traversal CHGraph is only possible if BaseGraph is frozen";

// always use ch edge access
setEdgeId(chEdgeAccess.getEdgeRef(baseNode));
Expand Down Expand Up @@ -337,7 +331,7 @@ public final double getWeight()
}

@Override
protected void selectEdgeAccess()
protected final void selectEdgeAccess()
{
if (nextEdgeId < baseGraph.edgeCount)
// iterate over edges
Expand All @@ -353,16 +347,15 @@ public final EdgeIteratorState detach( boolean reverseArg )
if (edgeId == nextEdgeId)
throw new IllegalStateException("Call next() before detaching edge " + edgeId);

EdgeSkipIteratorImpl iter = new EdgeSkipIteratorImpl(baseGraph, edgeAccess, filter);
iter.setEdgeId(edgeId);
EdgeSkipIteratorImpl iter = new EdgeSkipIteratorImpl(baseGraph, edgeAccess, filter);
boolean ret;
if (reverseArg)
{
ret = iter.initWithAdjNode(baseNode);
ret = iter.init(edgeId, baseNode);
// for #162
iter.reverse = !reverse;
} else
ret = iter.initWithAdjNode(adjNode);
ret = iter.init(edgeId, adjNode);
assert ret;
return iter;
}
Expand All @@ -375,31 +368,31 @@ public final EdgeIteratorState copyPropertiesTo( EdgeIteratorState edge )
}

@Override
public String getName()
public final String getName()
{
if (isShortcut())
throw new IllegalStateException("Cannot call getName on shortcut " + getEdge());
return super.getName();
}

@Override
public EdgeIteratorState setName( String name )
public final EdgeIteratorState setName( String name )
{
if (isShortcut())
throw new IllegalStateException("Cannot call setName on shortcut " + getEdge());
return super.setName(name);
}

@Override
public PointList fetchWayGeometry( int mode )
public final PointList fetchWayGeometry( int mode )
{
if (isShortcut())
throw new IllegalStateException("Cannot call fetchWayGeometry on shortcut " + getEdge());
return super.fetchWayGeometry(mode);
}

@Override
public EdgeIteratorState setWayGeometry( PointList list )
public final EdgeIteratorState setWayGeometry( PointList list )
{
if (isShortcut())
throw new IllegalStateException("Cannot call setWayGeometry on shortcut " + getEdge());
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/com/graphhopper/storage/EdgeAccess.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ final void init( int E_NODEA, int E_NODEB, int E_LINKA, int E_LINKB, int E_DIST,
this.flagsSizeIsLong = flagsSizeIsLong;
}

abstract BaseGraph.EdgeIterable createSingleEdge( int edgeId );
abstract BaseGraph.EdgeIterable createSingleEdge();

abstract long toPointer( int edgeOrShortcutId );

Expand Down

0 comments on commit ed18207

Please sign in to comment.