private void OnSequenceChanged(object sender, SequenceChangedEventArgs args) { if (!this.Equals(args.ExcludedNode)) { Next = args.NewNodeReference; } }
public RealtimeQueue(Action AddAction) { base.RootQueue = this; linkNode = new RealtimeQueueNode(this); linkNode.Next = linkNode; addActionMultiplex = new ActionMultiplex(AddAction); }
public RealtimeQueue(Action AddAction) : base(null) { base.rootList = this; LinkNode = new RealtimeQueueNode <T>(this); LinkNode.Next = LinkNode; AddActionMultiplex = new ActionMultiplex(AddAction); }
public void Reset() { if (CurrentNode != null) { CurrentNode.EnumeratorRelease(); } CurrentNode = rootList.LinkNode; CurrentNode.EnumeratorHold(); TimeoutClock.Reset(); TimeoutClock.Start(); }
private RealtimeQueueNode GetNode(T Item = default(T)) { RealtimeQueueNode node; nodePool.TryTake(out node); if (node == null) { node = new RealtimeQueueNode(this); } node.Item = Item; return(node); }
private RealtimeQueueNode <T> GenerateNode(T Item = default(T)) { RealtimeQueueNode <T> NewNode; if (NodeRecycleBin.Count > 0) { NewNode = NodeRecycleBin.Pop(); } else { NewNode = new RealtimeQueueNode <T>(this); } NewNode.Item = Item; return(NewNode); }
private bool TryMove(Predicate <T> Predicate = null, bool Remove = false) { lock (rootList.mutex) { var StartNode = CurrentNode; //CurrentNode.Next should never be null while (!CurrentNode.Next.Equals(rootList.LinkNode)) { CurrentNode = CurrentNode.Next; if (Predicate?.Invoke(CurrentNode.Item) ?? true) { StartNode.EnumeratorRelease(); CurrentNode.EnumeratorHold(); if (Remove) { CurrentNode.Remove(); } return(true); } } } return(false); }
internal void NotifySequenceChanged(RealtimeQueueNode NewReference, RealtimeQueueNode ExcludedNode = null) { lock (rootList.sync) SequenceChanged?.Invoke(this, new SequenceChangedEventArgs(NewReference, ExcludedNode)); }
public SequenceChangedEventArgs(RealtimeQueueNode <T> NewReference, RealtimeQueueNode <T> ExcludedNode) { NewNodeReference = NewReference; this.ExcludedNode = ExcludedNode; }