preprocessor memory sqeezing

This commit is contained in:
Arndt 2014-08-24 17:50:29 +02:00
parent 329b36a45d
commit 6c90fb9a25
4 changed files with 106 additions and 48 deletions

View file

@ -17,13 +17,98 @@ public class OsmLinkP
/** /**
* The target is either the next link or the target node * 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( ) public final boolean counterLinkWritten( )
{ {
return descriptionBitmap == null; 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" );
}
}
} }

View file

@ -1,11 +0,0 @@
/**
* Dummy child of OsmLinkP just to encode the reverse bit
*
* @author ab
*/
package btools.mapcreator;
public class OsmLinkPReverse extends OsmLinkP
{
}

View file

@ -75,7 +75,7 @@ public class OsmNodeP implements Comparable<OsmNodeP>
public void addLink( OsmLinkP link ) public void addLink( OsmLinkP link )
{ {
if ( firstlink != null ) link.next = firstlink; link.setNext( firstlink, this );
firstlink = link; firstlink = link;
} }
@ -96,27 +96,27 @@ public class OsmNodeP implements Comparable<OsmNodeP>
// hack: write node-desc as link tag (copy cycleway-bits) // hack: write node-desc as link tag (copy cycleway-bits)
byte[] nodeDescription = getNodeDecsription(); 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 ilonref = ilon;
int ilatref = ilat; int ilatref = ilat;
OsmLinkP link = link0; OsmLinkP link = link0;
OsmNodeP origin = this; 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 // first pass just to see if that link is consistent
while( link != null ) while( link != null )
{ {
OsmNodeP target = link.targetNode; OsmNodeP target = link.getTarget( origin );
if ( !target.isTransferNode() ) if ( !target.isTransferNode() )
{ {
break; break;
} }
// next link is the one (of two), does does'nt point back // 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; origin = target;
} }
@ -125,14 +125,14 @@ public class OsmNodeP implements Comparable<OsmNodeP>
if ( skipDetailBit == 0) if ( skipDetailBit == 0)
{ {
link = link0; link = link0;
origin = this;
} }
origin = this;
byte[] lastDescription = null; byte[] lastDescription = null;
while( link != null ) while( link != null )
{ {
if ( link.descriptionBitmap == null && skipDetailBit == 0 ) throw new IllegalArgumentException( "missing way description..."); 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 tranferbit = target.isTransferNode() ? TRANSFERNODE_BITMASK : 0;
int nodedescbit = nodeDescription != null ? NODEDESC_BITMASK : 0; int nodedescbit = nodeDescription != null ? NODEDESC_BITMASK : 0;
@ -140,7 +140,7 @@ public class OsmNodeP implements Comparable<OsmNodeP>
if ( skipDetailBit == 0 ) // check if description changed if ( skipDetailBit == 0 ) // check if description changed
{ {
int inverseBitByteIndex = writeVarLength ? 0 : 7; int inverseBitByteIndex = writeVarLength ? 0 : 7;
boolean inverseDirection = link instanceof OsmLinkPReverse; boolean inverseDirection = link.isReverse( origin );
byte[] ab = link.descriptionBitmap; byte[] ab = link.descriptionBitmap;
int abLen = ab.length; int abLen = ab.length;
int lastLen = lastDescription == null ? 0 : lastDescription.length; int lastLen = lastDescription == null ? 0 : lastDescription.length;
@ -189,16 +189,17 @@ public class OsmNodeP implements Comparable<OsmNodeP>
nodeDescription = null; nodeDescription = null;
} }
link.descriptionBitmap = null; // mark link as written
if ( tranferbit == 0) if ( tranferbit == 0)
{ {
target.markLinkWritten( origin );
break; break;
} }
os2.writeVarLengthSigned( target.getSElev() -getSElev() ); os2.writeVarLengthSigned( target.getSElev() -getSElev() );
// next link is the one (of two), does does'nt point back // 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!" ); if ( link == null ) throw new RuntimeException( "follow-up link not found for transfer-node!" );
origin = target; origin = target;
@ -236,24 +237,13 @@ public class OsmNodeP implements Comparable<OsmNodeP>
{ {
int cnt = 0; int cnt = 0;
for( OsmLinkP link = firstlink; link != null; link = link.next ) for( OsmLinkP link = firstlink; link != null; link = link.getNext( this ) )
{ {
cnt++; cnt++;
} }
return 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. * Compares two OsmNodes for position ordering.
* *

View file

@ -179,18 +179,12 @@ public class WayLinker extends MapCreatorBase
long nid = way.nodes.get(i); long nid = way.nodes.get(i);
n1 = n2; n1 = n2;
n2 = nodesMap.get( nid ); n2 = nodesMap.get( nid );
if ( n1 != null && n2 != null ) if ( n1 != null && n2 != null && n1 != n2 )
{ {
OsmLinkP l1 = new OsmLinkP(); OsmLinkP link = new OsmLinkP( n1, n2 );
l1.targetNode = n2; link.descriptionBitmap = description;
l1.descriptionBitmap = description; n1.addLink( link );
n1.addLink( l1 ); n2.addLink( link );
OsmLinkP l2 = new OsmLinkPReverse();
l2.targetNode = n1;
l2.descriptionBitmap = description;
n2.addLink( l2 );
} }
if ( n2 != null ) if ( n2 != null )
{ {