[EflSharp] Separate efl and Circle cs files and Update cs files (#786)
[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             eina_iterator_free(h);
77         }
78     }
79
80     public void Dispose()
81     {
82         Dispose(true);
83         GC.SuppressFinalize(this);
84     }
85
86     public void Free()
87     {
88         Dispose();
89     }
90
91     public IntPtr Release()
92     {
93         IntPtr h = Handle;
94         Handle = IntPtr.Zero;
95         return h;
96     }
97
98     public void SetOwnership(bool ownAll)
99     {
100         Own = ownAll;
101         OwnContent = ownAll;
102     }
103
104     public void SetOwnership(bool own, bool ownContent)
105     {
106         Own = own;
107         OwnContent = ownContent;
108     }
109
110     public bool Next(out T res)
111     {
112         IntPtr data;
113         if (!eina_iterator_next(Handle, out data))
114         {
115             res = default(T);
116             return false;
117         }
118
119         res = NativeToManaged<T>(data);
120
121         if (OwnContent)
122         {
123             NativeFree<T>(data);
124         }
125
126         return true;
127     }
128
129     public bool Lock()
130     {
131         return eina_iterator_lock(Handle);
132     }
133
134     public bool Unlock()
135     {
136         return eina_iterator_unlock(Handle);
137     }
138
139     public IEnumerator<T> GetEnumerator()
140     {
141         for (T curr; Next(out curr);)
142         {
143             yield return curr;
144         }
145     }
146
147     System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
148     {
149         return this.GetEnumerator();
150     }
151 }
152
153 }