public static DiffChain ConstructBackwardDiffChain(FileSnapshot a, FileSnapshot next, int right) { DiffChain backward = new DiffChain(); backward.Start = right; backward.StartSnap = next; backward.EndSnap = a; backward.End = null; int?left = next.GetRightToLeft(right); // left is a's right if (left == null) { backward.Kind = DiffChainType.Null; return(backward); } //left++; // backward chaining drift? var aStatus = backward.RightFromLeftStatus(a, left.Value); var nextStatus = backward.SelfStatusFromRight(next, right); var chainType = backward.DetermineChainType(aStatus, nextStatus); backward.Kind = chainType; backward.End = left; return(backward); }
protected void Chain() { var a = m_snapshots.FirstOrDefault(); if (a == null) { return; } foreach (var next in m_snapshots.Skip(1)) { for (int right = 0; right < a.RightTextLines.Count; right++) { var forwardChain = DiffChain.ConstructForwardDiffChain(a, next, right); a.ForwardChains.Add(forwardChain); } for (int right = 0; right < next.RightTextLines.Count; right++) { var backChain = DiffChain.ConstructBackwardDiffChain(a, next, right); next.BackChains.Add(backChain); } a = next; } // Verify var prevRightSideCount = m_snapshots.First().RightTextLines.Count; var prevForwardChainCount = m_snapshots.First().ForwardChains.Count; a = m_snapshots.First(); foreach (var next in m_snapshots.Skip(1)) { //int backChainCount = next.BackChains.Where( chain => chain.Kind != DiffChainType.Null && chain.End != null ).Count(); //if (backChainCount != prevRightSideCount) //{ // throw new Exception("Invalid State: " + backChainCount + " != " + prevRightSideCount); //} //int count = next.Differences.Where( d => d.DifferenceType == DifferenceType.Add ).Select( d => d.Right.Length ).Sum(); //if (prevForwardChainCount != next.RightTextLines.Count - count ) //{ // throw new Exception("Invalid State: " + prevForwardChainCount + " != " + next.RightTextLines.Count); //} //a = next; //prevRightSideCount = next.RightTextLines.Count; //prevForwardChainCount = next.ForwardChains.Count; } }
public static DiffChain ConstructForwardDiffChain(FileSnapshot a, FileSnapshot next, int right) { try { var chain = new DiffChain() { }; var aStatus = chain.SelfStatusFromRight(a, right); var nextStatus = chain.LeftFromRightStatus(next, right); var chainType = chain.DetermineChainType(aStatus, nextStatus); chain.Kind = chainType; chain.Start = right; chain.End = next.GetLeftToRight(right); chain.StartSnap = a; chain.EndSnap = next; return(chain); } catch (Exception ex) { Trace.WriteLine(ex.Message); return(null); } }