Esempio n. 1
0
 public TwoItemsTree(OneItemLeaf leftItem, OneItemLeaf rightItem, INode left, INode middle, INode right)
     : base(leftItem, rightItem)
 {
     Left   = left;
     Middle = middle;
     Right  = right;
 }
Esempio n. 2
0
 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));
     }
 }
Esempio n. 3
0
 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));
 }
Esempio n. 4
0
 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));
     }
 }
Esempio n. 5
0
 public TwoItemsLeaf(OneItemLeaf leftItem, OneItemLeaf rightItem)
 {
     LeftItem  = leftItem;
     RightItem = rightItem;
 }
Esempio n. 6
0
 public OneItemTree(OneItemLeaf item, INode left, INode right)
 {
     Item  = item;
     Left  = left;
     Right = right;
 }
Esempio n. 7
0
 public INode AddOrUpdate(OneItemLeaf item)
 {
     return(item.Hash > Hash ? new TwoItemsLeaf(this, item) : new TwoItemsLeaf(item, this));
 }