internal Enumerator(EventWithPerformanceTracker <T> evt)
 {
     m_Length = evt.m_Delegate?.length ?? 0;
     m_Scope  = evt.m_Scope;
     m_ActivePerformanceTracker = -1;
     m_CurrentIndex             = -1;
     m_Delegate = evt.m_Delegate;
 }
        /// <summary>
        /// Remove a subscriber from this event. This is equivalent to using -= on a C# event.
        /// </summary>
        /// <param name="value"></param>
        public void Remove(T value)
        {
            var del = m_Delegate;

            while (true)
            {
                var del2   = del;
                var value2 = DelegateWithHandle.Remove(del2, value);
                del = Interlocked.CompareExchange(ref m_Delegate, value2, del2);
                if (del == del2)
                {
                    break;
                }
            }
        }
        /// <summary>
        /// Add a subscriber to this event. This is equivalent to using += on a C# event.
        /// </summary>
        /// <param name="value"></param>
        public void Add(T value)
        {
            // Thread-safe method to subscribe to this event. The implementation closely mirrors the compiler-generated code for events.
            // see https://sharplab.io/#v2:CYLg1APgAgTAjAWAFBQMwAJboMLoN7LpGYYCmAbqQHYAumcMAPAJa0B86AopbQLIDchYkKJpMAFnS8AFAEp8I9AF9kSoA===
            var del = m_Delegate;

            while (true)
            {
                var del2   = del;
                var value2 = DelegateWithHandle.Add(del2, value);
                del = Interlocked.CompareExchange(ref m_Delegate, value2, del2);
                if (del == del2)
                {
                    break;
                }
            }
        }
 public EventWithPerformanceTracker(string scope)
 {
     m_Scope    = scope;
     m_Delegate = null;
 }