public static CompoundDiff IdDiff(TagList a, TagList b) { CompoundDiff diff = new CompoundDiff(); for (int i = 0; i < a.Count; i++) { object id = Id.GetId(a[i]); DiffOperation op = DiffValue(a[i], Id.FindObjectWithId(b, id)); if (op != null) { diff.Operations[id] = op; } } for (int i = 0; i < b.Count; i++) { object id = Id.GetId(b[i]); object aObject = Id.FindObjectWithId(a, id); if (aObject != null) { diff.Operations[id] = new ChangeOperation(b[i]); } } return(diff); }
public static CompoundDiff Diff(TagCompound first, TagCompound second) { CompoundDiff diff = new CompoundDiff(); foreach (var kv in first) { Tag firstValue = kv.Value; Tag secondValue = second.ContainsKey(kv.Key) ? second[kv.Key] : null; DiffOperation op = DiffValue(firstValue, secondValue); if (op != null) { diff.Operations[kv.Key] = op; } } foreach (var kv in second) { if (!first.ContainsKey(kv.Key)) { diff.Operations[kv.Key] = new ChangeOperation(kv.Value); } } return(diff); }
public static ListDiff Merge(ListDiff left, ListDiff right) { List <int> keys = left.Operations.Keys.ToList <int>(); foreach (var kv in right.Operations) { if (!left.Operations.ContainsKey(kv.Key)) { keys.Add(kv.Key); } } ListDiff diff = new ListDiff(); foreach (int key in keys) { if (left.Operations.ContainsKey(key) && right.Operations.ContainsKey(key)) { diff.Operations[key] = DiffOperation.Merge(left.Operations[key], right.Operations[key]); } else if (left.Operations.ContainsKey(key)) { diff.Operations[key] = left.Operations[key]; } else if (right.Operations.ContainsKey(key)) { diff.Operations[key] = right.Operations[key]; } } return(diff); }
public static CompoundDiff Merge(CompoundDiff left, CompoundDiff right) { // Find combined key list List <object> keys = left.Operations.Keys.ToList <object>(); foreach (var kv in right.Operations) { if (!left.Operations.ContainsKey(kv.Key)) { keys.Add(kv.Key); } } // Merge the operations for each key. CompoundDiff diff = new CompoundDiff(); foreach (object key in keys) { if (left.Operations.ContainsKey(key) && right.Operations.ContainsKey(key)) { diff.Operations[key] = DiffOperation.Merge(left.Operations[key], right.Operations[key]); } else if (left.Operations.ContainsKey(key)) { diff.Operations[key] = left.Operations[key]; } else if (right.Operations.ContainsKey(key)) { diff.Operations[key] = right.Operations[key]; } } return(diff); }
public static DiffOperation Merge(DiffOperation left, DiffOperation right) { // Remove always trumps other operations if (right is RemoveOperation) return right; if (left is RemoveOperation) return left; // Change operation trumps other operations and right changes take precedent if (right is ChangeOperation) return right; if (left is ChangeOperation) return left; // Recurseively merge array and object ops Debug.Assert(left.GetType() == right.GetType()); if (left is ChangeObjectOperation) return ChangeObjectOperation.Merge(left as ChangeObjectOperation, right as ChangeObjectOperation); if (left is ChangePositionArrayOperation) return ChangePositionArrayOperation.Merge(left as ChangePositionArrayOperation, right as ChangePositionArrayOperation); if (left is ChangeIdArrayOperation) return ChangeIdArrayOperation.Merge(left as ChangeIdArrayOperation, right as ChangeIdArrayOperation); Debug.Assert(false); return null; }
public static ListDiff PositionDiff(TagList a, TagList b) { ListDiff diff = new ListDiff(); int n = Math.Max(a.Count, b.Count); for (int i = 0; i < n; i++) { Tag firstValue = (i >= a.Count) ? null : a[i]; Tag secondValue = (i >= b.Count) ? null : b[i]; DiffOperation op = DiffValue(firstValue, secondValue); if (op != null) { diff.Operations[i] = op; } } return(diff); }
static public DiffOperation Merge(DiffOperation left, DiffOperation right) { // Remove always trumps other operations if (right is RemoveOperation) { return(right); } if (left is RemoveOperation) { return(left); } // Change operation trumps other operations and right changes take precedent if (right is ChangeOperation) { return(right); } if (left is ChangeOperation) { return(left); } // Recurseively merge array and object ops Debug.Assert(left.GetType() == right.GetType()); if (left is ChangeObjectOperation) { return(ChangeObjectOperation.Merge(left as ChangeObjectOperation, right as ChangeObjectOperation)); } if (left is ChangePositionArrayOperation) { return(ChangePositionArrayOperation.Merge(left as ChangePositionArrayOperation, right as ChangePositionArrayOperation)); } if (left is ChangeIdArrayOperation) { return(ChangeIdArrayOperation.Merge(left as ChangeIdArrayOperation, right as ChangeIdArrayOperation)); } Debug.Assert(false); return(null); }