using System; using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace Foodsoft.Alpm { internal struct EnumerableWrapper : IEnumerable where TImpl : struct, IItemsReader where THandle : SafeHandle { private TImpl _impl; public EnumerableWrapper(TImpl impl) { _impl = impl; } public IEnumerator GetEnumerator() { var handle = _impl.Handle; var release = false; RuntimeHelpers.PrepareConstrainedRegions(); try { handle.DangerousAddRef(ref release); if (!release) throw new ObjectDisposedException(_impl.GetType().FullName); for (var list = _impl.GetItems(); list != IntPtr.Zero; list = Wrapper.ListNext(list)) { yield return _impl.PtrToItem(Wrapper.ListData(list)); } } finally { if (release) handle.DangerousRelease(); } } IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } }