Example #1
0
        public static void Join(Event e1, Event e2)
        {
            if (!e1.IsLeaf
                && !e2.IsLeaf
                && e1.Value > e2.Value)
            {
                Join(e2, e1);
                e1.Copy(e2);
                e1.Normalize();
                return;
            }

            if (!e1.IsLeaf
                && !e2.IsLeaf
                && e1.Value <= e2.Value)
            {
                var d = e2.Value - e1.Value;
                e2.Left.Lift(d);
                e2.Right.Lift(d);
                Join(e1.Left, e2.Left);
                Join(e1.Right, e2.Right);
                e1.Normalize();
                return;
            }

            if (e1.IsLeaf
                && !e2.IsLeaf)
            {
                e1.SetAsNode();
                Join(e1, e2);
                e1.Normalize();
                return;
            }

            if (!e1.IsLeaf
                && e2.IsLeaf)
            {
                e2.SetAsNode();
                Join(e1, e2);
                e1.Normalize();
                return;
            }

            if (e1.IsLeaf
                && e2.IsLeaf)
            {
                e1.Value = GetMaxValue(e1, e2);
                e1.Normalize();
                return;
            }

            throw new EventOperationException("Event Join failed", e1, e2);
        }