preprocessor memory sqeezing
This commit is contained in:
parent
329b36a45d
commit
6c90fb9a25
4 changed files with 106 additions and 48 deletions
|
@ -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" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
/**
|
|
||||||
* Dummy child of OsmLinkP just to encode the reverse bit
|
|
||||||
*
|
|
||||||
* @author ab
|
|
||||||
*/
|
|
||||||
package btools.mapcreator;
|
|
||||||
|
|
||||||
|
|
||||||
public class OsmLinkPReverse extends OsmLinkP
|
|
||||||
{
|
|
||||||
}
|
|
|
@ -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.
|
||||||
*
|
*
|
||||||
|
|
|
@ -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 )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue