public IVersionedLinkedListNode <T> GetNext(ulong version, IVersionedLinkedListNode <T> currentNode) { VersionedLinkedListNode node = (VersionedLinkedListNode)currentNode; node = node.Next; return(ScanListLookingForNextNodeMatchingVersion(version, node)); }
private void Remove(VersionedLinkedListNode nodeToRemove) { if (_recursionCount != 0) { throw new InvalidOperationException("You may not do a remove when iterating. Use MarkForRemove instead."); } var previousNode = nodeToRemove.Previous; var nextNode = nodeToRemove.Next; if (previousNode != null) { previousNode.Next = nextNode; } if (nextNode != null) { nextNode.Previous = previousNode; } if (nodeToRemove == this.First) { this.First = nextNode; } if (nodeToRemove == this.Last) { this.Last = previousNode; } nodeToRemove.Next = null; nodeToRemove.Previous = null; }
public void MarkForRemove(IVersionedLinkedListNode <T> nodeToRemove) { VersionedLinkedListNode node = (VersionedLinkedListNode)nodeToRemove; if (_recursionCount == 0) { Remove(node); } else { node.MarkForDelete(); _toBeRemoved.Push(node); } }
public void AddLast(T value) { this.Version++; VersionedLinkedListNode nodeToAdd = new VersionedLinkedListNode(value, this.Version); if (this.Last == null) { this.Last = nodeToAdd; this.First = nodeToAdd; return; } VersionedLinkedListNode previousLast = this.Last; previousLast.Next = nodeToAdd; nodeToAdd.Previous = previousLast; this.Last = nodeToAdd; }
private static IVersionedLinkedListNode <T> ScanListLookingForNextNodeMatchingVersion(ulong version, VersionedLinkedListNode currentNode) { while (currentNode != null && currentNode.Version > version) { currentNode = currentNode.Next; } return(currentNode); }