/* * Copyright 2019 by its authors. See AUTHORS. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma warning disable 1591 using System; using System.Runtime.InteropServices; using System.Collections.Generic; using System.ComponentModel; using static Eina.TraitFunctions; using static Eina.IteratorNativeFunctions; namespace Eina { [EditorBrowsable(EditorBrowsableState.Never)] public static class IteratorNativeFunctions { [DllImport(efl.Libs.Eina)] internal static extern void eina_iterator_free(IntPtr iterator); [DllImport(efl.Libs.Eina)] internal static extern IntPtr eina_iterator_container_get(IntPtr iterator); [DllImport(efl.Libs.Eina)] [return: MarshalAs(UnmanagedType.U1)] internal static extern bool eina_iterator_next(IntPtr iterator, out IntPtr data); [DllImport(efl.Libs.Eina)] internal static extern void eina_iterator_foreach(IntPtr iterator, IntPtr callback, IntPtr fdata); [DllImport(efl.Libs.Eina)] [return: MarshalAs(UnmanagedType.U1)] internal static extern bool eina_iterator_lock(IntPtr iterator); [DllImport(efl.Libs.Eina)] [return: MarshalAs(UnmanagedType.U1)] internal static extern bool eina_iterator_unlock(IntPtr iterator); [DllImport(efl.Libs.Eina)] internal static extern IntPtr eina_carray_iterator_new(IntPtr array); } /// Wrapper around a native Eina iterator. /// Since EFL 1.23. /// public class Iterator : IEnumerable, IDisposable { [EditorBrowsable(EditorBrowsableState.Never)] public IntPtr Handle {get;set;} = IntPtr.Zero; /// Whether this wrapper owns the native iterator. /// Since EFL 1.23. /// public bool Own {get;set;} = true; [EditorBrowsable(EditorBrowsableState.Never)] public Iterator(IntPtr handle, bool own) { Handle = handle; Own = own; } /// /// Finalizer to be called from the Garbage Collector. /// Since EFL 1.23. /// ~Iterator() { Dispose(false); } /// Disposes of this wrapper, releasing the native array if owned. /// Since EFL 1.23. /// /// True if this was called from public method. False if /// called from the C# finalizer. protected virtual void Dispose(bool disposing) { var h = Handle; Handle = IntPtr.Zero; if (h == IntPtr.Zero) { return; } if (Own) { if (disposing) { eina_iterator_free(h); } else { Efl.Eo.Globals.ThreadSafeFreeCbExec(eina_iterator_free, h); } } } /// Releases the native resources held by this instance. /// Since EFL 1.23. /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// Releases the native resources held by this instance. /// Since EFL 1.23. /// public void Free() { Dispose(); } /// /// Releases the native iterator. /// Since EFL 1.23. /// /// The native array. public IntPtr Release() { IntPtr h = Handle; Handle = IntPtr.Zero; return h; } /// Sets own. /// Since EFL 1.23. /// /// If own the object. public void SetOwnership(bool own) { Own = own; } /// /// Go to the next one. /// Since EFL 1.23. /// /// public bool Next(out T res) { IntPtr data; if (!eina_iterator_next(Handle, out data)) { res = default(T); return false; } res = NativeToManaged(data); return true; } /// /// Locks the container of the iterator. /// Since EFL 1.23. /// /// true on success, false otherwise. public bool Lock() { return eina_iterator_lock(Handle); } /// /// Unlocks the container of the iterator. /// Since EFL 1.23. /// /// true on success, false otherwise. public bool Unlock() { return eina_iterator_unlock(Handle); } /// Gets an Enumerator for this iterator. /// Since EFL 1.23. /// public IEnumerator GetEnumerator() { for (T curr; Next(out curr);) { yield return curr; } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } } }