From 5b4df2780c4212d0916627c1db5da3b54750a630 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Wed, 13 Jun 2012 15:54:06 +0200 Subject: [PATCH] Make primitive types --- .../binary/BinaryMapRouteReaderAdapter.java | 104 +++++++++++++----- .../net/osmand/router/BinaryRoutePlanner.java | 28 ++--- 2 files changed, 86 insertions(+), 46 deletions(-) diff --git a/DataExtractionOSM/src/net/osmand/binary/BinaryMapRouteReaderAdapter.java b/DataExtractionOSM/src/net/osmand/binary/BinaryMapRouteReaderAdapter.java index 8620ef7700..c4ba72521b 100644 --- a/DataExtractionOSM/src/net/osmand/binary/BinaryMapRouteReaderAdapter.java +++ b/DataExtractionOSM/src/net/osmand/binary/BinaryMapRouteReaderAdapter.java @@ -1,7 +1,9 @@ package net.osmand.binary; +import gnu.trove.iterator.TLongObjectIterator; import gnu.trove.list.array.TIntArrayList; import gnu.trove.list.array.TLongArrayList; +import gnu.trove.map.hash.TLongObjectHashMap; import java.io.IOException; import java.util.ArrayList; @@ -118,6 +120,9 @@ public class BinaryMapRouteReaderAdapter { } } + private static final int RESTRICTION_SHIFT = 3; + private static final int RESTRICTION_MASK = 7; + public static class RouteDataObject { public final RouteRegion region; @@ -127,18 +132,18 @@ public class BinaryMapRouteReaderAdapter { public RouteDataObject(RouteDataObject copy) { this.region = copy.region; - this.pointsX = new TIntArrayList(copy.pointsX); - this.pointsY = new TIntArrayList(copy.pointsY); + this.pointsX = copy.pointsX; + this.pointsY = copy.pointsY; this.types = new TIntArrayList(copy.types); - this.restrictions = new TLongArrayList(copy.restrictions); + this.restrictions = copy.restrictions; this.pointTypes = new ArrayList(copy.pointTypes); this.id = copy.id; } public TIntArrayList types = new TIntArrayList(); - public TIntArrayList pointsX = new TIntArrayList(); - public TIntArrayList pointsY = new TIntArrayList(); - public TLongArrayList restrictions = new TLongArrayList(); + public int[] pointsX ; + public int[] pointsY ; + public long[] restrictions ; public List pointTypes = new ArrayList(); public long id; @@ -147,13 +152,45 @@ public class BinaryMapRouteReaderAdapter { } public int getPoint31XTile(int i) { - return pointsX.getQuick(i); + return pointsX[i]; } public int getPoint31YTile(int i) { - return pointsY.getQuick(i); + return pointsY[i]; } public int getPointsLength() { - return pointsX.size(); + return pointsX.length; + } + public int getRestrictionLength(){ + return restrictions == null ? 0 : restrictions.length; + } + + public int getRestrictionType(int i){ + return (int) (restrictions[i] & RESTRICTION_MASK); + } + public long getRestrictionId(int i){ + return restrictions[i] >> RESTRICTION_SHIFT; + } + + + public void insert(int pos, int x31, int y31, TIntArrayList pointTypes) { + int[] opointsX = pointsX; + int[] opointsY = pointsY; + pointsX = new int[pointsX.length + 1]; + pointsY = new int[pointsY.length + 1]; + int i = 0; + for (; i < pos; i++) { + pointsX[i] = opointsX[i]; + pointsY[i] = opointsY[i]; + } + pointsX[i] = x31; + pointsY[i] = y31; + for (i = i + 1; i < pointsX.length; i++) { + pointsX[i] = opointsX[i-1]; + pointsY[i] = opointsY[i-1]; + } + if(this.pointTypes.size() > pos) { + this.pointTypes.add(pos, pointTypes); + } } public TIntArrayList getPointTypes(int ind) { @@ -324,11 +361,15 @@ public class BinaryMapRouteReaderAdapter { private RouteDataObject readRouteDataObject(RouteRegion reg, int pleftx, int ptopy) throws IOException { RouteDataObject o = new RouteDataObject(reg); + TIntArrayList pointsX = new TIntArrayList(); + TIntArrayList pointsY = new TIntArrayList(); while (true) { int ts = codedIS.readTag(); int tags = WireFormat.getTagFieldNumber(ts); switch (tags) { case 0: + o.pointsX = pointsX.toArray(); + o.pointsY = pointsY.toArray(); return o; case RouteData.TYPES_FIELD_NUMBER: int len = codedIS.readRawVarint32(); @@ -346,8 +387,8 @@ public class BinaryMapRouteReaderAdapter { while(codedIS.getBytesUntilLimit() > 0){ int x = (codedIS.readSInt32() ) + px; int y = (codedIS.readSInt32() ) + py; - o.pointsX.add(x << SHIFT_COORDINATES); - o.pointsY.add(y << SHIFT_COORDINATES); + pointsX.add(x << SHIFT_COORDINATES); + pointsY.add(y << SHIFT_COORDINATES); px = x; py = y; } @@ -378,10 +419,8 @@ public class BinaryMapRouteReaderAdapter { } } } - private static final int RESTRICTION_SHIFT = 20; - private static final long RESTRICTION_MASK = (1l << RESTRICTION_SHIFT) - 1; private void readRouteTreeData(RouteSubregion routeTree, TLongArrayList idTables, - TLongArrayList restrictions) throws IOException { + TLongObjectHashMap restrictions) throws IOException { routeTree.dataObjects = new ArrayList(); idTables.clear(); restrictions.clear(); @@ -390,14 +429,17 @@ public class BinaryMapRouteReaderAdapter { int tag = WireFormat.getTagFieldNumber(t); switch (tag) { case 0: - for (int k = 0; k < restrictions.size(); k++) { - long r = restrictions.get(k); - int from = (int) (r >> (RESTRICTION_SHIFT+RESTRICTION_SHIFT)); - int to = (int) ((r >> RESTRICTION_SHIFT) & RESTRICTION_MASK); - int type = (int) (r & RESTRICTION_MASK); - long valto = (idTables.get(to) << 3) | ((long)type); + TLongObjectIterator it = restrictions.iterator(); + while (it.hasNext()) { + it.advance(); + int from = (int) it.key(); RouteDataObject fromr = routeTree.dataObjects.get(from); - fromr.restrictions.add(valto); + fromr.restrictions = new long[it.value().size()]; + for (int k = 0; k < fromr.restrictions.length; k++) { + int to = (int) (it.value().get(k) >> RESTRICTION_SHIFT); + long valto = (idTables.get(to) << RESTRICTION_SHIFT) | ((long) it.value().get(k) & RESTRICTION_MASK); + fromr.restrictions[k] = valto; + } } for (RouteDataObject o : routeTree.dataObjects) { if (o != null) { @@ -441,7 +483,9 @@ public class BinaryMapRouteReaderAdapter { case RouteDataBlock.RESTRICTIONS_FIELD_NUMBER : length = codedIS.readRawVarint32(); oldLimit = codedIS.pushLimit(length); - long restriction = 0; + long from = 0; + long to = 0; + long type = 0; idLoop : while(true){ int ts = codedIS.readTag(); int tags = WireFormat.getTagFieldNumber(ts); @@ -449,23 +493,23 @@ public class BinaryMapRouteReaderAdapter { case 0: break idLoop; case RestrictionData.FROM_FIELD_NUMBER : - long from = codedIS.readInt32(); - restriction |= (from << (RESTRICTION_SHIFT+RESTRICTION_SHIFT)); + from = codedIS.readInt32(); break; case RestrictionData.TO_FIELD_NUMBER : - long to = codedIS.readInt32(); - restriction |= (to << RESTRICTION_SHIFT); + to = codedIS.readInt32(); break; case RestrictionData.TYPE_FIELD_NUMBER : - int type = codedIS.readInt32(); - restriction |= type; + type = codedIS.readInt32(); break; default: skipUnknownField(ts); break; } } - restrictions.add(restriction); + if(!restrictions.containsKey(from)) { + restrictions.put(from, new TLongArrayList()); + } + restrictions.get(from).add((to << RESTRICTION_SHIFT) + type); codedIS.popLimit(oldLimit); break; case RouteDataBlock.STRINGTABLE_FIELD_NUMBER : @@ -583,7 +627,7 @@ public class BinaryMapRouteReaderAdapter { } }); TLongArrayList idMap = new TLongArrayList(); - TLongArrayList restrictionMap = new TLongArrayList(); + TLongObjectHashMap restrictionMap = new TLongObjectHashMap(); for (RouteSubregion rs : toLoad) { if (rs.dataObjects == null) { codedIS.seek(rs.filePointer + rs.shiftToData); diff --git a/DataExtractionOSM/src/net/osmand/router/BinaryRoutePlanner.java b/DataExtractionOSM/src/net/osmand/router/BinaryRoutePlanner.java index e0c8f5e1f4..df288c73ea 100644 --- a/DataExtractionOSM/src/net/osmand/router/BinaryRoutePlanner.java +++ b/DataExtractionOSM/src/net/osmand/router/BinaryRoutePlanner.java @@ -138,11 +138,7 @@ public class BinaryRoutePlanner { if (road == null || currentsDist < sdist) { RouteDataObject ro = new RouteDataObject(r); road = new RouteSegment(ro, j); - ro.pointsX.insert(j, prx); - ro.pointsY.insert(j, pry); - if(ro.pointTypes.size() > j) { - ro.pointTypes.add(j, null); - } + ro.insert(j, prx, pry, null); sdist = currentsDist; foundProjX = prx; foundProjY = pry; @@ -367,12 +363,12 @@ public class BinaryRoutePlanner { RoutingTile tl = suggestedTile; RouteDataObject old = tl.idObjects.get(o.id); // sometimes way is present only partially in one index - if (old != null && old.pointsX.size() >= o.pointsX.size()) { + if (old != null && old.getPointsLength() >= o.getPointsLength()) { return; }; - for (int j = 0; j < o.pointsX.size(); j++) { - int x = o.pointsX.getQuick(j); - int y = o.pointsY.getQuick(j); + for (int j = 0; j < o.getPointsLength(); j++) { + int x = o.getPoint31XTile(j); + int y = o.getPoint31YTile(j); if(!tl.checkContains(x, y)){ // don't register in different tiles // in order to throw out tile object easily @@ -596,22 +592,22 @@ public class BinaryRoutePlanner { ctx.segmentsToVisitNotForbidden.clear(); boolean exclusiveRestriction = false; RouteSegment next = inputNext; - if (!reverseWay && road.restrictions.isEmpty()) { + if (!reverseWay && road.getRestrictionLength() > 0) { return false; } while (next != null) { int type = -1; if (!reverseWay) { - for (int i = 0; i < road.restrictions.size(); i++) { - if (road.restrictions.getQuick(i) >> 3 == next.road.id) { - type = (int) (road.restrictions.getQuick(i) & 7); + for (int i = 0; i < road.getRestrictionLength(); i++) { + if (road.getRestrictionId(i) == next.road.id) { + type = road.getRestrictionType(i); break; } } } else { - for (int i = 0; i < next.road.restrictions.size(); i++) { - int rt = (int) (next.road.restrictions.getQuick(i) & 7); - long restrictedTo = next.road.restrictions.getQuick(i) >> 3; + for (int i = 0; i < next.road.getRestrictionLength(); i++) { + int rt = next.road.getRestrictionType(i); + long restrictedTo = next.road.getRestrictionId(i); if (restrictedTo == road.id) { type = rt; break;