protected List <Entry> Diff(MetaColumn[] mc, Column[] colA, long[] indexA, Column[] colB, long[] indexB)
        {
            int curA = 0;
            int curB = 0;
            int maxA = indexA.Length;
            int maxB = indexB.Length;

            Expression[] expressions = new Expression[mc.Length];
            for (int i = 0; i < mc.Length; ++i)
            {
                expressions[i] = ColumnCreator.CreateTypedExpressionColumn(mc[i].Type.scriptingType, colB[i]);
            }

            List <Entry> entries = new List <Entry>();

            while (curA < maxA && curB < maxB)
            {
                int r = MultiColumnElementCompare(colA, indexA[curA], indexB[curB], expressions);
                switch (r)
                {
                case -1:
                    if (IsResultFilter(DiffResult.Deleted))
                    {
                        entries.Add(new Entry(DiffResult.Deleted, 0, indexA[curA]));
                    }

                    ++curA;
                    break;

                case 0:
                    if (IsResultFilter(DiffResult.Same))
                    {
                        entries.Add(new Entry(DiffResult.Same, 0, indexA[curA]));
                    }
                    ++curA;
                    ++curB;
                    break;

                case 1:

                    if (IsResultFilter(DiffResult.New))
                    {
                        entries.Add(new Entry(DiffResult.New, 1, indexB[curB]));
                    }
                    ++curB;
                    break;

                default:
                    throw new Exception("Bad compare result");
                }
            }

            if (IsResultFilter(DiffResult.Deleted))
            {
                while (curA < maxA)
                {
                    // trailing deleted entries
                    entries.Add(new Entry(DiffResult.Deleted, 0, curA));
                    ++curA;
                }
            }
            else
            {
                UnityEngine.Debug.Log("ignored entry");
            }
            if (IsResultFilter(DiffResult.New))
            {
                while (curB < maxB)
                {
                    // trailing new entries
                    entries.Add(new Entry(DiffResult.New, 1, curB));
                    ++curB;
                }
            }
            else
            {
                UnityEngine.Debug.Log("ignored entry");
            }
            return(entries);
        }
Пример #2
0
        protected System.Collections.Generic.List <Entry> Diff(MetaColumn mc, Column colA, long[] indexA, Column colB, long[] indexB)
        {
            int curA = 0;
            int curB = 0;
            int maxA = indexA.Length;
            int maxB = indexB.Length;
            var exp  = ColumnCreator.CreateTypedExpressionColumn(mc.Type, colB);

            System.Collections.Generic.List <Entry> entries = new System.Collections.Generic.List <Entry>();
            while (curA < maxA && curB < maxB)
            {
                int r = colA.Compare(indexA[curA], exp, indexB[curB]);
                switch (r)
                {
                case -1:
                    if (IsResultFilter(DiffResult.Deleted))
                    {
                        entries.Add(new Entry(DiffResult.Deleted, 0, indexA[curA]));
                    }

                    ++curA;
                    break;

                case 0:
                    if (IsResultFilter(DiffResult.Same))
                    {
                        entries.Add(new Entry(DiffResult.Same, 0, indexA[curA]));
                    }
                    ++curA;
                    ++curB;
                    break;

                case 1:

                    if (IsResultFilter(DiffResult.New))
                    {
                        entries.Add(new Entry(DiffResult.New, 1, indexB[curB]));
                    }
                    ++curB;
                    break;

                default:
                    throw new Exception("Bad compare result");
                }
            }

            if (IsResultFilter(DiffResult.Deleted))
            {
                while (curA < maxA)
                {
                    // trailing deleted entries
                    entries.Add(new Entry(DiffResult.Deleted, 0, curA));
                    ++curA;
                }
            }
            else
            {
                UnityEngine.Debug.Log("ignored entry");
            }
            if (IsResultFilter(DiffResult.New))
            {
                while (curB < maxB)
                {
                    // trailing new entries
                    entries.Add(new Entry(DiffResult.New, 1, curB));
                    ++curB;
                }
            }
            else
            {
                UnityEngine.Debug.Log("ignored entry");
            }
            return(entries);
        }