Ejemplo n.º 1
0
 public CustomList()
 {
     _head       = new CustomNode <TData>();
     _tail       = new CustomNode <TData>();
     _head.Next  = _tail;
     _tail.Prev  = _head;
     _enumerator = new Enumerator(this);
 }
Ejemplo n.º 2
0
 public bool MoveNext()
 {
     if (_current.Next != _list._tail)
     {
         _current = _current.Next;
         return(true);
     }
     return(false);
 }
Ejemplo n.º 3
0
        public CustomList <TData> InsertBefore(CustomNode <TData> before, TData val)
        {
            var node = new CustomNode <TData>();

            node.Value       = val;
            node.Next        = before;
            node.Prev        = before.Prev;
            before.Prev.Next = node;
            before.Prev      = node;
            return(this);
        }
Ejemplo n.º 4
0
        public CustomList <TData> InsertAfter(CustomNode <TData> after, TData val)
        {
            var node = new CustomNode <TData>();

            node.Value      = val;
            node.Next       = after.Next;
            node.Prev       = after;
            after.Next.Prev = node;
            after.Next      = node;
            return(this);
        }
Ejemplo n.º 5
0
        public CustomList <TData> PushFront(TData val)
        {
            var node = new CustomNode <TData>();

            node.Value      = val;
            node.Prev       = _head;
            node.Next       = _head.Next;
            _head.Next.Prev = node;
            _head.Next      = node;
            return(this);
        }
Ejemplo n.º 6
0
        public CustomList <TData> PushBack(TData val)
        {
            var node = new CustomNode <TData>();

            node.Value      = val;
            node.Prev       = _tail.Prev;
            node.Next       = _tail;
            _tail.Prev.Next = node;
            _tail.Prev      = node;
            return(this);
        }
Ejemplo n.º 7
0
        internal bool HasAlreadyArrived(Message msg)
        {
            var msgId = msg.MessageId;

            lock (_arrivedReliableMessagePerType) {
                if (!_arrivedReliableMessagePerType.ContainsKey(msg.Header.Type))
                {
                    var list = new CustomList <MessageCounter>();
                    _arrivedReliableMessagePerType.Add(msg.Header.Type,
                                                       new Pair <CustomList <MessageCounter>, MessageCounter>(list, -1));
                }
                var pair            = _arrivedReliableMessagePerType[msg.Header.Type];
                var arrivedMessages = pair.Val1;

                var node = arrivedMessages.First;
                CustomNode <MessageCounter> res = null;
                int pos = 0;
                if (msgId >= pair.Val2)
                {
                    if (msgId == pair.Val2)
                    {
                        return(true);
                    }
                    if (msgId > pair.Val2 + 1)
                    {
                        arrivedMessages.PushBack(pair.Val2);
                        arrivedMessages.PushBack(msgId);
                        _arrivedReliableMessagePerType[msg.Header.Type].Val2 = msgId;
                        return(false);
                    }
                    _arrivedReliableMessagePerType[msg.Header.Type].Val2 = msgId;
                    return(false);
                }
                if (arrivedMessages.Empty)
                {
                    return(true);
                }
                if (msgId < arrivedMessages.First.Value)
                {
                    return(true);
                }
                for (int i = 0, count = arrivedMessages.Count; i < count && node.Value <= msgId; i++)
                {
                    if (node.Value == msgId)
                    {
                        return(true);
                    }
                    if (node.Value < msgId)
                    {
                        res = node;
                        pos = i;
                    }
                    node = node.Next;
                }

                if ((pos & 1) == 1)
                {
                    return(true);
                }
                else
                {
                    if (res.Value == msgId - 1)
                    {
                        if (res.Next.Value == msgId + 1)
                        {
                            arrivedMessages.RemoveBetween(res.Prev, res.Next.Next);
                        }
                        else
                        {
                            res.Value = msgId;
                        }
                    }
                    else if (res.Next.Value == msgId + 1)
                    {
                        res.Next.Value = msgId;
                    }
                    else
                    {
                        arrivedMessages.InsertAfter(res, msgId);
                        arrivedMessages.InsertAfter(res.Next, msgId);
                    }
                }
                return(false);
            }
        }
Ejemplo n.º 8
0
 public void Reset()
 {
     _current = _list._head;
 }
Ejemplo n.º 9
0
 public Enumerator(CustomList <TData> list)
 {
     _list    = list;
     _current = list._head;
 }
Ejemplo n.º 10
0
 public CustomList <TData> RemoveBetween(CustomNode <TData> begin, CustomNode <TData> end)
 {
     begin.Next = end;
     end.Prev   = begin;
     return(this);
 }