示例#1
0
        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);
        }
示例#2
0
        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;
            }
        }
示例#3
0
        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);
            }
        }