public void RemoveAndDisposeBefore(ushort offset, int n, int index) { var tree = new Carambolas.Net.Channel.Inbound.Node.Tree <Node>(); for (int i = 0; i < n; ++i) { var seq = new Protocol.Ordinal((ushort)(offset + i)); Assert.True(tree.TryAdd(new Node() { SequenceNumber = seq })); Assert.False(tree.IsEmpty); } var keep = new Protocol.Ordinal((ushort)(offset + index)); tree.RemoveAndDisposeBefore(keep); for (int i = 0; i < n; ++i) { var seq = new Protocol.Ordinal((ushort)(offset + i)); if (seq < keep) { Assert.False(tree.TryGet(seq, out Node node)); } else { Assert.True(tree.TryGet(seq, out Node node)); } if (index >= n) { Assert.True(tree.IsEmpty); } } }
public bool TryAddOrGet(Protocol.Ordinal seq, Allocator allocate, out T node) { if (nil == null) { root = nil = new Sentinel(); } var y = nil; var x = root; while (x != nil) { y = x; if (seq == x.SequenceNumber) { node = x as T; return(false); } x = (seq < x.SequenceNumber) ? x.left : x.right; } allocate(out node); node.SequenceNumber = seq; Add(x, y, node); if (first == null || node.SequenceNumber < first.SequenceNumber) { first = node; } return(true); }
/// <summary> /// Remove all messages below <paramref name="seq"/>. May be called on an empty tree. Removed messages are disposed. /// </summary> public void RemoveAndDisposeBefore(Protocol.Ordinal seq) { var message = first; while (message != null && message.SequenceNumber < seq) { var next = message.right as T ?? message.parent as T; Remove(message); message.Dispose(); message = next; } first = message; }
/// <summary> /// Return true if message identified by seq was found and removed; otherwise, false. /// Message is removed but not disposed. /// </summary> public bool TryRemove(Protocol.Ordinal seq, out T node) { if (!TryGet(seq, out node)) { return(false); } if (node == first) { first = first.right as T ?? first.parent as T; } Remove(node); return(true); }
public void RemoveAndDisposeAll(ushort offset, int n) { var tree = new Carambolas.Net.Channel.Inbound.Node.Tree <Node>(); for (int i = 0; i < n; ++i) { var seq = new Protocol.Ordinal((ushort)(offset + i)); Assert.True(tree.TryAdd(new Node() { SequenceNumber = seq })); Assert.False(tree.IsEmpty); } tree.RemoveAndDisposeAll(); Assert.True(tree.IsEmpty); Assert.Null(tree.First); }
public bool TryGet(Protocol.Ordinal seq, out T node) { var z = root; while (z != nil) { if (z.SequenceNumber == seq) { node = z as T; return(true); } z = (seq < z.SequenceNumber) ? z.left : z.right; } node = null; return(false); }