aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/google/go-cmp/cmp/internal/diff
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-07-04 10:48:17 +0200
committerDmitry Vyukov <dvyukov@google.com>2020-07-04 15:05:30 +0200
commit9573094ce235bd9afe88f5da27a47dd6bcc1e13b (patch)
treeff0e40aa5878957682a9dce7f073ead1a3f0b4a9 /vendor/github.com/google/go-cmp/cmp/internal/diff
parentdcff124efb2ea4a834b74ac0974aa2f2fd000b40 (diff)
go.mod: upgrade some dependencies
Since we started using modules, it's a good time to update some deps. Update to latest official versions packages that have newer versions. Update #1247
Diffstat (limited to 'vendor/github.com/google/go-cmp/cmp/internal/diff')
-rw-r--r--vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go22
1 files changed, 21 insertions, 1 deletions
diff --git a/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go b/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go
index 3d2e42662..730e223ee 100644
--- a/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go
+++ b/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go
@@ -12,6 +12,13 @@
// is more important than obtaining a minimal Levenshtein distance.
package diff
+import (
+ "math/rand"
+ "time"
+
+ "github.com/google/go-cmp/cmp/internal/flags"
+)
+
// EditType represents a single operation within an edit-script.
type EditType uint8
@@ -112,6 +119,8 @@ func (r Result) Similar() bool {
return r.NumSame+1 >= r.NumDiff
}
+var randInt = rand.New(rand.NewSource(time.Now().Unix())).Intn(2)
+
// Difference reports whether two lists of lengths nx and ny are equal
// given the definition of equality provided as f.
//
@@ -159,6 +168,17 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) {
// A vertical edge is equivalent to inserting a symbol from list Y.
// A diagonal edge is equivalent to a matching symbol between both X and Y.
+ // To ensure flexibility in changing the algorithm in the future,
+ // introduce some degree of deliberate instability.
+ // This is achieved by fiddling the zigzag iterator to start searching
+ // the graph starting from the bottom-right versus than the top-left.
+ // The result may differ depending on the starting search location,
+ // but still produces a valid edit script.
+ zigzagInit := randInt // either 0 or 1
+ if flags.Deterministic {
+ zigzagInit = 0
+ }
+
// Invariants:
// • 0 ≤ fwdPath.X ≤ (fwdFrontier.X, revFrontier.X) ≤ revPath.X ≤ nx
// • 0 ≤ fwdPath.Y ≤ (fwdFrontier.Y, revFrontier.Y) ≤ revPath.Y ≤ ny
@@ -209,7 +229,7 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) {
if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 {
break
}
- for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ {
+ for stop1, stop2, i := false, false, zigzagInit; !(stop1 && stop2) && searchBudget > 0; i++ {
// Search in a diagonal pattern for a match.
z := zigzag(i)
p := point{fwdFrontier.X + z, fwdFrontier.Y - z}