brouter/brouter-mapaccess/src/main/java/btools/mapaccess/OsmNodePairSet.java
2024-04-03 22:42:30 +02:00

104 lines
2 KiB
Java

/**
* Set holding pairs of osm nodes
*
* @author ab
*/
package btools.mapaccess;
import btools.util.CompactLongMap;
public class OsmNodePairSet {
private long[] n1a;
private long[] n2a;
private int tempNodes = 0;
private int maxTempNodes = 0;
private int npairs = 0;
private int freezecount = 0;
public OsmNodePairSet(int maxTempNodeCount) {
maxTempNodes = maxTempNodeCount;
n1a = new long[maxTempNodes];
n2a = new long[maxTempNodes];
}
private static final class OsmNodePair {
public long node2;
public OsmNodePair next;
}
private CompactLongMap<OsmNodePair> map;
public void addTempPair(long n1, long n2) {
if (tempNodes < maxTempNodes) {
n1a[tempNodes] = n1;
n2a[tempNodes] = n2;
tempNodes++;
}
}
public void freezeTempPairs() {
freezecount++;
for (int i = 0; i < tempNodes; i++) {
addPair(n1a[i], n2a[i]);
}
tempNodes = 0;
}
public void clearTempPairs() {
tempNodes = 0;
}
private void addPair(long n1, long n2) {
if (map == null) {
map = new CompactLongMap<>();
}
npairs++;
OsmNodePair e = getElement(n1, n2);
if (e == null) {
e = new OsmNodePair();
e.node2 = n2;
OsmNodePair e0 = map.get(n1);
if (e0 != null) {
while (e0.next != null) {
e0 = e0.next;
}
e0.next = e;
} else {
map.fastPut(n1, e);
}
}
}
public int size() {
return npairs;
}
public int tempSize() {
return tempNodes;
}
public int getMaxTmpNodes() {
return maxTempNodes;
}
public int getFreezeCount() {
return freezecount;
}
public boolean hasPair(long n1, long n2) {
return map != null && (getElement(n1, n2) != null || getElement(n2, n1) != null);
}
private OsmNodePair getElement(long n1, long n2) {
OsmNodePair e = map.get(n1);
while (e != null) {
if (e.node2 == n2) {
return e;
}
e = e.next;
}
return null;
}
}