From 6c90fb9a2531cce952496e220195dc3000df9159 Mon Sep 17 00:00:00 2001 From: Arndt Date: Sun, 24 Aug 2014 17:50:29 +0200 Subject: [PATCH] preprocessor memory sqeezing --- .../main/java/btools/mapcreator/OsmLinkP.java | 89 ++++++++++++++++++- .../btools/mapcreator/OsmLinkPReverse.java | 11 --- .../main/java/btools/mapcreator/OsmNodeP.java | 38 +++----- .../java/btools/mapcreator/WayLinker.java | 16 ++-- 4 files changed, 106 insertions(+), 48 deletions(-) delete mode 100644 brouter-map-creator/src/main/java/btools/mapcreator/OsmLinkPReverse.java diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/OsmLinkP.java b/brouter-map-creator/src/main/java/btools/mapcreator/OsmLinkP.java index 192fa96..aad7f73 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/OsmLinkP.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/OsmLinkP.java @@ -17,13 +17,98 @@ public class OsmLinkP /** * The target is either the next link or the target node */ - public OsmNodeP targetNode; + private OsmNodeP sourceNode; + private OsmNodeP targetNode; - public OsmLinkP next; + private OsmLinkP previous; + private OsmLinkP next; + public OsmLinkP( OsmNodeP source, OsmNodeP target ) + { + sourceNode = source; + targetNode = target; + } + public final boolean counterLinkWritten( ) { return descriptionBitmap == null; } + + /** + * Set the relevant next-pointer for the given source + */ + public void setNext( OsmLinkP link, OsmNodeP source ) + { + if ( sourceNode == source ) + { + next = link; + } + else if ( targetNode == source ) + { + previous = link; + } + else + { + throw new IllegalArgumentException( "internal error: setNext: unknown source" ); + } + } + + /** + * Get the relevant next-pointer for the given source + */ + public OsmLinkP getNext( OsmNodeP source ) + { + if ( sourceNode == source ) + { + return next; + } + else if ( targetNode == source ) + { + return previous; + } + else + { + throw new IllegalArgumentException( "internal error: gextNext: unknown source" ); + } + } + + /** + * Get the relevant target-node for the given source + */ + public OsmNodeP getTarget( OsmNodeP source ) + { + if ( sourceNode == source ) + { + return targetNode; + } + else if ( targetNode == source ) + { + return sourceNode; + } + else + { + throw new IllegalArgumentException( "internal error: getTarget: unknown source" ); + } + } + + /** + * Check if reverse link for the given source + */ + public boolean isReverse( OsmNodeP source ) + { + if ( sourceNode == source ) + { + return false; + } + else if ( targetNode == source ) + { + return true; + } + else + { + throw new IllegalArgumentException( "internal error: isReverse: unknown source" ); + } + } + } diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/OsmLinkPReverse.java b/brouter-map-creator/src/main/java/btools/mapcreator/OsmLinkPReverse.java deleted file mode 100644 index 3a368da..0000000 --- a/brouter-map-creator/src/main/java/btools/mapcreator/OsmLinkPReverse.java +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Dummy child of OsmLinkP just to encode the reverse bit - * - * @author ab - */ -package btools.mapcreator; - - -public class OsmLinkPReverse extends OsmLinkP -{ -} diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/OsmNodeP.java b/brouter-map-creator/src/main/java/btools/mapcreator/OsmNodeP.java index 52bef07..2138f9a 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/OsmNodeP.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/OsmNodeP.java @@ -75,7 +75,7 @@ public class OsmNodeP implements Comparable public void addLink( OsmLinkP link ) { - if ( firstlink != null ) link.next = firstlink; + link.setNext( firstlink, this ); firstlink = link; } @@ -96,27 +96,27 @@ public class OsmNodeP implements Comparable // hack: write node-desc as link tag (copy cycleway-bits) byte[] nodeDescription = getNodeDecsription(); - for( OsmLinkP link0 = firstlink; link0 != null; link0 = link0.next ) + for( OsmLinkP link0 = firstlink; link0 != null; link0 = link0.getNext( this ) ) { int ilonref = ilon; int ilatref = ilat; OsmLinkP link = link0; OsmNodeP origin = this; - int skipDetailBit = link0.counterLinkWritten() ? SKIPDETAILS_BITMASK : 0; + int skipDetailBit = link0.descriptionBitmap == null ? SKIPDETAILS_BITMASK : 0; // first pass just to see if that link is consistent while( link != null ) { - OsmNodeP target = link.targetNode; + OsmNodeP target = link.getTarget( origin ); if ( !target.isTransferNode() ) { break; } // next link is the one (of two), does does'nt point back - for( link = target.firstlink; link != null; link = link.next ) + for( link = target.firstlink; link != null; link = link.getNext( target ) ) { - if ( link.targetNode != origin ) break; + if ( link.getTarget( target ) != origin ) break; } origin = target; } @@ -125,14 +125,14 @@ public class OsmNodeP implements Comparable if ( skipDetailBit == 0) { link = link0; + origin = this; } - origin = this; byte[] lastDescription = null; while( link != null ) { if ( link.descriptionBitmap == null && skipDetailBit == 0 ) throw new IllegalArgumentException( "missing way description..."); - OsmNodeP target = link.targetNode; + OsmNodeP target = link.getTarget( origin ); int tranferbit = target.isTransferNode() ? TRANSFERNODE_BITMASK : 0; int nodedescbit = nodeDescription != null ? NODEDESC_BITMASK : 0; @@ -140,7 +140,7 @@ public class OsmNodeP implements Comparable if ( skipDetailBit == 0 ) // check if description changed { int inverseBitByteIndex = writeVarLength ? 0 : 7; - boolean inverseDirection = link instanceof OsmLinkPReverse; + boolean inverseDirection = link.isReverse( origin ); byte[] ab = link.descriptionBitmap; int abLen = ab.length; int lastLen = lastDescription == null ? 0 : lastDescription.length; @@ -189,16 +189,17 @@ public class OsmNodeP implements Comparable nodeDescription = null; } + link.descriptionBitmap = null; // mark link as written + if ( tranferbit == 0) { - target.markLinkWritten( origin ); break; } os2.writeVarLengthSigned( target.getSElev() -getSElev() ); // next link is the one (of two), does does'nt point back - for( link = target.firstlink; link != null; link = link.next ) + for( link = target.firstlink; link != null; link = link.getNext( target ) ) { - if ( link.targetNode != origin ) break; + if ( link.getTarget( target ) != origin ) break; } if ( link == null ) throw new RuntimeException( "follow-up link not found for transfer-node!" ); origin = target; @@ -236,24 +237,13 @@ public class OsmNodeP implements Comparable { int cnt = 0; - for( OsmLinkP link = firstlink; link != null; link = link.next ) + for( OsmLinkP link = firstlink; link != null; link = link.getNext( this ) ) { cnt++; } return cnt; } - // mark the link to the given node as written, - // don't want to write the counter-direction - // in full details - public void markLinkWritten( OsmNodeP t ) - { - for( OsmLinkP link = firstlink; link != null; link = link.next ) - { - if ( link.targetNode == t) link.descriptionBitmap = null; - } - } - /** * Compares two OsmNodes for position ordering. * diff --git a/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java b/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java index 2fdb6d4..491e660 100644 --- a/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java +++ b/brouter-map-creator/src/main/java/btools/mapcreator/WayLinker.java @@ -179,18 +179,12 @@ public class WayLinker extends MapCreatorBase long nid = way.nodes.get(i); n1 = n2; n2 = nodesMap.get( nid ); - if ( n1 != null && n2 != null ) + if ( n1 != null && n2 != null && n1 != n2 ) { - OsmLinkP l1 = new OsmLinkP(); - l1.targetNode = n2; - l1.descriptionBitmap = description; - n1.addLink( l1 ); - - OsmLinkP l2 = new OsmLinkPReverse(); - l2.targetNode = n1; - l2.descriptionBitmap = description; - - n2.addLink( l2 ); + OsmLinkP link = new OsmLinkP( n1, n2 ); + link.descriptionBitmap = description; + n1.addLink( link ); + n2.addLink( link ); } if ( n2 != null ) {