All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opentripplanner.street.model.StreetTraversalPermission Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.street.model;

import org.opentripplanner.street.search.TraverseMode;
import org.opentripplanner.street.search.TraverseModeSet;

/**
 * Who can traverse a street in a single direction.
 */
public enum StreetTraversalPermission {
  NONE(0),
  PEDESTRIAN(1),
  BICYCLE(2),
  PEDESTRIAN_AND_BICYCLE(2 | 1),
  CAR(4),
  PEDESTRIAN_AND_CAR(4 | 1),
  BICYCLE_AND_CAR(4 | 2),
  ALL(4 | 2 | 1);

  private static final StreetTraversalPermission[] lookup = new StreetTraversalPermission[StreetTraversalPermission.values()
    .length];
  public final int code;

  static {
    for (StreetTraversalPermission s : StreetTraversalPermission.values()) {
      lookup[s.code] = s;
    }
  }

  StreetTraversalPermission(int code) {
    this.code = code;
  }

  public static StreetTraversalPermission get(int code) {
    return lookup[code];
  }

  public StreetTraversalPermission add(StreetTraversalPermission perm) {
    return get(this.code | perm.code);
  }

  /**
   * Returns intersection of allowed permissions between current permissions and given permissions
   */
  public StreetTraversalPermission intersection(StreetTraversalPermission perm) {
    return get(this.code & perm.code);
  }

  public StreetTraversalPermission remove(StreetTraversalPermission perm) {
    return get(this.code & ~perm.code);
  }

  public StreetTraversalPermission modify(boolean permissive, StreetTraversalPermission perm) {
    return permissive ? add(perm) : remove(perm);
  }

  public boolean allows(StreetTraversalPermission perm) {
    return (code & perm.code) != 0;
  }

  /**
   * Returns true if any of the specified modes are allowed to use this street.
   */
  public boolean allows(TraverseModeSet modes) {
    if (modes.getWalk() && allows(StreetTraversalPermission.PEDESTRIAN)) {
      return true;
    } else if (modes.getBicycle() && allows(StreetTraversalPermission.BICYCLE)) {
      return true;
    } else return modes.getCar() && allows(StreetTraversalPermission.CAR);
  }

  /**
   * Returns true if the given mode is allowed to use this street.
   */
  public boolean allows(TraverseMode mode) {
    if (mode == TraverseMode.WALK && allows(StreetTraversalPermission.PEDESTRIAN)) {
      return true;
    } else if (mode.isCyclingIsh() && allows(StreetTraversalPermission.BICYCLE)) {
      return true;
    } else return mode == TraverseMode.CAR && allows(StreetTraversalPermission.CAR);
  }

  /**
   * Returns true if there are any modes allowed by this permission.
   */
  public boolean allowsAnything() {
    return !this.allowsNothing();
  }

  /**
   * Returns true if this permission allows nothing to traverse
   */
  public boolean allowsNothing() {
    return this == StreetTraversalPermission.NONE;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy