예제 #1
0
        public bool TryEnqueue(T item, QueueSide queueSide)
        {
            int num;

            if (this.itemToDequeIndex.ContainsKey(item))
            {
                return(false);
            }
            if (queueSide != QueueSide.Back)
            {
                if (queueSide != QueueSide.Front)
                {
                    throw ExceptionUtil.InvalidEnumArgumentException <QueueSide>(queueSide, "queueSide");
                }
            }
            else
            {
                num = this.deque.AddLast(item);
                goto Label_0043;
            }
            num = this.deque.AddFirst(item);
Label_0043:
            this.itemToDequeIndex.Add(item, num);
            return(true);
        }
예제 #2
0
 public void EnqueueRange(IEnumerable <T> items, QueueSide queueSide)
 {
     foreach (T local in items)
     {
         this.TryEnqueue(local, queueSide);
     }
 }
예제 #3
0
        public IAsync Enqueue(QueueSide qSide, Action callback)
        {
            Validate.Begin().IsNotNull <Action>(callback, "callback").IsTrue(((qSide == QueueSide.Front) || (qSide == QueueSide.Back)), "qSide is not a valid member of the QueueSide enumeration").Check();
            IAsyncSource source = Async.NewSource();

            if (this.pleaseAbort)
            {
                source.Throw(new OperationCanceledException("The work queue has shut down."));
            }
            else
            {
                object sync = this.Sync;
                lock (sync)
                {
                    Action item = delegate {
                        callback.Try().Into(source);
                    };
                    Action action2 = delegate {
                        source.Throw(new OperationCanceledException("The dispatcher has shut down."));
                    };
                    if (qSide == QueueSide.Front)
                    {
                        this.runFnQ.EnqueueFront(item);
                        this.cancelFnQ.EnqueueFront(action2);
                    }
                    else
                    {
                        this.runFnQ.Enqueue(item);
                        this.cancelFnQ.Enqueue(action2);
                    }
                    ThreadPool.QueueUserWorkItem(this.threadPoolCallback);
                }
            }
            return(source.AsReceiveOnly());
        }
예제 #4
0
        private bool TryEnqueueWhileLocked(TKey key, TValue value, QueueSide queueSide)
        {
            int num;

            if (this.keyToDequeIndexMap.ContainsKey(key))
            {
                return(false);
            }
            KeyValuePair <TKey, TValue> pair = new KeyValuePair <TKey, TValue>(key, value);

            if (queueSide != QueueSide.Back)
            {
                if (queueSide != QueueSide.Front)
                {
                    throw new InternalErrorException();
                }
            }
            else
            {
                num = this.deque.AddLast(pair);
                goto Label_0046;
            }
            num = this.deque.AddFirst(pair);
Label_0046:
            this.keyToDequeIndexMap.Add(key, num);
            return(true);
        }
예제 #5
0
        private bool TryDequeueWhileLocked(out KeyValuePair <TKey, TValue> item, QueueSide queueSide)
        {
            LinkedArrayNode <KeyValuePair <TKey, TValue> > first;

            if (!this.deque.Any())
            {
                item = new KeyValuePair <TKey, TValue>();
                return(false);
            }
            if (queueSide != QueueSide.Back)
            {
                if (queueSide != QueueSide.Front)
                {
                    throw ExceptionUtil.InvalidEnumArgumentException <QueueSide>(queueSide, "queueSide");
                }
            }
            else
            {
                first = this.deque.Last;
                goto Label_0047;
            }
            first = this.deque.First;
Label_0047:
            item = first.Value;
            this.deque.RemoveAt(first.Index);
            this.keyToDequeIndexMap.Remove(item.Key);
            return(true);
        }
예제 #6
0
 public IEnumerator <T> GetEnumerator(QueueSide side)
 {
     if (side == QueueSide.Front)
     {
         return(this.GetEnumerator());
     }
     return(this.GetReverseEnumerator());
 }
예제 #7
0
        public bool TryDequeue(out KeyValuePair <TKey, TValue> item, QueueSide queueSide)
        {
            object sync = this.sync;

            lock (sync)
            {
                return(this.TryDequeueWhileLocked(out item, queueSide));
            }
        }
