LaneStructureRecord.java
package org.opentrafficsim.road.gtu.lane.perception;
import org.opentrafficsim.core.gtu.GTUType;
import org.opentrafficsim.core.network.NetworkException;
import org.opentrafficsim.core.network.Node;
import org.opentrafficsim.core.network.route.Route;
/**
* <p>
* Copyright (c) 2013-2020 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
* BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
* <p>
* @version $Revision$, $LastChangedDate$, by $Author$, initial version 13 aug. 2018 <br>
* @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
* @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
* @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
*/
public interface LaneStructureRecord extends LaneRecord<LaneStructureRecord>
{
/**
* Returns the the 'from' node of the link belonging to this lane, in the driving direction.
* @return Node; the 'from' node of the link belonging to this lane, in the driving direction
*/
Node getFromNode();
/**
* Returns the the 'to' node of the link belonging to this lane, in the driving direction.
* @return Node; the 'to' node of the link belonging to this lane, in the driving direction
*/
Node getToNode();
/**
* Returns the left LSR or null if not available. Left and right are relative to the <b>driving</b> direction.
* @return LaneStructureRecord; the left LSR or null if not available
*/
LaneStructureRecord getLeft();
/**
* Returns the right LSR or null if not available. Left and right are relative to the <b>driving</b> direction.
* @return LaneStructureRecord; the right LSR or null if not available
*/
LaneStructureRecord getRight();
/**
* Returns whether a left lane change is legal.
* @return whether a left lane change is legal
*/
boolean legalLeft();
/**
* Returns whether a right lane change is legal.
* @return whether a right lane change is legal
*/
boolean legalRight();
/**
* Returns whether a left lane change is physically possible.
* @return whether a left lane change is physically possible
*/
boolean physicalLeft();
/**
* Returns whether a right lane change is physically possible.
* @return whether a right lane change is physically possible
*/
boolean physicalRight();
/**
* Returns the left lane change possibility.
* @param legal boolean; legal, or otherwise physical, possibility
* @return boolean; left lane change possibility
*/
default boolean possibleLeft(final boolean legal)
{
return legal ? legalLeft() : physicalLeft();
}
/**
* Returns the right lane change possibility.
* @param legal boolean; legal, or otherwise physical, possibility
* @return boolean; right lane change possibility
*/
default boolean possibleRight(final boolean legal)
{
return legal ? legalRight() : physicalRight();
}
/**
* Returns whether this lane has no next records as the lane structure was cut-off.
* @return whether this lane has no next records as the lane structure was cut-off
*/
boolean isCutOffEnd();
/**
* Returns whether this lane has no previous records as the lane structure was cut-off.
* @return whether this lane has no previous records as the lane structure was cut-off
*/
boolean isCutOffStart();
/**
* Returns whether the record forms a dead-end.
* @return whether the record forms a dead-end
*/
boolean isDeadEnd();
/**
* Returns whether this lane allows the route to be followed.
* @param route Route; the route to follow
* @param gtuType GTUType; gtu type
* @return whether this lane allows the route to be followed
* @throws NetworkException if no destination node
*/
boolean allowsRoute(Route route, GTUType gtuType) throws NetworkException;
/**
* Returns whether the end of this lane allows the route to be followed.
* @param route Route; the route to follow
* @param gtuType GTUType; gtu type
* @return whether the end of this lane allows the route to be followed
* @throws NetworkException if no destination node
*/
boolean allowsRouteAtEnd(Route route, GTUType gtuType) throws NetworkException;
}