internal void OpenSpaceAndInsert(T value, VerticalLinkedList <T> listAfter, VerticalLinkedList <T> listBefore) { if (!IsFull) { throw new InvalidOperationException(); } var slot = WhereToInsert(value); if (listAfter != null && listBefore != null && listAfter._lastIndex - slot < slot - listBefore._lastIndex) { listBefore = null; } if (listBefore == null) { for (int i = listAfter._lastIndex; i >= slot; i--) { _bigArray[i + 1] = _bigArray[i]; } listAfter.Depth += 1; } else { var nextFirst = listBefore._firstIndex + _maxDepth; listBefore.Depth += 1; _bigArray[listBefore._lastIndex] = _bigArray[nextFirst]; slot--; for (int i = nextFirst; i < slot; i++) { _bigArray[i] = _bigArray[i + 1]; } } _bigArray[slot] = value; }
internal VerticalLinkedList <T> CopyTo(T[] newArray, int newMaxDepth, int firstIndex) { var newList = new VerticalLinkedList <T>(newArray, newMaxDepth, firstIndex); var index = _firstIndex; for (int i = Depth; i > 0; i--) { newArray[firstIndex++] = _bigArray[index++]; } newList.Depth = Depth; return(newList); }
internal void Receive(VerticalLinkedList <T> from) { if (from == null) { throw new ArgumentNullException(nameof(from)); } int delta = from._firstIndex; for (int i = from.Depth - 1; i >= 0; i--) { _bigArray[i] = _bigArray[i + delta]; } Depth = from.Depth; from.Depth = 0; }
internal void Add(VerticalLinkedList <T> list) { list.Clear(); _lists.Add(list.Id, list); }