예제 #8
0
        public TValue GetOrEnqueue(TKey key, TValue value, QueueSide queueSide)
        {
            object sync = this.sync;

            lock (sync)
            {
                return(this.GetOrEnqueueWhileLocked(key, value, queueSide));
            }
        }
예제 #9
0
        public TValue GetOrEnqueue(TKey key, Func <TKey, TValue> valueFactory, QueueSide queueSide)
        {
            TValue local;

            Validate.IsNotNull <Func <TKey, TValue> >(valueFactory, "valueFactory");
            if (this.TryGetValue(key, out local))
            {
                return(local);
            }
            TValue local2 = valueFactory(key);

            return(this.GetOrEnqueue(key, local2, queueSide));
        }
예제 #10
0
        public bool TryEnqueue(T item, QueueSide queueSide)
        {
            if ((queueSide != QueueSide.Back) && (queueSide != QueueSide.Front))
            {
                ExceptionUtil.ThrowInvalidEnumArgumentException <QueueSide>(queueSide, "queueSide");
            }
            object sync = this.Sync;

            lock (sync)
            {
                return(this.dequeSet.TryEnqueue(item, queueSide));
            }
        }
예제 #11
0
        private TValue GetOrEnqueueWhileLocked(TKey key, TValue value, QueueSide queueSide)
        {
            int num;

            if (this.keyToDequeIndexMap.TryGetValue(key, out num))
            {
                return(this.deque.GetValue(num).Value);
            }
            if (!this.TryEnqueueWhileLocked(key, value, queueSide))
            {
                ExceptionUtil.ThrowInternalErrorException();
            }
            return(value);
        }
예제 #12
0
 public T Dequeue(QueueSide queueSide)
 {
     if (queueSide != QueueSide.Back)
     {
         if (queueSide == QueueSide.Front)
         {
             return(this.Dequeue());
         }
     }
     else
     {
         return(this.DequeueBack());
     }
     ExceptionUtil.ThrowInvalidEnumArgumentException <QueueSide>(queueSide, "queueSide");
     return(default(T));
 }
예제 #13
0
 public static QueueSide Invert(QueueSide queueSide)
 {
     if (queueSide != QueueSide.Back)
     {
         if (queueSide == QueueSide.Front)
         {
             return(QueueSide.Back);
         }
     }
     else
     {
         return(QueueSide.Front);
     }
     ExceptionUtil.ThrowInvalidEnumArgumentException <QueueSide>(queueSide, "queueSide");
     return((QueueSide)(-2147483648));
 }
예제 #14
0
 public T PeekUnchecked(QueueSide queueSide, int index)
 {
     if (queueSide != QueueSide.Back)
     {
         if (queueSide == QueueSide.Front)
         {
             return(this.PeekUnchecked(index));
         }
     }
     else
     {
         return(this.PeekBackUnchecked(index));
     }
     ExceptionUtil.ThrowInvalidEnumArgumentException <QueueSide>(queueSide, "queueSide");
     return(default(T));
 }
예제 #15
0
 public void Enqueue(T item, QueueSide queueSide)
 {
     if (queueSide != QueueSide.Back)
     {
         if (queueSide == QueueSide.Front)
         {
             this.EnqueueFront(item);
         }
         else
         {
             ExceptionUtil.ThrowInvalidEnumArgumentException <QueueSide>(queueSide, "queueSide");
         }
     }
     else
     {
         this.Enqueue(item);
     }
 }
예제 #16
0
        public static int EnqueueRange <T>(this Deque <T> queue, IEnumerable <T> items, QueueSide queueSide)
        {
            int num = 0;

            foreach (T local in items)
            {
                queue.Enqueue(local, queueSide);
                num++;
            }
            return(num);
        }
예제 #17
0
        public TValue EnqueueOrUpdate(TKey key, TValue enqueueValue, Func <TKey, TValue, TValue> updateValueFactory, QueueSide queueSide)
        {
            TValue local;
            TValue local2;

            Validate.IsNotNull <Func <TKey, TValue, TValue> >(updateValueFactory, "updateValueFactory");
            do
            {
                if (this.TryGetValue(key, out local) && this.TryEnqueue(key, enqueueValue))
                {
                    return(enqueueValue);
                }
                local2 = updateValueFactory(key, local);
            }while (!this.TryUpdate(key, local2, local));
            return(local2);
        }