Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }