File: src\tools\illink\src\ILLink.Shared\TypeSystemProxy\ParameterCollection.cs
Web Access
Project: src\src\tools\illink\src\linker\Mono.Linker.csproj (illink)
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
 
using System;
using System.Collections;
using System.Collections.Generic;
 
// This is needed due to NativeAOT which doesn't enable nullable globally yet
#nullable enable
 
namespace ILLink.Shared.TypeSystemProxy
{
    /// <summary>
    /// Enumerable struct used to enumerator over a method's parameters without allocating or going through IEnumerable
    /// </summary>
    internal readonly struct ParameterProxyEnumerable : IEnumerable<ParameterProxy>
    {
        private readonly int _start;
 
        private readonly int _end;
 
        private readonly MethodProxy _method;
 
        public ParameterProxyEnumerable(int start, int end, MethodProxy method)
        {
            _start = start;
            _end = end;
            _method = method;
        }
 
        public ParameterEnumerator GetEnumerator() => new ParameterEnumerator(_start, _end, _method);
 
        IEnumerator<ParameterProxy> IEnumerable<ParameterProxy>.GetEnumerator() => new ParameterEnumerator(_start, _end, _method);
 
        IEnumerator IEnumerable.GetEnumerator() => new ParameterEnumerator(_start, _end, _method);
 
        public struct ParameterEnumerator : IEnumerator<ParameterProxy>
        {
            private readonly int _start;
            private int _current;
            private readonly int _end;
            private readonly MethodProxy _method;
 
            public ParameterEnumerator(int start, int end, MethodProxy method)
            {
                _start = start;
                _current = start - 1;
                _end = end;
                _method = method;
            }
 
            public ParameterProxy Current => new ParameterProxy(_method, (ParameterIndex)_current);
 
            object IEnumerator.Current => new ParameterProxy(_method, (ParameterIndex)_current);
 
            public bool MoveNext() => ++_current < _end;
 
            public void Reset() => _current = _start;
 
            void IDisposable.Dispose() { }
        }
    }
}