/* * Licensed to GraphHopper GmbH under one or more contributor * license agreements. See the NOTICE file distributed with this work for * additional information regarding copyright ownership. * * GraphHopper GmbH licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.graphhopper.reader.gtfs; import com.graphhopper.storage.Graph; import com.graphhopper.util.EdgeIteratorState; import java.util.Iterator; class Label { static class Transition { final Label label; final EdgeLabel edge; Transition(Label label, EdgeLabel edge) { this.label = label; this.edge = edge; } @Override public String toString() { return (edge != null ? edge.toString() + " -> " : "") + label.adjNode; } } static class EdgeLabel { final EdgeIteratorState edgeIteratorState; final GtfsStorage.EdgeType edgeType; final int timeZoneId; final int nTransfers; final double distance; public EdgeLabel(EdgeIteratorState edgeIteratorState, GtfsStorage.EdgeType edgeType, int timeZoneId, int nTransfers, double distance) { this.edgeIteratorState = edgeIteratorState; this.edgeType = edgeType; this.timeZoneId = timeZoneId; this.nTransfers = nTransfers; this.distance = distance; } @Override public String toString() { return edgeType.toString(); } } final long currentTime; final int edge; final int adjNode; final int nTransfers; final int nWalkDistanceConstraintViolations; final double walkDistanceOnCurrentLeg; final long firstPtDepartureTime; final Label parent; Label(long currentTime, int edgeId, int adjNode, int nTransfers, int nWalkDistanceConstraintViolations, double walkDistance, long firstPtDepartureTime, Label parent) { this.currentTime = currentTime; this.edge = edgeId; this.adjNode = adjNode; this.nTransfers = nTransfers; this.nWalkDistanceConstraintViolations = nWalkDistanceConstraintViolations; this.walkDistanceOnCurrentLeg = walkDistance; this.firstPtDepartureTime = firstPtDepartureTime; this.parent = parent; } @Override public String toString() { return adjNode + " (" + edge + ") time: " + currentTime; } static Iterable<Transition> reverseEdges(Label leaf, Graph graph, PtFlagEncoder flagEncoder, boolean reverseEdgeFlags) { return new Iterable<Transition>() { @Override public Iterator<Transition> iterator() { return new Iterator<Transition>() { int i = 0; Label label = leaf; @Override public boolean hasNext() { return reverseEdgeFlags ? label != null : label.parent != null; } @Override public Transition next() { if (i==0 && !reverseEdgeFlags) { ++i; return new Transition(label, null); } else { EdgeIteratorState edgeIteratorState = label.parent == null ? null : graph.getEdgeIteratorState(label.edge, label.parent.adjNode).detach(reverseEdgeFlags); Transition transition; if (reverseEdgeFlags) { transition = new Transition(label, edgeIteratorState != null ? getEdgeLabel(edgeIteratorState, flagEncoder) : null); } else { transition = new Transition(label.parent, edgeIteratorState != null ? getEdgeLabel(edgeIteratorState, flagEncoder) : null); } label = label.parent; return transition; } } }; } }; } private static EdgeLabel getEdgeLabel(EdgeIteratorState edgeIteratorState, PtFlagEncoder flagEncoder) { return new EdgeLabel(edgeIteratorState, flagEncoder.getEdgeType(edgeIteratorState.getFlags()), flagEncoder.getValidityId(edgeIteratorState.getFlags()), flagEncoder.getTransfers(edgeIteratorState.getFlags()), edgeIteratorState.getDistance()); } }