content: /**
   * Container for link between two Osm nodes
   *
   * @author ab
   */
  package btools.mapaccess;
  
  
  public class OsmLink {
    /**
     * The description bitmap contains the waytags (valid for both directions)
     */
    public byte[] descriptionBitmap;
  
    /**
     * The geometry contains intermediate nodes, null for none (valid for both directions)
     */
    public byte[] geometry;
  
    // a link logically knows only its target, but for the reverse link, source and target are swapped
    protected OsmNode n1;
    protected OsmNode n2;
  
    // same for the next-link-for-node pointer: previous applies to the reverse link
    protected OsmLink previous;
    protected OsmLink next;
  
    private OsmLinkHolder reverselinkholder = null;
    private OsmLinkHolder firstlinkholder = null;
  
    protected OsmLink() {
    }
  
    public OsmLink(OsmNode source, OsmNode target) {
      n1 = source;
      n2 = target;
    }
  
    /**
     * Get the relevant target-node for the given source
     */
    public final OsmNode getTarget(OsmNode source) {
      return n2 != source && n2 != null ? n2 : n1;
      /* if ( n2 != null && n2 != source )
      {
        return n2;
      }
      else if ( n1 != null && n1 != source )
      {
        return n1;
      }
      else
      {    
        new Throwable( "ups" ).printStackTrace();
        throw new IllegalArgumentException( "internal error: getTarget: unknown source; " + source + " n1=" + n1 + " n2=" + n2 );
      } */
    }
  
    /**
     * Get the relevant next-pointer for the given source
     */
    public final OsmLink getNext(OsmNode source) {
      return n2 != source && n2 != null ? next : previous;
      /* if ( n2 != null && n2 != source )
      {
        return next;
      }
      else if ( n1 != null && n1 != source )
      {
        return previous;
      }
      else
      {
        throw new IllegalArgumentException( "internal error: gextNext: unknown source" );
      } */
    }
  
    /**
     * Reset this link for the given direction
     */
    protected final OsmLink clear(OsmNode source) {
      OsmLink n;
      if (n2 != null && n2 != source) {
        n = next;
        next = null;
        n2 = null;
        firstlinkholder = null;
      } else if (n1 != null && n1 != source) {
        n = previous;
        previous = null;
        n1 = null;
        reverselinkholder = null;
      } else {
        throw new IllegalArgumentException("internal error: setNext: unknown source");
      }
      if (n1 == null && n2 == null) {
        descriptionBitmap = null;
        geometry = null;
      }
      return n;
    }
  
    public final void setFirstLinkHolder(OsmLinkHolder holder, OsmNode source) {
      if (n2 != null && n2 != source) {
        firstlinkholder = holder;
      } else if (n1 != null && n1 != source) {
        reverselinkholder = holder;
      } else {
        throw new IllegalArgumentException("internal error: setFirstLinkHolder: unknown source");
      }
    }
  
    public final OsmLinkHolder getFirstLinkHolder(OsmNode source) {
      if (n2 != null && n2 != source) {
        return firstlinkholder;
      } else if (n1 != null && n1 != source) {
        return reverselinkholder;
      } else {
        throw new IllegalArgumentException("internal error: getFirstLinkHolder: unknown source");
      }
    }
  
    public final boolean isReverse(OsmNode source) {
      return n1 != source && n1 != null;
      /* if ( n2 != null && n2 != source )
      {
        return false;
      }
      else if ( n1 != null && n1 != source )
     {
        return true;
      }
      else
      {
        throw new IllegalArgumentException( "internal error: isReverse: unknown source" );
      } */
    }
  
    public final boolean isBidirectional() {
      return n1 != null && n2 != null;
    }
  
    public final boolean isLinkUnused() {
      return n1 == null && n2 == null;
    }
  
    public final void addLinkHolder(OsmLinkHolder holder, OsmNode source) {
      OsmLinkHolder firstHolder = getFirstLinkHolder(source);
      if (firstHolder != null) {
        holder.setNextForLink(firstHolder);
      }
      setFirstLinkHolder(holder, source);
    }
  
  }
  