コード例 #1
0
        public override bool Equals(object obj)
        {
            if (!(obj is HandlerRegistration <ArgsType>))
            {
                return(false);
            }

            HandlerRegistration <ArgsType> other = (HandlerRegistration <ArgsType>)obj;

            return(
                this.Registrator == other.Registrator &&
                this.Handler.Equals(other.Handler));
        }
コード例 #2
0
        public bool Deregister(TerrariaPlugin registrator, HookHandler <ArgsType> handler)
        {
            if (registrator == null)
            {
                throw new ArgumentNullException("registrator");
            }
            if (handler == null)
            {
                throw new ArgumentNullException("handler");
            }

            var registration = new HandlerRegistration <ArgsType>
            {
                Registrator = registrator,
                Handler     = handler
            };

            lock (this.alterRegistrationsLock)
            {
                int registrationIndex = this.registrations.IndexOf(registration);
                if (registrationIndex == -1)
                {
                    return(false);
                }

                var registrationsClone = new List <HandlerRegistration <ArgsType> >(this.registrations.Count);
                for (int i = 0; i < this.registrations.Count; i++)
                {
                    if (i != registrationIndex)
                    {
                        registrationsClone.Add(this.registrations[i]);
                    }
                }

                Interlocked.Exchange(ref this.registrations, registrationsClone);
            }

            return(true);
        }
コード例 #3
0
        public void Register(TerrariaPlugin registrator, HookHandler <ArgsType> handler, int priority)
        {
            if (registrator == null)
            {
                throw new ArgumentNullException("registrator");
            }
            if (handler == null)
            {
                throw new ArgumentNullException("handler");
            }

            var newRegistration = new HandlerRegistration <ArgsType>
            {
                Registrator = registrator,
                Handler     = handler,
                Priority    = priority
            };

            lock (this.alterRegistrationsLock)
            {
                var registrationsClone = new List <HandlerRegistration <ArgsType> >(this.registrations.Count);
                registrationsClone.AddRange(this.registrations);

                // Highest priority goes up in the list, first registered wins if priority equals.
                int insertionIndex = registrations.Count;
                for (int i = 0; i < registrationsClone.Count; i++)
                {
                    if (registrationsClone[i].Priority < priority)
                    {
                        insertionIndex = i;
                        break;
                    }
                }
                registrationsClone.Insert(insertionIndex, newRegistration);

                Interlocked.Exchange(ref this.registrations, registrationsClone);
            }
        }