private void ProcessConflicts(List <IDiffItem> ret, List <IDiffOrderedCollectionItem> left, List <IDiffOrderedCollectionItem> right, IConflictContainer conflicts) { List <IDiffOrderedCollectionItem> addedLeft; List <IDiffOrderedCollectionItem> addedRight; IDiffOrderedCollectionItem otherLeft; IDiffOrderedCollectionItem otherRight; this.SepareAdditions(left, out addedLeft, out otherLeft); this.SepareAdditions(right, out addedRight, out otherRight); if (addedRight != null && addedLeft != null) { if (addedLeft.Count == addedRight.Count && addedLeft.Zip(addedRight, (a, b) => a.IsSame(b)).All(x => x)) { ret.AddRange(addedLeft); } else { DiffAnyConflicted conflict = new DiffAnyConflicted(addedLeft, addedRight); ret.Add(conflict); conflicts.RegisterConflict(conflict); } } else if (addedLeft != null) { ret.AddRange(addedLeft); } else if (addedRight != null) { ret.AddRange(addedRight); } if (otherLeft != null && otherRight != null) { ret.Add(this.ProcessConflict(otherLeft, otherRight, conflicts)); } else if (otherLeft != null) { ret.Add(otherLeft); } else if (otherRight != null) { ret.Add(otherRight); } }
private IDiffItem ProcessConflict(IDiffOrderedCollectionItem left, IDiffOrderedCollectionItem right, IConflictContainer conflicts) { if (left is IDiffItemChanged && right is IDiffItemChanged) { IDiff <TItemType> diff = this.aMergeItemsDiffs.MergeDiffs( ((IDiffItemChanged <TItemType>)left).ValueDiff, ((IDiffItemChanged <TItemType>)right).ValueDiff, conflicts ); return(new DiffOrderedCollectionChanged <TItemType>(left.ItemIndex, diff)); } else if (left.IsSame(right)) { return(left); } DiffAnyConflicted conflict = new DiffAnyConflicted(left, right); conflicts.RegisterConflict(conflict); return(conflict); }
private void ProcessConflict(TIdType id, IDiffUnorderedCollectionItem leftItem, IDiffUnorderedCollectionItem rightItem, List <IDiffItem> ret, IConflictContainer conflicts) { if (leftItem is IDiffItemAdded && rightItem is IDiffItemAdded && leftItem.IsSame(rightItem)) { ret.Add(leftItem); } else if (leftItem is IDiffItemRemoved && rightItem is IDiffItemRemoved) { ret.Add(leftItem); } else if (leftItem is IDiffItemChanged && rightItem is IDiffItemChanged) { IDiff <TItemType> diffLeft = ((IDiffItemChanged <TItemType>)leftItem).ValueDiff; IDiff <TItemType> diffRight = ((IDiffItemChanged <TItemType>)rightItem).ValueDiff; IDiff <TItemType> result = this.aMergeItemsDiffs.MergeDiffs(diffLeft, diffRight, conflicts); ret.Add(new DiffUnorderedCollectionChanged <TIdType, TItemType>(id, result)); } else if (leftItem is IDiffItemReplaced && rightItem is IDiffItemReplaced && leftItem.IsSame(rightItem)) { ret.Add(leftItem); } else if (leftItem is IDiffItemUnchanged) { ret.Add(rightItem); } else if (rightItem is IDiffItemUnchanged) { ret.Add(leftItem); } else { DiffAnyConflicted conflict = new DiffAnyConflicted(leftItem, rightItem); ret.Add(conflict); conflicts.RegisterConflict(conflict); } }