Skip to content

Commit 5fe499e

Browse files
authored
avoid IntsRef recreation and simpler getter (graphhopper#1947)
1 parent 4ec39ee commit 5fe499e

File tree

2 files changed

+52
-42
lines changed

2 files changed

+52
-42
lines changed

core/src/main/java/com/graphhopper/storage/TurnCostStorage.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
* A key/value store, where the unique keys are turn relations, and the values are IntRefs.
2626
* A turn relation is a triple (fromEdge, viaNode, toEdge),
2727
* and refers to one of the possible ways of crossing an intersection.
28-
*
28+
* <p>
2929
* Like IntRefs on edges, this can in principle be used to store values of any kind.
30-
*
30+
* <p>
3131
* In practice, the IntRefs are used to store generalized travel costs per turn relation per vehicle type.
3232
* In practice, we only store 0 or infinity. (Can turn, or cannot turn.)
3333
*
@@ -242,15 +242,20 @@ public TurnRelationIterator getAllTurnRelations() {
242242

243243
public interface TurnRelationIterator {
244244
int getFromEdge();
245+
245246
int getViaNode();
247+
246248
int getToEdge();
247-
IntsRef getFlags();
249+
250+
double getCost(DecimalEncodedValue encodedValue);
251+
248252
boolean next();
249253
}
250254

251255
private class Itr implements TurnRelationIterator {
252256
private int viaNode = -1;
253257
private int turnCostIndex = -1;
258+
private IntsRef intsRef = TurnCost.createFlags();
254259

255260
private long turnCostPtr() {
256261
return (long) turnCostIndex * BYTES_PER_ENTRY;
@@ -272,8 +277,9 @@ public int getToEdge() {
272277
}
273278

274279
@Override
275-
public IntsRef getFlags() {
276-
return new IntsRef(new int[]{turnCosts.getInt(turnCostPtr() + TC_FLAGS)}, 0, 1);
280+
public double getCost(DecimalEncodedValue encodedValue) {
281+
intsRef.ints[0] = turnCosts.getInt(turnCostPtr() + TC_FLAGS);
282+
return encodedValue.getDecimal(false, intsRef);
277283
}
278284

279285
@Override

core/src/test/java/com/graphhopper/storage/TurnCostStorageTest.java

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
package com.graphhopper.storage;
2020

2121
import com.graphhopper.routing.profiles.DecimalEncodedValue;
22-
import com.graphhopper.routing.profiles.EncodedValueLookup;
2322
import com.graphhopper.routing.profiles.TurnCost;
2423
import com.graphhopper.routing.util.BikeFlagEncoder;
2524
import com.graphhopper.routing.util.CarFlagEncoder;
@@ -28,7 +27,10 @@
2827
import org.junit.Before;
2928
import org.junit.Test;
3029

31-
import java.util.*;
30+
import java.util.Arrays;
31+
import java.util.HashSet;
32+
import java.util.List;
33+
import java.util.Set;
3234

3335
import static com.graphhopper.util.GHUtility.getEdge;
3436
import static org.junit.Assert.assertEquals;
@@ -67,52 +69,53 @@ public void testMultipleTurnCosts() {
6769
initGraph(g);
6870
TurnCostStorage turnCostStorage = g.getTurnCostStorage();
6971

70-
DecimalEncodedValue car = ((EncodedValueLookup) manager).getDecimalEncodedValue(TurnCost.key("car"));
71-
DecimalEncodedValue bike = ((EncodedValueLookup) manager).getDecimalEncodedValue(TurnCost.key("bike"));
72+
DecimalEncodedValue carEnc = manager.getDecimalEncodedValue(TurnCost.key("car"));
73+
DecimalEncodedValue bikeEnc = manager.getDecimalEncodedValue(TurnCost.key("bike"));
7274
int edge42 = getEdge(g, 4, 2).getEdge();
7375
int edge23 = getEdge(g, 2, 3).getEdge();
7476
int edge31 = getEdge(g, 3, 1).getEdge();
7577
int edge10 = getEdge(g, 1, 0).getEdge();
7678
int edge02 = getEdge(g, 0, 2).getEdge();
7779
int edge24 = getEdge(g, 2, 4).getEdge();
7880

79-
turnCostStorage.set(car, edge42, 2, edge23, Double.POSITIVE_INFINITY);
80-
turnCostStorage.set(bike, edge42, 2, edge23, Double.POSITIVE_INFINITY);
81-
turnCostStorage.set(car, edge23, 3, edge31, Double.POSITIVE_INFINITY);
82-
turnCostStorage.set(bike, edge23, 3, edge31, 2.0);
83-
turnCostStorage.set(car, edge31, 1, edge10, 2.0);
84-
turnCostStorage.set(bike, edge31, 1, edge10, Double.POSITIVE_INFINITY);
85-
turnCostStorage.set(bike, edge02, 2, edge24, Double.POSITIVE_INFINITY);
81+
turnCostStorage.set(carEnc, edge42, 2, edge23, Double.POSITIVE_INFINITY);
82+
turnCostStorage.set(bikeEnc, edge42, 2, edge23, Double.POSITIVE_INFINITY);
83+
turnCostStorage.set(carEnc, edge23, 3, edge31, Double.POSITIVE_INFINITY);
84+
turnCostStorage.set(bikeEnc, edge23, 3, edge31, 2.0);
85+
turnCostStorage.set(carEnc, edge31, 1, edge10, 2.0);
86+
turnCostStorage.set(bikeEnc, edge31, 1, edge10, Double.POSITIVE_INFINITY);
87+
turnCostStorage.set(bikeEnc, edge02, 2, edge24, Double.POSITIVE_INFINITY);
8688

87-
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(car, edge42, 2, edge23), 0);
88-
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(bike, edge42, 2, edge23), 0);
89+
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(carEnc, edge42, 2, edge23), 0);
90+
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(bikeEnc, edge42, 2, edge23), 0);
8991

90-
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(car, edge23, 3, edge31), 0);
91-
assertEquals(2.0, turnCostStorage.get(bike, edge23, 3, edge31), 0);
92+
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(carEnc, edge23, 3, edge31), 0);
93+
assertEquals(2.0, turnCostStorage.get(bikeEnc, edge23, 3, edge31), 0);
9294

