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