/** * 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); }
/* * Tests if two ranges are equal */ private static boolean rangesEqual(IRangeComparator a, int ai, IRangeComparator b, int bi) { return a.rangesEqual(ai, b, bi); }