93-
assertEquals(2.0, turnCostStorage.get(car, edge31, 1, edge10), 0);
94-
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(bike, edge31, 1, edge10), 0);
95+
assertEquals(2.0, turnCostStorage.get(carEnc, edge31, 1, edge10), 0);
96+
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(bikeEnc, edge31, 1, edge10), 0);
9597

96-
assertEquals(0.0, turnCostStorage.get(car, edge02, 2, edge24), 0);
97-
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(bike, edge02, 2, edge24), 0);
98+
assertEquals(0.0, turnCostStorage.get(carEnc, edge02, 2, edge24), 0);
99+
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(bikeEnc, edge02, 2, edge24), 0);
98100

99-
turnCostStorage.set(car, edge02, 2, edge23, Double.POSITIVE_INFINITY);
100-
turnCostStorage.set(bike, edge02, 2, edge23, Double.POSITIVE_INFINITY);
101-
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(car, edge02, 2, edge23), 0);
102-
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(bike, edge02, 2, edge23), 0);
101+
turnCostStorage.set(carEnc, edge02, 2, edge23, Double.POSITIVE_INFINITY);
102+
turnCostStorage.set(bikeEnc, edge02, 2, edge23, Double.POSITIVE_INFINITY);
103+
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(carEnc, edge02, 2, edge23), 0);
104+
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(bikeEnc, edge02, 2, edge23), 0);
103105

104106
Set<List<Integer>> allTurnRelations = new HashSet<>();
105107
TurnCostStorage.TurnRelationIterator iterator = turnCostStorage.getAllTurnRelations();
106108
while (iterator.next()) {
107-
allTurnRelations.add(Arrays.asList(iterator.getFromEdge(), iterator.getViaNode(),iterator.getToEdge(), (int) car.getDecimal(false, iterator.getFlags()), (int) bike.getDecimal(false, iterator.getFlags())));
109+
allTurnRelations.add(Arrays.asList(iterator.getFromEdge(), iterator.getViaNode(), iterator.getToEdge(),
110+
(int) iterator.getCost(carEnc), (int) iterator.getCost(bikeEnc)));
108111
}
109112

