| File: src\runtime\src\tools\illink\src\ILLink.Shared\TypeSystemProxy\ParameterCollection.cs | Web Access |
| Project: src\runtime\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() { } } } }