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