110113
Set<List<Integer>> expectedTurnRelations = new HashSet<>();
111-
expectedTurnRelations.add(Arrays.asList(edge31,1,edge10,2,Integer.MAX_VALUE));
112-
expectedTurnRelations.add(Arrays.asList(edge42,2,edge23,Integer.MAX_VALUE,Integer.MAX_VALUE));
113-
expectedTurnRelations.add(Arrays.asList(edge02,2,edge24,0,Integer.MAX_VALUE));
114-
expectedTurnRelations.add(Arrays.asList(edge02,2,edge23,Integer.MAX_VALUE,Integer.MAX_VALUE));
115-
expectedTurnRelations.add(Arrays.asList(edge23,3,edge31,Integer.MAX_VALUE,2));
114+
expectedTurnRelations.add(Arrays.asList(edge31, 1, edge10, 2, Integer.MAX_VALUE));
115+
expectedTurnRelations.add(Arrays.asList(edge42, 2, edge23, Integer.MAX_VALUE, Integer.MAX_VALUE));
116+
expectedTurnRelations.add(Arrays.asList(edge02, 2, edge24, 0, Integer.MAX_VALUE));
117+
expectedTurnRelations.add(Arrays.asList(edge02, 2, edge23, Integer.MAX_VALUE, Integer.MAX_VALUE));
118+
expectedTurnRelations.add(Arrays.asList(edge23, 3, edge31, Integer.MAX_VALUE, 2));
116119

117120
assertEquals(expectedTurnRelations, allTurnRelations);
118121
}
@@ -123,24 +126,25 @@ public void testMergeFlagsBeforeAdding() {
123126
initGraph(g);
124127
TurnCostStorage turnCostStorage = g.getTurnCostStorage();
125128

126-
DecimalEncodedValue car = ((EncodedValueLookup) manager).getDecimalEncodedValue(TurnCost.key("car"));
127-
DecimalEncodedValue bike = ((EncodedValueLookup) manager).getDecimalEncodedValue(TurnCost.key("bike"));
129+
DecimalEncodedValue carEnc = manager.getDecimalEncodedValue(TurnCost.key("car"));
130+
DecimalEncodedValue bikeEnc = manager.getDecimalEncodedValue(TurnCost.key("bike"));
128131
int edge23 = getEdge(g, 2, 3).getEdge();
129132
int edge02 = getEdge(g, 0, 2).getEdge();
130133

131-
turnCostStorage.set(car, edge02, 2, edge23, Double.POSITIVE_INFINITY);
132-
turnCostStorage.set(bike, edge02, 2, edge23, Double.POSITIVE_INFINITY);
133-
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(car, edge02, 2, edge23), 0);
134-
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(bike, edge02, 2, edge23), 0);
134+
turnCostStorage.set(carEnc, edge02, 2, edge23, Double.POSITIVE_INFINITY);
135+
turnCostStorage.set(bikeEnc, edge02, 2, edge23, Double.POSITIVE_INFINITY);
136+
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(carEnc, edge02, 2, edge23), 0);
137+
assertEquals(Double.POSITIVE_INFINITY, turnCostStorage.get(bikeEnc, edge02, 2, edge23), 0);
135138

136139
Set<List<Integer>> allTurnRelations = new HashSet<>();
137140
TurnCostStorage.TurnRelationIterator iterator = turnCostStorage.getAllTurnRelations();
138141
while (iterator.next()) {
139-
allTurnRelations.add(Arrays.asList(iterator.getFromEdge(), iterator.getViaNode(),iterator.getToEdge(), (int) car.getDecimal(false, iterator.getFlags()), (int) bike.getDecimal(false, iterator.getFlags())));
142+
allTurnRelations.add(Arrays.asList(iterator.getFromEdge(), iterator.getViaNode(), iterator.getToEdge(),
143+
(int) iterator.getCost(carEnc), (int) iterator.getCost(bikeEnc)));
140144
}
141145

142146
Set<List<Integer>> expectedTurnRelations = new HashSet<>();
143-
expectedTurnRelations.add(Arrays.asList(edge02,2,edge23,Integer.MAX_VALUE,Integer.MAX_VALUE));
147+
expectedTurnRelations.add(Arrays.asList(edge02, 2, edge23, Integer.MAX_VALUE, Integer.MAX_VALUE));
144148

145149
assertEquals(expectedTurnRelations, allTurnRelations);
146150
}

0 commit comments

Comments
 (0)