1 #pragma warning disable 1591
4 using System.Runtime.InteropServices;
5 using System.Collections.Generic;
7 using static Eina.TraitFunctions;
8 using static Eina.ArrayNativeFunctions;
13 public static class ArrayNativeFunctions
15 [DllImport(efl.Libs.Eina)] public static extern IntPtr
16 eina_array_new(uint step);
17 [DllImport(efl.Libs.Eina)] public static extern void
18 eina_array_free(IntPtr array);
19 [DllImport(efl.Libs.Eina)] public static extern void
20 eina_array_flush(IntPtr array);
21 [DllImport(efl.Libs.Eina)] [return: MarshalAs(UnmanagedType.U1)] public static extern bool
22 eina_array_remove(IntPtr array, IntPtr keep, IntPtr gdata);
23 [DllImport(efl.Libs.Eina)] [return: MarshalAs(UnmanagedType.U1)] public static extern bool
24 eina_array_push(IntPtr array, IntPtr data);
26 [DllImport(efl.Libs.Eina)] public static extern IntPtr
27 eina_array_iterator_new(IntPtr array);
28 [DllImport(efl.Libs.Eina)] public static extern IntPtr
29 eina_array_accessor_new(IntPtr array);
31 [DllImport(efl.Libs.CustomExports)] public static extern void
32 eina_array_clean_custom_export_mono(IntPtr array);
33 [DllImport(efl.Libs.CustomExports)] [return: MarshalAs(UnmanagedType.U1)] public static extern bool
34 eina_array_push_custom_export_mono(IntPtr array, IntPtr data);
35 [DllImport(efl.Libs.CustomExports)] public static extern IntPtr
36 eina_array_pop_custom_export_mono(IntPtr array);
37 [DllImport(efl.Libs.CustomExports)] public static extern IntPtr
38 eina_array_data_get_custom_export_mono(IntPtr array, uint idx);
39 [DllImport(efl.Libs.CustomExports)] public static extern void
40 eina_array_data_set_custom_export_mono(IntPtr array, uint idx, IntPtr data);
41 [DllImport(efl.Libs.CustomExports)] public static extern uint
42 eina_array_count_custom_export_mono(IntPtr array);
44 [DllImport(efl.Libs.CustomExports)] [return: MarshalAs(UnmanagedType.U1)] public static extern bool
45 eina_array_foreach_custom_export_mono(IntPtr array, IntPtr cb, IntPtr fdata);
48 public class Array<T> : IEnumerable<T>, IDisposable
50 public static uint DefaultStep = 32;
52 public IntPtr Handle {get;set;} = IntPtr.Zero;
53 public bool Own {get;set;}
54 public bool OwnContent {get;set;}
58 get { return Count(); }
62 private void InitNew(uint step)
64 Handle = eina_array_new(step);
67 if (Handle == IntPtr.Zero)
69 throw new SEHException("Could not alloc array");
73 internal bool InternalPush(IntPtr ele)
75 return eina_array_push_custom_export_mono(Handle, ele);
78 internal IntPtr InternalPop()
80 return eina_array_pop_custom_export_mono(Handle);
83 internal IntPtr InternalDataGet(int idx)
85 return eina_array_data_get_custom_export_mono(Handle, (uint)idx); // TODO: Check bounds ???
88 internal void InternalDataSet(int idx, IntPtr ele)
90 eina_array_data_set_custom_export_mono(Handle, (uint)idx, ele); // TODO: Check bounds ???
98 public Array(uint step)
103 public Array(IntPtr handle, bool own)
105 if (handle == IntPtr.Zero)
107 throw new ArgumentNullException("Handle can't be null");
115 public Array(IntPtr handle, bool own, bool ownContent)
117 if (handle == IntPtr.Zero)
119 throw new ArgumentNullException("Handle can't be null");
124 OwnContent = ownContent;
132 protected virtual void Dispose(bool disposing)
135 Handle = IntPtr.Zero;
136 if (h == IntPtr.Zero)
143 int len = (int)eina_array_count_custom_export_mono(h);
144 for (int i = 0; i < len; ++i)
146 NativeFree<T>(eina_array_data_get_custom_export_mono(h, (uint)i));
158 Efl.Eo.Globals.ThreadSafeFreeCbExec(eina_array_free, h);
163 public void Dispose()
166 GC.SuppressFinalize(this);
174 public IntPtr Release()
177 Handle = IntPtr.Zero;
181 private void FreeElementsIfOwned()
186 for (int i = 0; i < len; ++i)
188 NativeFree<T>(InternalDataGet(i));
195 FreeElementsIfOwned();
196 eina_array_clean_custom_export_mono(Handle);
201 FreeElementsIfOwned();
202 eina_array_flush(Handle);
207 return (int)eina_array_count_custom_export_mono(Handle);
210 public void SetOwnership(bool ownAll)
216 public void SetOwnership(bool own, bool ownContent)
219 OwnContent = ownContent;
222 public bool Push(T val)
224 IntPtr ele = ManagedToNativeAlloc(val);
225 var r = InternalPush(ele);
235 // public void Add(T val)
245 IntPtr ele = InternalPop();
246 var r = NativeToManaged<T>(ele);
247 if (OwnContent && ele != IntPtr.Zero)
255 public T DataGet(int idx)
257 IntPtr ele = InternalDataGet(idx);
258 return NativeToManaged<T>(ele);
266 public void DataSet(int idx, T val)
268 IntPtr ele = InternalDataGet(idx); // TODO: check bondaries ??
269 if (OwnContent && ele != IntPtr.Zero)
274 ele = ManagedToNativeAlloc(val);
275 InternalDataSet(idx, ele);
278 public T this[int idx]
293 var managed = new T[len];
294 for (int i = 0; i < len; ++i)
296 managed[i] = DataGet(i);
302 public bool Append(T[] values)
304 foreach (T v in values)
316 public Eina.Iterator<T> GetIterator()
318 return new Eina.Iterator<T>(eina_array_iterator_new(Handle), true, false);
321 public IEnumerator<T> GetEnumerator()
324 for (int i = 0; i < len; ++i)
326 yield return DataGet(i);
330 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
332 return this.GetEnumerator();
335 /// <summary> Gets an Accessor for this Array.</summary>
336 public Eina.Accessor<T> GetAccessor()
338 return new Eina.Accessor<T>(eina_array_accessor_new(Handle), Ownership.Managed);