public TwoItemsTree(OneItemLeaf leftItem, OneItemLeaf rightItem, INode left, INode middle, INode right) : base(leftItem, rightItem) { Left = left; Middle = middle; Right = right; }
public override INode AddOrUpdate(OneItemLeaf item) { if (item.Hash < LeftItem.Hash) { var newLeft = Left.AddOrUpdate(item); return(!IsEmerged(newLeft, Left) ? new TwoItemsTree(LeftItem, RightItem, newLeft, Middle, Right) : (INode) new OneItemTree(LeftItem, newLeft, new OneItemTree(RightItem, Middle, Right))); } // if (item.Hash == LeftItem.Hash) if (item.Hash < RightItem.Hash) { var newMiddle = Middle.AddOrUpdate(item); if (!IsEmerged(newMiddle, Middle)) { return(new TwoItemsTree(LeftItem, RightItem, Left, newMiddle, Right)); } var emergedMiddle = (OneItemTree)newMiddle; return(new OneItemTree(emergedMiddle.Item, new OneItemTree(LeftItem, Left, emergedMiddle.Right), new OneItemTree(RightItem, emergedMiddle.Left, Right))); } // for now skip if (item.Hash == RightItem.Hash) // else if (item.Hash > RightItem.Hash) { var newRight = Right.AddOrUpdate(item); return(!IsEmerged(newRight, Right) ? new TwoItemsTree(LeftItem, RightItem, Left, Middle, newRight) : (INode) new OneItemTree(RightItem, new OneItemTree(LeftItem, Left, Middle), newRight)); } }
public virtual INode AddOrUpdate(OneItemLeaf item) { if (item.Hash < LeftItem.Hash) { return(new OneItemTree(LeftItem, item, RightItem)); } // for now skip if (item.Hash == LeftItem.Hash) if (item.Hash < RightItem.Hash) { return(new OneItemTree(item, LeftItem, RightItem)); } // for now skip if (item.Hash == RightItem.Hash) // else if (item.Hash > RightItem.Hash) return(new OneItemTree(RightItem, LeftItem, item)); }
public INode AddOrUpdate(OneItemLeaf item) { if (item.Hash < Item.Hash) { var newLeft = Left.AddOrUpdate(item); if (!IsEmerged(newLeft, Left)) { return(new OneItemTree(Item, newLeft, Right)); } var emergedLeft = (OneItemTree)newLeft; return(new TwoItemsTree(emergedLeft.Item, Item, emergedLeft.Left, emergedLeft.Right, Right)); // otherwise just reattach new left } //else if (item.Hash > LeftItem.Hash) { var newRight = Right.AddOrUpdate(item); if (!IsEmerged(newRight, Right)) { return(new OneItemTree(Item, Left, newRight)); } var emergedRight = (OneItemTree)newRight; return(new TwoItemsTree(Item, emergedRight.Item, Left, emergedRight.Left, emergedRight.Right)); } }
public TwoItemsLeaf(OneItemLeaf leftItem, OneItemLeaf rightItem) { LeftItem = leftItem; RightItem = rightItem; }
public OneItemTree(OneItemLeaf item, INode left, INode right) { Item = item; Left = left; Right = right; }
public INode AddOrUpdate(OneItemLeaf item) { return(item.Hash > Hash ? new TwoItemsLeaf(this, item) : new TwoItemsLeaf(item, this)); }