[EflSharp] Update Circle and efl cs files (#819)
[platform/core/csapi/tizenfx.git] / internals / src / EflSharp / EflSharp / efl / eina_iterator.cs
1 #pragma warning disable 1591
2
3 using System;
4 using System.Runtime.InteropServices;
5 using System.Collections.Generic;
6
7 using static Eina.TraitFunctions;
8 using static Eina.IteratorNativeFunctions;
9
10 namespace Eina
11 {
12
13 public static class IteratorNativeFunctions
14 {
15     [DllImport(efl.Libs.Eina)] public static extern void
16         eina_iterator_free(IntPtr iterator);
17     [DllImport(efl.Libs.Eina)] public static extern IntPtr
18         eina_iterator_container_get(IntPtr iterator);
19     [DllImport(efl.Libs.Eina)] [return: MarshalAs(UnmanagedType.U1)] public static extern bool
20         eina_iterator_next(IntPtr iterator, out IntPtr data);
21     [DllImport(efl.Libs.Eina)] public static extern void
22         eina_iterator_foreach(IntPtr iterator, IntPtr callback, IntPtr fdata);
23     [DllImport(efl.Libs.Eina)] [return: MarshalAs(UnmanagedType.U1)] public static extern bool
24         eina_iterator_lock(IntPtr iterator);
25     [DllImport(efl.Libs.Eina)] [return: MarshalAs(UnmanagedType.U1)] public static extern bool
26         eina_iterator_unlock(IntPtr iterator);
27
28     [DllImport(efl.Libs.Eina)] public static extern IntPtr
29         eina_carray_iterator_new(IntPtr array);
30 }
31
32 public class Iterator<T> : IEnumerable<T>, IDisposable
33 {
34     public IntPtr Handle {get;set;} = IntPtr.Zero;
35     public bool Own {get;set;} = true;
36     public bool OwnContent {get;set;} = false;
37
38     public Iterator(IntPtr handle, bool own)
39     {
40         Handle = handle;
41         Own = own;
42         OwnContent = own;
43     }
44
45     public Iterator(IntPtr handle, bool own, bool ownContent)
46     {
47         Handle = handle;
48         Own = own;
49         OwnContent = ownContent;
50     }
51
52     ~Iterator()
53     {
54         Dispose(false);
55     }
56
57     protected virtual void Dispose(bool disposing)
58     {
59         var h = Handle;
60         Handle = IntPtr.Zero;
61         if (h == IntPtr.Zero)
62         {
63             return;
64         }
65
66         if (OwnContent)
67         {
68             for (IntPtr data; eina_iterator_next(h, out data);)
69             {
70                 NativeFree<T>(data);
71             }
72         }
73
74         if (Own)
75         {
76             if (disposing)
77             {
78                 eina_iterator_free(h);
79             }
80             else
81             {
82                 Efl.Eo.Globals.ThreadSafeFreeCbExec(eina_iterator_free, h);
83             }
84         }
85     }
86
87     public void Dispose()
88     {
89         Dispose(true);
90         GC.SuppressFinalize(this);
91     }
92
93     public void Free()
94     {
95         Dispose();
96     }
97
98     public IntPtr Release()
99     {
100         IntPtr h = Handle;
101         Handle = IntPtr.Zero;
102         return h;
103     }
104
105     public void SetOwnership(bool ownAll)
106     {
107         Own = ownAll;
108         OwnContent = ownAll;
109     }
110
111     public void SetOwnership(bool own, bool ownContent)
112     {
113         Own = own;
114         OwnContent = ownContent;
115     }
116
117     public bool Next(out T res)
118     {
119         IntPtr data;
120         if (!eina_iterator_next(Handle, out data))
121         {
122             res = default(T);
123             return false;
124         }
125
126         res = NativeToManaged<T>(data);
127
128         if (OwnContent)
129         {
130             NativeFree<T>(data);
131         }
132
133         return true;
134     }
135
136     public bool Lock()
137     {
138         return eina_iterator_lock(Handle);
139     }
140
141     public bool Unlock()
142     {
143         return eina_iterator_unlock(Handle);
144     }
145
146     public IEnumerator<T> GetEnumerator()
147     {
148         for (T curr; Next(out curr);)
149         {
150             yield return curr;
151         }
152     }
153
154     System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
155     {
156         return this.GetEnumerator();
157     }
158 }
159
160 }