Exemplo n.º 1
0
        protected override void _AddListener(EventListenerWrapper listener)
        {
            // get or create channel collection
            if (m_Listeners.TryGetValue(listener.Channel, out var channel) == false)
            {
                // create new chanel
                channel = new Dictionary <Type, SortedDictionary <int, List <EventListenerWrapper> > >();
                m_Listeners.Add(listener.Channel, channel);
            }

            // get or create group
            if (channel.TryGetValue(listener.KeyType, out var group) == false)
            {
                group = new SortedDictionary <int, List <EventListenerWrapper> >();
                channel.Add(listener.KeyType, group);
            }

            // add or create order group
            if (group.TryGetValue(listener.Order, out var orderGroup) == false)
            {
                orderGroup = new List <EventListenerWrapper>(4);
                group.Add(listener.Order, orderGroup);
            }

            // finally add listener if collection doesn't contains it
            if (orderGroup.Exists(n => n.MessageListener == listener.MessageListener) == false)
            {
                orderGroup.Add(listener);
            }
        }
Exemplo n.º 2
0
        protected override void _RemoveEventListener(EventListenerWrapper listener)
        {
            if (listener == null)
            {
                return;
            }

            // remove first much
            // ReSharper disable once ForeachCanBeConvertedToQueryUsingAnotherGetEnumerator

            if (m_Listeners.TryGetValue(listener.Channel, out var channel) &&
                channel.TryGetValue(listener.KeyType, out var group))
            {
                foreach (var orderGroup in group)
                {
                    var wrappers = orderGroup.Value;
                    var index    = wrappers.FindIndex(n => n.MessageListener == listener.MessageListener);
                    if (index != -1)
                    {
                        wrappers.RemoveAt(index);
                        // remove unused groups
                        if (wrappers.Count == 0)
                        {
                            // remove ordered group
                            group.Remove(orderGroup.Key);

                            if (group.Count == 0)
                            {
                                // remove type group
                                channel.Remove(listener.KeyType);

                                if (channel.Count == 0)
                                {
                                    // remove channel
                                    m_Listeners.Remove(listener.Channel);
                                }
                            }
                        }
                        return;
                    }
                }
            }
        }