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