コード例 #1
0
        public bool DispatchEvent <T>(T evt) where T : BaseEvent
        {
            Type type = evt.GetType();

            if (!m_handlerTable.ContainsKey(type))
            {
                return(false);
            }
            PriorityLinkedList <Delegate> priorityLinkedList = m_handlerTable[type];
            LinkedListNode <ElementPriorityPair <Delegate> > linkedListNode = priorityLinkedList.First();

            while (linkedListNode != null)
            {
                LinkedListNode <ElementPriorityPair <Delegate> > next = linkedListNode.Next;
                Delegate element = linkedListNode.Value.Element;
                if (element.Target.Equals(null))
                {
                    priorityLinkedList.Remove(linkedListNode.Value.Element);
                    linkedListNode = next;
                    continue;
                }
                if ((bool)element.DynamicInvoke(evt))
                {
                    return(true);
                }
                linkedListNode = linkedListNode.Next;
            }
            return(false);
        }
コード例 #2
0
        private PriorityLinkedList <JobTimeoutModel> CreateSimpleQueue()
        {
            PriorityLinkedList <JobTimeoutModel> pq = new PriorityLinkedList <JobTimeoutModel>();

            pq.Enqueue(this.j3);
            pq.Enqueue(this.j2);
            pq.Enqueue(this.j1);
            return(pq);
        }
コード例 #3
0
        public void TestEmpty()
        {
            PriorityLinkedList <JobTimeoutModel> pq = this.CreateSimpleQueue();

            pq.Dequeue();
            pq.Dequeue();
            pq.Dequeue();
            Assert.Equal(0, pq.Count);
        }
コード例 #4
0
        public void TestClear1()
        {
            PriorityLinkedList <JobTimeoutModel> pq = this.CreateSimpleQueue();

            pq.Clear();
            Assert.Equal(0, pq.Count);
            Assert.False(pq.Contains(this.j1));
            Assert.False(pq.Contains(this.j2));
            Assert.False(pq.Contains(this.j3));
        }
コード例 #5
0
    public PriorityLinkedList <EventHandlerDelegate <TEvent> > GetHandlerList <TEvent>() where TEvent : struct
    {
        Type typeFromHandle = typeof(TEvent);

        if (!m_handlerTable.TryGetValue(typeFromHandle, out object value))
        {
            value = new PriorityLinkedList <EventHandlerDelegate <TEvent> >();
            m_handlerTable.Add(typeFromHandle, value);
        }
        return((PriorityLinkedList <EventHandlerDelegate <TEvent> >)value);
    }
コード例 #6
0
        public void TestContains()
        {
            PriorityLinkedList <JobTimeoutModel> pq = this.CreateSimpleQueue();

            Assert.True(pq.Contains(this.j1));
            Assert.True(pq.Contains(this.j2));
            Assert.True(pq.Contains(this.j3));
            JobTimeoutModel j4 = new JobTimeoutModel("abc", DateTime.Now + TimeSpan.FromMinutes(15), new JobRequest());

            Assert.False(pq.Contains(j4));
        }
コード例 #7
0
        public bool RemoveListener <T>(EventHandlerDelegate <T> handler) where T : BaseEvent
        {
            Type typeFromHandle = typeof(T);

            if (!m_handlerTable.ContainsKey(typeFromHandle))
            {
                return(false);
            }
            PriorityLinkedList <Delegate> priorityLinkedList = m_handlerTable[typeFromHandle];

            return(priorityLinkedList.Remove(handler));
        }
コード例 #8
0
        public void AddListener <T>(EventHandlerDelegate <T> handler, Priority priority = Priority.DEFAULT) where T : BaseEvent
        {
            Type typeFromHandle = typeof(T);

            if (!m_handlerTable.ContainsKey(typeFromHandle))
            {
                m_handlerTable.Add(typeFromHandle, new PriorityLinkedList <Delegate>());
            }
            PriorityLinkedList <Delegate> priorityLinkedList = m_handlerTable[typeFromHandle];

            priorityLinkedList.Add(handler, (int)priority);
        }
