Пример #1
0
        private PriorityChain <T> GetChain(double priority)
        {
            PriorityChain <T> chain = null;
            int count = this._priorityChains.Count;

            if (count > 0)
            {
                if (priority == this._priorityChains.Keys[0])
                {
                    chain = this._priorityChains.Values[0];
                }
                else if (priority == this._priorityChains.Keys[count - 1])
                {
                    chain = this._priorityChains.Values[count - 1];
                }
                else if ((priority > this._priorityChains.Keys[0]) && (priority < this._priorityChains.Keys[count - 1]))
                {
                    this._priorityChains.TryGetValue((int)priority, out chain);
                }
            }
            if (chain == null)
            {
                if (this._cacheReusableChains.Count > 0)
                {
                    chain          = this._cacheReusableChains.Pop();
                    chain.Priority = priority;
                }
                else
                {
                    chain = new PriorityChain <T>(priority);
                }
                this._priorityChains.Add((int)priority, chain);
            }
            return(chain);
        }
Пример #2
0
        public void ChangeItemPriority(PriorityItem <T> item, double priority)
        {
            this.RemoveItemFromPriorityChain(item);
            PriorityChain <T> chain = this.GetChain(priority);

            this.InsertItemInPriorityChain(item, chain);
        }
Пример #3
0
        public void RemoveItem(PriorityItem <T> item)
        {
            PriorityChain <T> chain = item.Chain;

            this.RemoveItemFromPriorityChain(item);
            this.RemoveItemFromSequentialChain(item);
        }
Пример #4
0
 internal void InsertItemInPriorityChain(PriorityItem <T> item, PriorityChain <T> chain, PriorityItem <T> after)
 {
     item.Chain = chain;
     if (after == null)
     {
         if (chain.Head != null)
         {
             chain.Head.PriorityPrev = item;
             item.PriorityNext       = chain.Head;
             chain.Head = item;
         }
         else
         {
             chain.Head = chain.Tail = item;
         }
     }
     else
     {
         item.PriorityPrev = after;
         if (after.PriorityNext != null)
         {
             item.PriorityNext = after.PriorityNext;
             after.PriorityNext.PriorityPrev = item;
             after.PriorityNext = item;
         }
         else
         {
             after.PriorityNext = item;
             chain.Tail         = item;
         }
     }
     chain.Count++;
 }
Пример #5
0
        public PriorityItem <T> Enqueue(double priority, T data)
        {
            PriorityChain <T> chain = this.GetChain(priority);
            PriorityItem <T>  item  = new PriorityItem <T>(data);

            this.InsertItemInSequentialChain(item, this._tail);
            this.InsertItemInPriorityChain(item, chain, chain.Tail);
            return(item);
        }
Пример #6
0
        public T Peek()
        {
            T   data  = default(T);
            int count = this._priorityChains.Count;

            if (count > 0)
            {
                PriorityChain <T> chain = this._priorityChains.Values[count - 1];
                data = chain.Head.Data;
            }
            return(data);
        }
Пример #7
0
        public T Dequeue()
        {
            int count = this._priorityChains.Count;

            if (count <= 0)
            {
                throw new InvalidOperationException();
            }
            PriorityChain <T> chain = this._priorityChains.Values[count - 1];
            PriorityItem <T>  head  = chain.Head;

            this.RemoveItem(head);
            return(head.Data);
        }
Пример #8
0
 private void InsertItemInPriorityChain(PriorityItem <T> item, PriorityChain <T> chain)
 {
     if (chain.Head == null)
     {
         this.InsertItemInPriorityChain(item, chain, null);
     }
     else
     {
         PriorityItem <T> after = null;
         after = item.SequentialPrev;
         while (after != null)
         {
             if (after.Chain == chain)
             {
                 break;
             }
             after = after.SequentialPrev;
         }
         this.InsertItemInPriorityChain(item, chain, after);
     }
 }
Пример #9
0
        private void RemoveItemFromPriorityChain(PriorityItem <T> item)
        {
            if (item.PriorityPrev != null)
            {
                item.PriorityPrev.PriorityNext = item.PriorityNext;
            }
            else
            {
                item.Chain.Head = item.PriorityNext;
            }
            if (item.PriorityNext != null)
            {
                item.PriorityNext.PriorityPrev = item.PriorityPrev;
            }
            else
            {
                item.Chain.Tail = item.PriorityPrev;
            }
            item.PriorityPrev = (PriorityItem <T>)(item.PriorityNext = null);
            PriorityChain <T> chain = item.Chain;

            chain.Count--;
            if (item.Chain.Count == 0)
            {
                if (item.Chain.Priority == this._priorityChains.Keys[this._priorityChains.Count - 1])
                {
                    this._priorityChains.RemoveAt(this._priorityChains.Count - 1);
                }
                else
                {
                    this._priorityChains.Remove((int)item.Chain.Priority);
                }
                if (this._cacheReusableChains.Count < 10)
                {
                    item.Chain.Priority = -1;//DispatcherPriority.Invalid;
                    this._cacheReusableChains.Push(item.Chain);
                }
            }
            item.Chain = null;
        }