// Copyright 2022 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/debug/liveedit-diff.h" #include <cmath> #include <map> #include <optional> #include <vector> #include "src/base/logging.h" namespace v8 { namespace internal { namespace { // Implements Myer's Algorithm from // "An O(ND) Difference Algorithm and Its Variations", particularly the // linear space refinement mentioned in section 4b. // // The differ is input agnostic. // // The algorithm works by finding the shortest edit string (SES) in the edit // graph. The SES describes how to get from a string A of length N to a string // B of length M via deleting from A and inserting from B. // // Example: A = "abbaa", B = "abab" // // A // // a b b a a // o---o---o---o---o---o // a | \ | | | \ | \ | // o---o---o---o---o---o // b | | \ | \ | | | // B o---o---o---o---o---o // a | \ | | | \ | \ | // o---o---o---o---o---o // b | | \ | \ | | | // o---o---o---o---o---o // // The edit graph is constructed with the characters from string A on the x-axis // and the characters from string B on the y-axis. Starting from (0, 0) we can: // // - Move right, which is equivalent to deleting from A // - Move downwards, which is equivalent to inserting from B // - Move diagonally if the characters from string A and B match, which // means no insertion or deletion. // // Any path from (0, 0) to (N, M) describes a valid edit string, but we try to // find the path with the most diagonals, conversely that is the path with the // least insertions or deletions. // Note that a path with "D" insertions/deletions is called a D-path. class MyersDiffer { … }; } // namespace void Comparator::CalculateDifference(Comparator::Input* input, Comparator::Output* result_writer) { … } } // namespace internal } // namespace v8