// License: Public Domain. For details, see LICENSE file. package livegps; import java.util.Collection; import org.openstreetmap.josm.data.Bounds; import org.openstreetmap.josm.data.gpx.GpxTrackSegment; import org.openstreetmap.josm.data.gpx.WayPoint; import org.openstreetmap.josm.tools.CopyList; /** * Thread safe implementation of GpxTrackSegement * */ public class AppendableGpxTrackSegment implements GpxTrackSegment { private WayPoint[] wayPoints = new WayPoint[16]; private int size; private Bounds bounds; private double length; @Override public Bounds getBounds() { return bounds; } @Override public Collection<WayPoint> getWayPoints() { return new CopyList<>(wayPoints, size); } public void addWaypoint(WayPoint p) { if (wayPoints.length == size) { WayPoint[] newWaypoints = new WayPoint[wayPoints.length * 2]; System.arraycopy(wayPoints, 0, newWaypoints, 0, wayPoints.length); wayPoints = newWaypoints; } if (size > 0) { Double distance = wayPoints[size - 1].getCoor().greatCircleDistance(p.getCoor()); if (!distance.isNaN() && !distance.isInfinite()) { length += distance; } } if (bounds == null) { bounds = new Bounds(p.getCoor()); } else { bounds.extend(p.getCoor()); } wayPoints[size] = p; size++; } @Override public double length() { return length; } @Override public int getUpdateCount() { return size; } }