1 /*
2  * This file is part of gtkD.
3  *
4  * gtkD is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License
6  * as published by the Free Software Foundation; either version 3
7  * of the License, or (at your option) any later version, with
8  * some exceptions, please read the COPYING file.
9  *
10  * gtkD is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with gtkD; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
18  */
19 
20 // generated automatically - do not change
21 // find conversion definition on APILookup.txt
22 // implement new conversion functionalities on the wrap.utils pakage
23 
24 
25 module glib.ListG;
26 
27 private import gobject.ObjectG;
28 private import gtkc.glib;
29 public  import gtkc.glibtypes;
30 
31 
32 /**
33  * The #GList struct is used for each element in a doubly-linked list.
34  */
35 public class ListG
36 {
37 	/** the main Gtk struct */
38 	protected GList* gList;
39 	protected bool ownedRef;
40 
41 	/** Get the main Gtk struct */
42 	public GList* getListGStruct()
43 	{
44 		return gList;
45 	}
46 
47 	/** the main Gtk struct as a void* */
48 	protected void* getStruct()
49 	{
50 		return cast(void*)gList;
51 	}
52 
53 	/**
54 	 * Sets our main struct and passes it to the parent class.
55 	 */
56 	public this (GList* gList, bool ownedRef = false)
57 	{
58 		this.gList = gList;
59 		this.ownedRef = ownedRef;
60 	}
61 
62 	/** */
63 	@property void* data()
64 	{
65 		return gList.data;
66 	}
67 	
68 	/**
69 	 * get the next element
70 	 * Returns: the next element, or NULL if there are no more elements.
71 	 */
72 	@property ListG next()
73 	{
74 		if ( gList.next is null )
75 		{
76 			return null;
77 		}
78 		
79 		return new ListG(gList.next);
80 	}
81 	
82 	/**
83 	 * get the previous element
84 	 * Returns: the previous element, or NULL if there are no more elements.
85 	 */
86 	@property ListG previous()
87 	{
88 		if ( gList.prev is null )
89 		{
90 			return null;
91 		}
92 		
93 		return new ListG(gList.prev);
94 	}
95 	
96 	/**
97 	 * Turn the list into a D array of the desiered type.
98 	 * Type T wraps should match the type of the data.
99 	 */
100 	public T[] toArray(T, TC = typeof(T.tupleof[0]))()
101 	{
102 		T[] arr = new T[length()];
103 		ListG list = this;
104 		size_t count;
105 		
106 		while(list !is null && count < arr.length)
107 		{
108 			arr[count] = ObjectG.getDObject!(T)(cast(TC)list.data);
109 			list = list.next();
110 			count++;
111 		}
112 		
113 		return arr;
114 	}
115 	
116 	unittest
117 	{
118 		import gobject.Value;
119 		
120 		auto list = new ListG(null);
121 		list = list.append(new Value(0).getValueStruct());
122 		list = list.append(new Value(1).getValueStruct());
123 		auto arr = list.toArray!Value();
124 		
125 		assert(arr[0].getInt() == 0);
126 		assert(arr[1].getInt() == 1);
127 	}
128 
129 	/**
130 	 */
131 
132 	/**
133 	 * Allocates space for one #GList element. It is called by
134 	 * g_list_append(), g_list_prepend(), g_list_insert() and
135 	 * g_list_insert_sorted() and so is rarely used on its own.
136 	 *
137 	 * Returns: a pointer to the newly-allocated #GList element
138 	 */
139 	public static ListG alloc()
140 	{
141 		auto p = g_list_alloc();
142 		
143 		if(p is null)
144 		{
145 			return null;
146 		}
147 		
148 		return new ListG(cast(GList*) p);
149 	}
150 
151 	/**
152 	 * Adds a new element on to the end of the list.
153 	 *
154 	 * Note that the return value is the new start of the list,
155 	 * if @list was empty; make sure you store the new value.
156 	 *
157 	 * g_list_append() has to traverse the entire list to find the end,
158 	 * which is inefficient when adding multiple elements. A common idiom
159 	 * to avoid the inefficiency is to use g_list_prepend() and reverse
160 	 * the list with g_list_reverse() when all elements have been added.
161 	 *
162 	 * |[<!-- language="C" -->
163 	 * // Notice that these are initialized to the empty list.
164 	 * GList *string_list = NULL, *number_list = NULL;
165 	 *
166 	 * // This is a list of strings.
167 	 * string_list = g_list_append (string_list, "first");
168 	 * string_list = g_list_append (string_list, "second");
169 	 *
170 	 * // This is a list of integers.
171 	 * number_list = g_list_append (number_list, GINT_TO_POINTER (27));
172 	 * number_list = g_list_append (number_list, GINT_TO_POINTER (14));
173 	 * ]|
174 	 *
175 	 * Params:
176 	 *     data = the data for the new element
177 	 *
178 	 * Returns: either @list or the new start of the #GList if @list was %NULL
179 	 */
180 	public ListG append(void* data)
181 	{
182 		auto p = g_list_append(gList, data);
183 		
184 		if(p is null)
185 		{
186 			return null;
187 		}
188 		
189 		return new ListG(cast(GList*) p);
190 	}
191 
192 	/**
193 	 * Adds the second #GList onto the end of the first #GList.
194 	 * Note that the elements of the second #GList are not copied.
195 	 * They are used directly.
196 	 *
197 	 * This function is for example used to move an element in the list.
198 	 * The following example moves an element to the top of the list:
199 	 * |[<!-- language="C" -->
200 	 * list = g_list_remove_link (list, llink);
201 	 * list = g_list_concat (llink, list);
202 	 * ]|
203 	 *
204 	 * Params:
205 	 *     list2 = the #GList to add to the end of the first #GList,
206 	 *         this must point  to the top of the list
207 	 *
208 	 * Returns: the start of the new #GList, which equals @list1 if not %NULL
209 	 */
210 	public ListG concat(ListG list2)
211 	{
212 		auto p = g_list_concat(gList, (list2 is null) ? null : list2.getListGStruct());
213 		
214 		if(p is null)
215 		{
216 			return null;
217 		}
218 		
219 		return new ListG(cast(GList*) p);
220 	}
221 
222 	/**
223 	 * Copies a #GList.
224 	 *
225 	 * Note that this is a "shallow" copy. If the list elements
226 	 * consist of pointers to data, the pointers are copied but
227 	 * the actual data is not. See g_list_copy_deep() if you need
228 	 * to copy the data as well.
229 	 *
230 	 * Returns: the start of the new list that holds the same data as @list
231 	 */
232 	public ListG copy()
233 	{
234 		auto p = g_list_copy(gList);
235 		
236 		if(p is null)
237 		{
238 			return null;
239 		}
240 		
241 		return new ListG(cast(GList*) p);
242 	}
243 
244 	/**
245 	 * Makes a full (deep) copy of a #GList.
246 	 *
247 	 * In contrast with g_list_copy(), this function uses @func to make
248 	 * a copy of each list element, in addition to copying the list
249 	 * container itself.
250 	 *
251 	 * @func, as a #GCopyFunc, takes two arguments, the data to be copied
252 	 * and a @user_data pointer. It's safe to pass %NULL as user_data,
253 	 * if the copy function takes only one argument.
254 	 *
255 	 * For instance, if @list holds a list of GObjects, you can do:
256 	 * |[<!-- language="C" -->
257 	 * another_list = g_list_copy_deep (list, (GCopyFunc) g_object_ref, NULL);
258 	 * ]|
259 	 *
260 	 * And, to entirely free the new list, you could do:
261 	 * |[<!-- language="C" -->
262 	 * g_list_free_full (another_list, g_object_unref);
263 	 * ]|
264 	 *
265 	 * Params:
266 	 *     func = a copy function used to copy every element in the list
267 	 *     userData = user data passed to the copy function @func, or %NULL
268 	 *
269 	 * Returns: the start of the new list that holds a full copy of @list,
270 	 *     use g_list_free_full() to free it
271 	 *
272 	 * Since: 2.34
273 	 */
274 	public ListG copyDeep(GCopyFunc func, void* userData)
275 	{
276 		auto p = g_list_copy_deep(gList, func, userData);
277 		
278 		if(p is null)
279 		{
280 			return null;
281 		}
282 		
283 		return new ListG(cast(GList*) p);
284 	}
285 
286 	/**
287 	 * Removes the node link_ from the list and frees it.
288 	 * Compare this to g_list_remove_link() which removes the node
289 	 * without freeing it.
290 	 *
291 	 * Params:
292 	 *     link = node to delete from @list
293 	 *
294 	 * Returns: the (possibly changed) start of the #GList
295 	 */
296 	public ListG deleteLink(ListG link)
297 	{
298 		auto p = g_list_delete_link(gList, (link is null) ? null : link.getListGStruct());
299 		
300 		if(p is null)
301 		{
302 			return null;
303 		}
304 		
305 		return new ListG(cast(GList*) p);
306 	}
307 
308 	/**
309 	 * Finds the element in a #GList which contains the given data.
310 	 *
311 	 * Params:
312 	 *     data = the element data to find
313 	 *
314 	 * Returns: the found #GList element, or %NULL if it is not found
315 	 */
316 	public ListG find(void* data)
317 	{
318 		auto p = g_list_find(gList, data);
319 		
320 		if(p is null)
321 		{
322 			return null;
323 		}
324 		
325 		return new ListG(cast(GList*) p);
326 	}
327 
328 	/**
329 	 * Finds an element in a #GList, using a supplied function to
330 	 * find the desired element. It iterates over the list, calling
331 	 * the given function which should return 0 when the desired
332 	 * element is found. The function takes two #gconstpointer arguments,
333 	 * the #GList element's data as the first argument and the
334 	 * given user data.
335 	 *
336 	 * Params:
337 	 *     data = user data passed to the function
338 	 *     func = the function to call for each element.
339 	 *         It should return 0 when the desired element is found
340 	 *
341 	 * Returns: the found #GList element, or %NULL if it is not found
342 	 */
343 	public ListG findCustom(void* data, GCompareFunc func)
344 	{
345 		auto p = g_list_find_custom(gList, data, func);
346 		
347 		if(p is null)
348 		{
349 			return null;
350 		}
351 		
352 		return new ListG(cast(GList*) p);
353 	}
354 
355 	/**
356 	 * Gets the first element in a #GList.
357 	 *
358 	 * Returns: the first element in the #GList,
359 	 *     or %NULL if the #GList has no elements
360 	 */
361 	public ListG first()
362 	{
363 		auto p = g_list_first(gList);
364 		
365 		if(p is null)
366 		{
367 			return null;
368 		}
369 		
370 		return new ListG(cast(GList*) p);
371 	}
372 
373 	/**
374 	 * Calls a function for each element of a #GList.
375 	 *
376 	 * Params:
377 	 *     func = the function to call with each element's data
378 	 *     userData = user data to pass to the function
379 	 */
380 	public void foreac(GFunc func, void* userData)
381 	{
382 		g_list_foreach(gList, func, userData);
383 	}
384 
385 	/**
386 	 * Frees all of the memory used by a #GList.
387 	 * The freed elements are returned to the slice allocator.
388 	 *
389 	 * If list elements contain dynamically-allocated memory, you should
390 	 * either use g_list_free_full() or free them manually first.
391 	 */
392 	public void free()
393 	{
394 		g_list_free(gList);
395 	}
396 
397 	/**
398 	 * Frees one #GList element, but does not update links from the next and
399 	 * previous elements in the list, so you should not call this function on an
400 	 * element that is currently part of a list.
401 	 *
402 	 * It is usually used after g_list_remove_link().
403 	 */
404 	public void free1()
405 	{
406 		g_list_free_1(gList);
407 	}
408 
409 	/**
410 	 * Convenience method, which frees all the memory used by a #GList,
411 	 * and calls @free_func on every element's data.
412 	 *
413 	 * Params:
414 	 *     freeFunc = the function to be called to free each element's data
415 	 *
416 	 * Since: 2.28
417 	 */
418 	public void freeFull(GDestroyNotify freeFunc)
419 	{
420 		g_list_free_full(gList, freeFunc);
421 	}
422 
423 	/**
424 	 * Gets the position of the element containing
425 	 * the given data (starting from 0).
426 	 *
427 	 * Params:
428 	 *     data = the data to find
429 	 *
430 	 * Returns: the index of the element containing the data,
431 	 *     or -1 if the data is not found
432 	 */
433 	public int index(void* data)
434 	{
435 		return g_list_index(gList, data);
436 	}
437 
438 	/**
439 	 * Inserts a new element into the list at the given position.
440 	 *
441 	 * Params:
442 	 *     data = the data for the new element
443 	 *     position = the position to insert the element. If this is
444 	 *         negative, or is larger than the number of elements in the
445 	 *         list, the new element is added on to the end of the list.
446 	 *
447 	 * Returns: the (possibly changed) start of the #GList
448 	 */
449 	public ListG insert(void* data, int position)
450 	{
451 		auto p = g_list_insert(gList, data, position);
452 		
453 		if(p is null)
454 		{
455 			return null;
456 		}
457 		
458 		return new ListG(cast(GList*) p);
459 	}
460 
461 	/**
462 	 * Inserts a new element into the list before the given position.
463 	 *
464 	 * Params:
465 	 *     sibling = the list element before which the new element
466 	 *         is inserted or %NULL to insert at the end of the list
467 	 *     data = the data for the new element
468 	 *
469 	 * Returns: the (possibly changed) start of the #GList
470 	 */
471 	public ListG insertBefore(ListG sibling, void* data)
472 	{
473 		auto p = g_list_insert_before(gList, (sibling is null) ? null : sibling.getListGStruct(), data);
474 		
475 		if(p is null)
476 		{
477 			return null;
478 		}
479 		
480 		return new ListG(cast(GList*) p);
481 	}
482 
483 	/**
484 	 * Inserts a new element into the list, using the given comparison
485 	 * function to determine its position.
486 	 *
487 	 * If you are adding many new elements to a list, and the number of
488 	 * new elements is much larger than the length of the list, use
489 	 * g_list_prepend() to add the new items and sort the list afterwards
490 	 * with g_list_sort().
491 	 *
492 	 * Params:
493 	 *     data = the data for the new element
494 	 *     func = the function to compare elements in the list. It should
495 	 *         return a number > 0 if the first parameter comes after the
496 	 *         second parameter in the sort order.
497 	 *
498 	 * Returns: the (possibly changed) start of the #GList
499 	 */
500 	public ListG insertSorted(void* data, GCompareFunc func)
501 	{
502 		auto p = g_list_insert_sorted(gList, data, func);
503 		
504 		if(p is null)
505 		{
506 			return null;
507 		}
508 		
509 		return new ListG(cast(GList*) p);
510 	}
511 
512 	/**
513 	 * Inserts a new element into the list, using the given comparison
514 	 * function to determine its position.
515 	 *
516 	 * If you are adding many new elements to a list, and the number of
517 	 * new elements is much larger than the length of the list, use
518 	 * g_list_prepend() to add the new items and sort the list afterwards
519 	 * with g_list_sort().
520 	 *
521 	 * Params:
522 	 *     data = the data for the new element
523 	 *     func = the function to compare elements in the list. It should
524 	 *         return a number > 0 if the first parameter  comes after the
525 	 *         second parameter in the sort order.
526 	 *     userData = user data to pass to comparison function
527 	 *
528 	 * Returns: the (possibly changed) start of the #GList
529 	 *
530 	 * Since: 2.10
531 	 */
532 	public ListG insertSortedWithData(void* data, GCompareDataFunc func, void* userData)
533 	{
534 		auto p = g_list_insert_sorted_with_data(gList, data, func, userData);
535 		
536 		if(p is null)
537 		{
538 			return null;
539 		}
540 		
541 		return new ListG(cast(GList*) p);
542 	}
543 
544 	/**
545 	 * Gets the last element in a #GList.
546 	 *
547 	 * Returns: the last element in the #GList,
548 	 *     or %NULL if the #GList has no elements
549 	 */
550 	public ListG last()
551 	{
552 		auto p = g_list_last(gList);
553 		
554 		if(p is null)
555 		{
556 			return null;
557 		}
558 		
559 		return new ListG(cast(GList*) p);
560 	}
561 
562 	/**
563 	 * Gets the number of elements in a #GList.
564 	 *
565 	 * This function iterates over the whole list to count its elements.
566 	 * Use a #GQueue instead of a GList if you regularly need the number
567 	 * of items. To check whether the list is non-empty, it is faster to check
568 	 * @list against %NULL.
569 	 *
570 	 * Returns: the number of elements in the #GList
571 	 */
572 	public uint length()
573 	{
574 		return g_list_length(gList);
575 	}
576 
577 	/**
578 	 * Gets the element at the given position in a #GList.
579 	 *
580 	 * This iterates over the list until it reaches the @n-th position. If you
581 	 * intend to iterate over every element, it is better to use a for-loop as
582 	 * described in the #GList introduction.
583 	 *
584 	 * Params:
585 	 *     n = the position of the element, counting from 0
586 	 *
587 	 * Returns: the element, or %NULL if the position is off
588 	 *     the end of the #GList
589 	 */
590 	public ListG nth(uint n)
591 	{
592 		auto p = g_list_nth(gList, n);
593 		
594 		if(p is null)
595 		{
596 			return null;
597 		}
598 		
599 		return new ListG(cast(GList*) p);
600 	}
601 
602 	/**
603 	 * Gets the data of the element at the given position.
604 	 *
605 	 * This iterates over the list until it reaches the @n-th position. If you
606 	 * intend to iterate over every element, it is better to use a for-loop as
607 	 * described in the #GList introduction.
608 	 *
609 	 * Params:
610 	 *     n = the position of the element
611 	 *
612 	 * Returns: the element's data, or %NULL if the position
613 	 *     is off the end of the #GList
614 	 */
615 	public void* nthData(uint n)
616 	{
617 		return g_list_nth_data(gList, n);
618 	}
619 
620 	/**
621 	 * Gets the element @n places before @list.
622 	 *
623 	 * Params:
624 	 *     n = the position of the element, counting from 0
625 	 *
626 	 * Returns: the element, or %NULL if the position is
627 	 *     off the end of the #GList
628 	 */
629 	public ListG nthPrev(uint n)
630 	{
631 		auto p = g_list_nth_prev(gList, n);
632 		
633 		if(p is null)
634 		{
635 			return null;
636 		}
637 		
638 		return new ListG(cast(GList*) p);
639 	}
640 
641 	/**
642 	 * Gets the position of the given element
643 	 * in the #GList (starting from 0).
644 	 *
645 	 * Params:
646 	 *     llink = an element in the #GList
647 	 *
648 	 * Returns: the position of the element in the #GList,
649 	 *     or -1 if the element is not found
650 	 */
651 	public int position(ListG llink)
652 	{
653 		return g_list_position(gList, (llink is null) ? null : llink.getListGStruct());
654 	}
655 
656 	/**
657 	 * Prepends a new element on to the start of the list.
658 	 *
659 	 * Note that the return value is the new start of the list,
660 	 * which will have changed, so make sure you store the new value.
661 	 *
662 	 * |[<!-- language="C" -->
663 	 * // Notice that it is initialized to the empty list.
664 	 * GList *list = NULL;
665 	 *
666 	 * list = g_list_prepend (list, "last");
667 	 * list = g_list_prepend (list, "first");
668 	 * ]|
669 	 *
670 	 * Do not use this function to prepend a new element to a different
671 	 * element than the start of the list. Use g_list_insert_before() instead.
672 	 *
673 	 * Params:
674 	 *     data = the data for the new element
675 	 *
676 	 * Returns: a pointer to the newly prepended element, which is the new
677 	 *     start of the #GList
678 	 */
679 	public ListG prepend(void* data)
680 	{
681 		auto p = g_list_prepend(gList, data);
682 		
683 		if(p is null)
684 		{
685 			return null;
686 		}
687 		
688 		return new ListG(cast(GList*) p);
689 	}
690 
691 	/**
692 	 * Removes an element from a #GList.
693 	 * If two elements contain the same data, only the first is removed.
694 	 * If none of the elements contain the data, the #GList is unchanged.
695 	 *
696 	 * Params:
697 	 *     data = the data of the element to remove
698 	 *
699 	 * Returns: the (possibly changed) start of the #GList
700 	 */
701 	public ListG remove(void* data)
702 	{
703 		auto p = g_list_remove(gList, data);
704 		
705 		if(p is null)
706 		{
707 			return null;
708 		}
709 		
710 		return new ListG(cast(GList*) p);
711 	}
712 
713 	/**
714 	 * Removes all list nodes with data equal to @data.
715 	 * Returns the new head of the list. Contrast with
716 	 * g_list_remove() which removes only the first node
717 	 * matching the given data.
718 	 *
719 	 * Params:
720 	 *     data = data to remove
721 	 *
722 	 * Returns: the (possibly changed) start of the #GList
723 	 */
724 	public ListG removeAll(void* data)
725 	{
726 		auto p = g_list_remove_all(gList, data);
727 		
728 		if(p is null)
729 		{
730 			return null;
731 		}
732 		
733 		return new ListG(cast(GList*) p);
734 	}
735 
736 	/**
737 	 * Removes an element from a #GList, without freeing the element.
738 	 * The removed element's prev and next links are set to %NULL, so
739 	 * that it becomes a self-contained list with one element.
740 	 *
741 	 * This function is for example used to move an element in the list
742 	 * (see the example for g_list_concat()) or to remove an element in
743 	 * the list before freeing its data:
744 	 * |[<!-- language="C" -->
745 	 * list = g_list_remove_link (list, llink);
746 	 * free_some_data_that_may_access_the_list_again (llink->data);
747 	 * g_list_free (llink);
748 	 * ]|
749 	 *
750 	 * Params:
751 	 *     llink = an element in the #GList
752 	 *
753 	 * Returns: the (possibly changed) start of the #GList
754 	 */
755 	public ListG removeLink(ListG llink)
756 	{
757 		auto p = g_list_remove_link(gList, (llink is null) ? null : llink.getListGStruct());
758 		
759 		if(p is null)
760 		{
761 			return null;
762 		}
763 		
764 		return new ListG(cast(GList*) p);
765 	}
766 
767 	/**
768 	 * Reverses a #GList.
769 	 * It simply switches the next and prev pointers of each element.
770 	 *
771 	 * Returns: the start of the reversed #GList
772 	 */
773 	public ListG reverse()
774 	{
775 		auto p = g_list_reverse(gList);
776 		
777 		if(p is null)
778 		{
779 			return null;
780 		}
781 		
782 		return new ListG(cast(GList*) p);
783 	}
784 
785 	/**
786 	 * Sorts a #GList using the given comparison function. The algorithm
787 	 * used is a stable sort.
788 	 *
789 	 * Params:
790 	 *     compareFunc = the comparison function used to sort the #GList.
791 	 *         This function is passed the data from 2 elements of the #GList
792 	 *         and should return 0 if they are equal, a negative value if the
793 	 *         first element comes before the second, or a positive value if
794 	 *         the first element comes after the second.
795 	 *
796 	 * Returns: the (possibly changed) start of the #GList
797 	 */
798 	public ListG sort(GCompareFunc compareFunc)
799 	{
800 		auto p = g_list_sort(gList, compareFunc);
801 		
802 		if(p is null)
803 		{
804 			return null;
805 		}
806 		
807 		return new ListG(cast(GList*) p);
808 	}
809 
810 	/**
811 	 * Like g_list_sort(), but the comparison function accepts
812 	 * a user data argument.
813 	 *
814 	 * Params:
815 	 *     compareFunc = comparison function
816 	 *     userData = user data to pass to comparison function
817 	 *
818 	 * Returns: the (possibly changed) start of the #GList
819 	 */
820 	public ListG sortWithData(GCompareDataFunc compareFunc, void* userData)
821 	{
822 		auto p = g_list_sort_with_data(gList, compareFunc, userData);
823 		
824 		if(p is null)
825 		{
826 			return null;
827 		}
828 		
829 		return new ListG(cast(GList*) p);
830 	}
831 }