using System; using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; namespace Foodsoft.Alpm { public struct PackageList : IEnumerable, IDisposable { private SafeListHandle _handle; private Database _db; internal PackageList(SafeListHandle handle, Database db) { _handle = handle; _db = db; } public IEnumerator GetEnumerator() { var release = false; RuntimeHelpers.PrepareConstrainedRegions(); try { _handle.DangerousAddRef(ref release); if (!release) throw new ObjectDisposedException(_handle.GetType().FullName); for (var list = _handle.DangerousGetHandle(); list != IntPtr.Zero; list = Wrapper.ListNext(list)) { yield return new CachePackage( new SafeCachePackageHandle(Wrapper.ListData(list), _handle.ParentHandle), _db); } } finally { if (release) _handle.DangerousRelease(); } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public void Dispose() { _handle.Dispose(); } } }