Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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;
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }