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); }
protected static void StampFill(Id i, Event e) { if (i.IsLeaf && i.Value == 0) { return; } if (i.IsLeaf && i.Value == 1) { e.Height(); return; } if (e.IsLeaf) { return; } if (i.IsLeaf == false && i.Left.IsLeaf && i.Left.Value == 1) { StampFill(i.Right, e.Right); e.Left.Height(); e.Left.SetMaxValue(e.Left, e.Right); e.Normalize(); return; } if (i.IsLeaf == false && i.Right.IsLeaf && i.Right.Value == 1) { StampFill(i.Left, e.Left); e.Right.Height(); e.Right.SetMaxValue(e.Right, e.Left); e.Normalize(); return; } if (i.IsLeaf == false) { StampFill(i.Left, e.Left); StampFill(i.Right, e.Right); e.Normalize(); return; } throw new StampOperationException(string.Format("Fill failed: id: {0}, event: {1}", i, e)); }