1 #pragma warning disable 1591
4 using System.Runtime.InteropServices;
5 using System.Collections.Generic;
7 using static Eina.TraitFunctions;
8 using static Eina.InlistNativeFunctions;
14 public static class InlistNativeFunctions
16 [DllImport(efl.Libs.Eina)] public static extern IntPtr
17 eina_inlist_append(IntPtr in_list, IntPtr in_item);
19 [DllImport(efl.Libs.Eina)] public static extern IntPtr
20 eina_inlist_prepend(IntPtr in_list, IntPtr in_item);
22 [DllImport(efl.Libs.Eina)] public static extern IntPtr
23 eina_inlist_append_relative(IntPtr in_list, IntPtr in_item, IntPtr in_relative);
25 [DllImport(efl.Libs.Eina)] public static extern IntPtr
26 eina_inlist_prepend_relative(IntPtr in_list, IntPtr in_item, IntPtr in_relative);
28 [DllImport(efl.Libs.Eina)] public static extern IntPtr
29 eina_inlist_remove(IntPtr in_list, IntPtr in_item);
31 [DllImport(efl.Libs.Eina)] public static extern IntPtr
32 eina_inlist_find(IntPtr in_list, IntPtr in_item);
34 [DllImport(efl.Libs.Eina)] public static extern IntPtr
35 eina_inlist_promote(IntPtr list, IntPtr item);
37 [DllImport(efl.Libs.Eina)] public static extern IntPtr
38 eina_inlist_demote(IntPtr list, IntPtr item);
40 [DllImport(efl.Libs.Eina)] public static extern uint
41 eina_inlist_count(IntPtr list);
43 [DllImport(efl.Libs.Eina)] public static extern IntPtr
44 eina_inlist_iterator_new(IntPtr in_list);
46 [DllImport(efl.Libs.Eina)] public static extern IntPtr
47 eina_inlist_accessor_new(IntPtr in_list);
49 [DllImport(efl.Libs.Eina)] public static extern IntPtr
50 eina_inlist_sorted_insert(IntPtr list, IntPtr item, IntPtr func);
52 [DllImport(efl.Libs.Eina)] public static extern IntPtr
53 eina_inlist_sorted_state_new();
55 [DllImport(efl.Libs.Eina)] public static extern int
56 eina_inlist_sorted_state_init(IntPtr state, IntPtr list);
58 [DllImport(efl.Libs.Eina)] public static extern void
59 eina_inlist_sorted_state_free(IntPtr state);
61 [DllImport(efl.Libs.Eina)] public static extern IntPtr
62 eina_inlist_sorted_state_insert(IntPtr list, IntPtr item, IntPtr func, IntPtr state);
64 [DllImport(efl.Libs.Eina)] public static extern IntPtr
65 eina_inlist_sort(IntPtr head, IntPtr func);
68 [DllImport(efl.Libs.CustomExports)] public static extern IntPtr
69 eina_inlist_first_custom_export_mono(IntPtr list);
70 [DllImport(efl.Libs.CustomExports)] public static extern IntPtr
71 eina_inlist_last_custom_export_mono(IntPtr list);
74 [DllImport(efl.Libs.CustomExports)] public static extern IntPtr
75 eina_inlist_next_custom_export_mono(IntPtr list);
76 [DllImport(efl.Libs.CustomExports)] public static extern IntPtr
77 eina_inlist_prev_custom_export_mono(IntPtr list);
79 [DllImport(efl.Libs.CustomExports)] public static extern IntPtr
80 eina_inlist_iterator_wrapper_new_custom_export_mono(IntPtr in_list);
83 public class Inlist<T> : IEnumerable<T>, IDisposable
85 public IntPtr Handle {get;set;} = IntPtr.Zero;
86 public bool Own {get;set;}
87 public bool OwnContent {get;set;}
91 get { return Count(); }
95 private void InitNew()
102 private IntPtr InternalFirst()
104 return eina_inlist_first_custom_export_mono(Handle);
107 private IntPtr InternalLast()
109 return eina_inlist_last_custom_export_mono(Handle);
112 private IntPtr InternalAt(int idx)
119 IntPtr curr = Handle;
120 for (int n = 0; n != idx && curr != IntPtr.Zero; ++n)
122 curr = InternalNext(curr);
128 private static IntPtr InternalNext(IntPtr inlist)
130 return eina_inlist_next_custom_export_mono(inlist);
133 private static IntPtr InternalPrev(IntPtr inlist)
135 return eina_inlist_prev_custom_export_mono(inlist);
144 public Inlist(IntPtr handle, bool own)
151 public Inlist(IntPtr handle, bool own, bool ownContent)
155 OwnContent = ownContent;
163 protected virtual void Dispose(bool disposing)
166 Handle = IntPtr.Zero;
167 if (h == IntPtr.Zero)
174 for (IntPtr curr = h; curr != IntPtr.Zero; curr = InternalNext(curr))
176 NativeFreeInlistNodeElement<T>(curr);
182 while (h != IntPtr.Zero)
185 h = eina_inlist_remove(h, h);
186 NativeFreeInlistNode<T>(aux, false);
191 public void Dispose()
194 GC.SuppressFinalize(this);
202 public IntPtr Release()
205 Handle = IntPtr.Zero;
209 public void SetOwnership(bool ownAll)
215 public void SetOwnership(bool own, bool ownContent)
218 OwnContent = ownContent;
223 return (int)eina_inlist_count(Handle);
228 while (Handle != IntPtr.Zero)
231 Handle = eina_inlist_remove(Handle, Handle);
232 NativeFreeInlistNode<T>(aux, OwnContent);
236 public void Append(T val)
238 IntPtr node = ManagedToNativeAllocInlistNode(val);
239 Handle = eina_inlist_append(Handle, node);
242 public void Prepend(T val)
244 IntPtr node = ManagedToNativeAllocInlistNode(val);
245 Handle = eina_inlist_prepend(Handle, node);
248 public void Remove(int idx)
250 IntPtr node = InternalAt(idx);
251 Handle = eina_inlist_remove(Handle, node);
252 NativeFreeInlistNode<T>(node, OwnContent);
257 IntPtr node = InternalAt(idx);
258 if (node == IntPtr.Zero)
260 throw new IndexOutOfRangeException();
263 return NativeToManagedInlistNode<T>(node);
266 public void DataSet(int idx, T val)
268 IntPtr old = InternalAt(idx);
269 if (old == IntPtr.Zero)
271 throw new IndexOutOfRangeException();
274 IntPtr new_node = ManagedToNativeAllocInlistNode(val);
276 Handle = eina_inlist_append_relative(Handle, new_node, old);
277 Handle = eina_inlist_remove(Handle, old);
279 NativeFreeInlistNode<T>(old, OwnContent);
282 public T this[int idx]
296 var managed = new T[Count()];
298 for (IntPtr curr = Handle; curr != IntPtr.Zero; ++i, curr = InternalNext(curr))
300 managed[i] = NativeToManagedInlistNode<T>(curr);
306 public void AppendArray(T[] values)
308 foreach (T v in values)
315 public Eina.Iterator<T> GetIterator()
317 return new Eina.Iterator<T>(eina_inlist_iterator_wrapper_new_custom_export_mono(Handle), true);
320 public IEnumerator<T> GetEnumerator()
322 for (IntPtr curr = Handle; curr != IntPtr.Zero; curr = InternalNext(curr))
324 yield return NativeToManagedInlistNode<T>(curr);
328 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
330 return this.GetEnumerator();
333 /// <summary> Gets an Accessor for this List.</summary>
334 public Eina.Accessor<T> GetAccessor()
336 return new Eina.AccessorInList<T>(eina_inlist_accessor_new(Handle), Ownership.Managed);