Example #1
0
  /**
   * Finds the differences among three <code>IRangeComparator</code>s. In contrast to <code>
   * findDifferences</code>, the result contains <code>RangeDifference</code> elements for
   * non-differing ranges too. If the ancestor range comparator is <code>null</code>, a two-way
   * comparison is performed.
   *
   * @param pm if not <code>null</code> used to report progress
   * @param ancestor the ancestor range comparator or <code>null</code>
   * @param left the left range comparator
   * @param right the right range comparator
   * @return an array of range differences
   * @since 2.0
   */
  public static RangeDifference[] findRanges(
      IProgressMonitor pm,
      LCSSettings settings,
      IRangeComparator ancestor,
      IRangeComparator left,
      IRangeComparator right) {

    if (ancestor == null) return findRanges(pm, settings, left, right);

    RangeDifference[] in = findDifferences(pm, settings, ancestor, left, right);
    List out = new ArrayList();

    RangeDifference rd;

    int mstart = 0;
    int ystart = 0;
    int astart = 0;

    for (int i = 0; i < in.length; i++) {
      RangeDifference es = in[i];

      rd =
          new RangeDifference(
              RangeDifference.NOCHANGE,
              mstart,
              es.rightStart() - mstart,
              ystart,
              es.leftStart() - ystart,
              astart,
              es.ancestorStart() - astart);
      if (rd.maxLength() > 0) out.add(rd);

      out.add(es);

      mstart = es.rightEnd();
      ystart = es.leftEnd();
      astart = es.ancestorEnd();
    }
    rd =
        new RangeDifference(
            RangeDifference.NOCHANGE,
            mstart,
            right.getRangeCount() - mstart,
            ystart,
            left.getRangeCount() - ystart,
            astart,
            ancestor.getRangeCount() - astart);
    if (rd.maxLength() > 0) out.add(rd);

    return (RangeDifference[]) out.toArray(EMPTY_RESULT);
  }
Example #2
0
 /*
  * Tests if two ranges are equal
  */
 private static boolean rangesEqual(IRangeComparator a, int ai, IRangeComparator b, int bi) {
   return a.rangesEqual(ai, b, bi);
 }