File: src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Collections\IntervalTreeHelpers.Enumerator.cs
Web Access
Project: src\src\CodeStyle\Core\Analyzers\Microsoft.CodeAnalysis.CodeStyle.csproj (Microsoft.CodeAnalysis.CodeStyle)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Collections;
using System.Collections.Generic;
using Microsoft.CodeAnalysis.Text;
 
namespace Microsoft.CodeAnalysis.Shared.Collections;
 
internal static partial class IntervalTreeHelpers<T, TIntervalTree, TNode, TIntervalTreeWitness>
    where TIntervalTree : IIntervalTree<T>
    where TIntervalTreeWitness : struct, IIntervalTreeWitness<T, TIntervalTree, TNode>
{
    public struct Enumerator(TIntervalTree tree) : IEnumerator<T>
    {
        /// <summary>
        /// An introspector that always throws.  Used when we need to call an api that takes this, but we know will never
        /// call into it due to other arguments we pass along.
        /// </summary>
        private readonly struct AlwaysThrowIntrospector : IIntervalIntrospector<T>
        {
            public TextSpan GetSpan(T value) => throw new System.NotImplementedException();
        }
 
        /// <summary>
        /// Because we're passing the full span of all ints, we know that we'll never call into the introspector.  Since
        /// all intervals will always be in that span.
        /// </summary>
        private NodeEnumerator<AlwaysThrowIntrospector> _nodeEnumerator = new(tree, start: int.MinValue, end: int.MaxValue, default);
 
        public readonly T Current => default(TIntervalTreeWitness).GetValue(tree, _nodeEnumerator.Current);
 
        readonly object IEnumerator.Current => this.Current!;
 
        public bool MoveNext() => _nodeEnumerator.MoveNext();
        public readonly void Reset() => _nodeEnumerator.Reset();
        public readonly void Dispose() => _nodeEnumerator.Dispose();
    }
}