Ejemplo n.º 1
0
        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);
                }
            }
        }
Ejemplo n.º 2
0
                    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);
                    }
Ejemplo n.º 3
0
                    /// <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;
                    }
Ejemplo n.º 4
0
                    /// <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);
                    }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
                    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);
                    }