コード例 #9
0
        public void TestPeek()
        {
            PriorityLinkedList <JobTimeoutModel> pq = this.CreateSimpleQueue();
            JobTimeoutModel front = pq.Peek();

            Assert.Equal(this.j1, front);
            Assert.Equal(3, pq.Count);
            pq.Clear();
            front = pq.Peek();
            Assert.Null(front);
            Assert.Equal(0, pq.Count);
        }
コード例 #10
0
        public void TestRemove3()
        {
            PriorityLinkedList <JobTimeoutModel> pq = this.CreateSimpleQueue();

            pq.Remove(this.j3);
            JobTimeoutModel d1 = pq.Dequeue();
            JobTimeoutModel d2 = pq.Dequeue();

            Assert.Equal(d1, this.j1);
            Assert.Equal(d2, this.j2);
            // queue should be empty now
            Assert.Null(pq.Dequeue());
        }
コード例 #11
0
        public void TestCount1()
        {
            PriorityLinkedList <JobTimeoutModel> pq = this.CreateSimpleQueue();

            Assert.Equal(3, pq.Count);
            pq.Dequeue();
            Assert.Equal(2, pq.Count);
            pq.Dequeue();
            Assert.Equal(1, pq.Count);
            pq.Dequeue();
            Assert.Equal(0, pq.Count);
            pq.Dequeue();
            Assert.Equal(0, pq.Count);
            pq.Enqueue(this.j1);
            Assert.Equal(1, pq.Count);
        }
コード例 #12
0
        public void TestDequeue()
        {
            PriorityLinkedList <JobTimeoutModel> pq = this.CreateSimpleQueue();
            JobTimeoutModel d1 = pq.Dequeue();

            Assert.Equal(2, pq.Count);
            JobTimeoutModel d2 = pq.Dequeue();

            Assert.Equal(1, pq.Count);
            JobTimeoutModel d3 = pq.Dequeue();

            Assert.Equal(0, pq.Count);
            Assert.Equal(this.j1, d1);
            Assert.Equal(this.j2, d2);
            Assert.Equal(this.j3, d3);
        }
コード例 #13
0
    public bool DispatchEvent <T>(T evt) where T : struct
    {
        Type typeFromHandle = typeof(T);

        if (!m_handlerTable.ContainsKey(typeFromHandle))
        {
            return(false);
        }
        PriorityLinkedList <EventHandlerDelegate <T> > handlerList = GetHandlerList <T>();
        bool copyOnWrite = handlerList.CopyOnWrite;

        handlerList.CopyOnWrite = true;
        LinkedListNode <ElementPriorityPair <EventHandlerDelegate <T> > > linkedListNode = handlerList.First();

        while (linkedListNode != null)
        {
            LinkedListNode <ElementPriorityPair <EventHandlerDelegate <T> > > next = linkedListNode.Next;
            EventHandlerDelegate <T> element = linkedListNode.Value.Element;
            if (element.Target != null && element.Target.Equals(null))
            {
                handlerList.Remove(linkedListNode.Value.Element);
                linkedListNode = next;
            }
            else
            {
                try
                {
                    if (handlerList.Contains(element) && element(evt))
                    {
                        handlerList.CopyOnWrite = copyOnWrite;
                        return(true);
                    }
                }
                catch (Exception ex)
                {
                    Log.LogErrorFormatted(this, "The event handler for event '{0}' threw an exception. Execution will continue but the game may be in a broken state.", typeof(T).FullName);
                    Log.LogException(this, ex);
                }
                linkedListNode = next;
            }
        }
        handlerList.CopyOnWrite = copyOnWrite;
        return(false);
    }
コード例 #14
0
 public void SetUp()
 {
     _logger             = new Mock <ILogger>();
     _priorityLinkedList = new PriorityLinkedList(_logger.Object);
 }