public CustomList() { _head = new CustomNode <TData>(); _tail = new CustomNode <TData>(); _head.Next = _tail; _tail.Prev = _head; _enumerator = new Enumerator(this); }
public bool MoveNext() { if (_current.Next != _list._tail) { _current = _current.Next; return(true); } return(false); }
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); }
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); }
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); }
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); }
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); } }
public void Reset() { _current = _list._head; }
public Enumerator(CustomList <TData> list) { _list = list; _current = list._head; }
public CustomList <TData> RemoveBetween(CustomNode <TData> begin, CustomNode <TData> end) { begin.Next = end; end.Prev = begin; return(this); }