internal override uint TakeFromRight(AListNode <int, T> sibling, int localsToMove, IAListTreeObserver <int, T> tob) { Debug.Assert(localsToMove <= sibling.LocalCount && LocalCount + localsToMove <= _maxNodeSize); var right = (SparseAListLeaf <T>)sibling; if (_isFrozen || right._isFrozen) { return(0); } uint spaceBeingMoved; int localStart = _list.Count; // Be greedy: when taking all items, we must also take empty space after them spaceBeingMoved = localsToMove == right._list.Count ? right.TotalCount : right._list[localsToMove].Offset; _list.AddRange(right._list.Slice(0, localsToMove)); right._list.RemoveRange(0, localsToMove); AdjustOffsetsStartingAt(localStart, ref _list, (int)_totalCount); AdjustOffsetsStartingAt(0, ref right._list, -(int)spaceBeingMoved); right._totalCount -= spaceBeingMoved; _totalCount += spaceBeingMoved; //if (tob != null) tob.ItemMoved(item, right, this); return(spaceBeingMoved); }
internal override uint TakeFromRight(AListNode <K, T> sibling, int localsToMove, IAListTreeObserver <K, T> tob) { Debug.Assert(localsToMove <= sibling.LocalCount && LocalCount + localsToMove <= _maxNodeSize); var right = (AListLeaf <K, T>)sibling; if (_isFrozen || right._isFrozen) { return(0); } EnsureCapacity(localsToMove); _list.AddRange(right._list.Slice(0, localsToMove)); right._list.RemoveRange(0, localsToMove); if (tob != null) { tob.ItemsMoved(_list, _list.Count - localsToMove, localsToMove, right, this); } return((uint)localsToMove); }