+
+void Compare::Impl::furthestDpathKdiagonal(int D, int k,
+ DocRangePair const & rp, Direction direction)
+{
+ compl_vector<DocIterator> & op = direction == Forward ? ofp : orp;
+ compl_vector<DocIterator> & np = direction == Forward ? nfp : nrp;
+ compl_vector<DocIterator> & os = direction == Forward ? ofs : ors;
+ compl_vector<DocIterator> & ns = direction == Forward ? nfs : nrs;
+
+ // A vertical step means stepping one character in the new document.
+ bool vertical_step = k == -D;
+ if (!vertical_step && k != D) {
+ vertical_step = direction == Forward
+ ? op[k - 1] < op[k + 1] : op[k - 1] > op[k + 1];
+ }
+
+ // Where do we take the step from ?
+ int const kk = vertical_step ? k + 1 : k - 1;
+ DocPair p(op[kk], np[kk]);
+ DocPair const s(os[kk], ns[kk]);
+
+ // If D==0 we simulate a vertical step from (0,-1) by doing nothing.
+ if (D != 0) {
+ // Take a step
+ if (vertical_step && direction == Forward)
+ step(p.n, rp.n.to, direction);
+ else if (vertical_step && direction == Backward)
+ step(p.n, rp.n.from, direction);
+ else if (!vertical_step && direction == Forward)
+ step(p.o, rp.o.to, direction);
+ else if (!vertical_step && direction == Backward)
+ step(p.o, rp.o.from, direction);
+ }
+
+ // Traverse snake
+ if (traverseSnake(p, rp, direction)) {
+ // Record last snake
+ os[k] = p.o;
+ ns[k] = p.n;
+ } else {
+ // Copy last snake from the previous step
+ os[k] = s.o;
+ ns[k] = s.n;
+ }
+
+ //Record new position
+ op[k] = p.o;
+ np[k] = p.n;
+}
+
+
+bool Compare::Impl::overlap(int k, int D)
+{
+ // To generalize for the forward and reverse checks
+ int kk = offset_reverse_diagonal_ - k;
+
+ // Can we have overlap ?
+ if (kk <= D && kk >= -D) {
+ // Do we have overlap ?
+ if (odd_offset_)
+ return ofp[k] >= orp[kk] && nfp[k] >= nrp[kk];
+ else
+ return ofp[kk] >= orp[k] && nfp[kk] >= nrp[k];
+ }
+ return false;
+}
+
+
+Compare::Impl::SnakeResult Compare::Impl::retrieveMiddleSnake(
+ int k, int D, Direction direction, DocPair & middle_snake)
+{
+ compl_vector<DocIterator> & os = direction == Forward ? ofs : ors;
+ compl_vector<DocIterator> & ns = direction == Forward ? nfs : nrs;
+ compl_vector<DocIterator> & os_r = direction == Forward ? ors : ofs;
+ compl_vector<DocIterator> & ns_r = direction == Forward ? nrs : nfs;
+
+ // The diagonal while doing the backward search
+ int kk = -k + offset_reverse_diagonal_;
+
+ // Did we find a snake ?
+ if (os[k].empty() && os_r[kk].empty()) {
+ // No, there is no snake at all, in which case
+ // the length of the shortest edit script is M+N.
+ LATTEST(2 * D - odd_offset_ == m_ + n_);
+ return NoSnake;
+ }
+
+ if (os[k].empty()) {
+ // Yes, but there is only 1 snake and we found it in the
+ // reverse path.
+ middle_snake.o = os_r[kk];
+ middle_snake.n = ns_r[kk];
+ return SingleSnake;
+ }
+
+ middle_snake.o = os[k];
+ middle_snake.n = ns[k];
+ return NormalSnake;
+}
+
+
+int Compare::Impl::findMiddleSnake(DocRangePair const & rp,
+ DocPair & middle_snake)