using System; using System.Collections; using System.Collections.Generic; using System.Linq; namespace Cpp2IL.Core.Extensions; internal static class EnumerableExtensions { public static IEnumerable MaybeAppend(this IEnumerable enumerable, T? item) where T : struct { if (item is not null) { return enumerable.Append(item.Value); } return enumerable; } public static MemoryEnumerable AsEnumerable(this Memory memory) => new(memory); public static MemoryEnumerator GetEnumerator(this Memory memory) => new(memory); public class MemoryEnumerable(Memory memory) : IEnumerable { public IEnumerator GetEnumerator() => new MemoryEnumerator(memory); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } public class MemoryEnumerator(Memory memory) : IEnumerator { private int _index = -1; public bool MoveNext() { _index++; return _index < memory.Length; } public void Reset() { _index = -1; } public T Current => memory.Span[_index]; object? IEnumerator.Current => Current; public void Dispose() { // Nothing to dispose } } }