~ubuntu-branches/debian/jessie/glib2.0/jessie

« back to all changes in this revision

Viewing changes to glib/gslist.c

Tags: upstream-2.16.1
Import upstream version 2.16.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
47
47
  return _g_slist_alloc0 ();
48
48
}
49
49
 
50
 
void
51
 
g_slist_free (GSList *slist)
52
 
{
53
 
  g_slice_free_chain (GSList, slist, next);
54
 
}
55
 
 
56
 
void
57
 
g_slist_free_1 (GSList *slist)
58
 
{
59
 
  _g_slist_free1 (slist);
60
 
}
61
 
 
 
50
/**
 
51
 * g_slist_free:
 
52
 * @list: a #GSList
 
53
 *
 
54
 * Frees all of the memory used by a #GSList.
 
55
 * The freed elements are returned to the slice allocator.
 
56
 */
 
57
void
 
58
g_slist_free (GSList *list)
 
59
{
 
60
  g_slice_free_chain (GSList, list, next);
 
61
}
 
62
 
 
63
/**
 
64
 * g_slist_free_1:
 
65
 * @list: a #GSList element
 
66
 * 
 
67
 * Frees one #GSList element.
 
68
 * It is usually used after g_slist_remove_link().
 
69
 */
 
70
void
 
71
g_slist_free_1 (GSList *list)
 
72
{
 
73
  _g_slist_free1 (list);
 
74
}
 
75
 
 
76
/**
 
77
 * g_slist_append:
 
78
 * @list: a #GSList
 
79
 * @data: the data for the new element
 
80
 *
 
81
 * Adds a new element on to the end of the list.
 
82
 *
 
83
 * <note><para>
 
84
 * The return value is the new start of the list, which may 
 
85
 * have changed, so make sure you store the new value.
 
86
 * </para></note>
 
87
 *
 
88
 * <note><para>
 
89
 * Note that g_slist_append() has to traverse the entire list 
 
90
 * to find the end, which is inefficient when adding multiple 
 
91
 * elements. A common idiom to avoid the inefficiency is to prepend 
 
92
 * the elements and reverse the list when all elements have been added.
 
93
 * </para></note>
 
94
 *
 
95
 * |[
 
96
 * /&ast; Notice that these are initialized to the empty list. &ast;/
 
97
 * GSList *list = NULL, *number_list = NULL;
 
98
 *
 
99
 * /&ast; This is a list of strings. &ast;/
 
100
 * list = g_slist_append (list, "first");
 
101
 * list = g_slist_append (list, "second");
 
102
 *
 
103
 * /&ast; This is a list of integers. &ast;/
 
104
 * number_list = g_slist_append (number_list, GINT_TO_POINTER (27));
 
105
 * number_list = g_slist_append (number_list, GINT_TO_POINTER (14));
 
106
 * ]|
 
107
 *
 
108
 * Returns: the new start of the #GSList
 
109
 */
62
110
GSList*
63
111
g_slist_append (GSList   *list,
64
112
                gpointer  data)
82
130
    return new_list;
83
131
}
84
132
 
 
133
/**
 
134
 * g_slist_prepend:
 
135
 * @list: a #GSList
 
136
 * @data: the data for the new element
 
137
 *
 
138
 * Adds a new element on to the start of the list.
 
139
 *
 
140
 * <note><para>
 
141
 * The return value is the new start of the list, which 
 
142
 * may have changed, so make sure you store the new value.
 
143
 * </para></note>
 
144
 *
 
145
 * |[
 
146
 * /&ast; Notice that it is initialized to the empty list. &ast;/
 
147
 * GSList *list = NULL;
 
148
 * list = g_slist_prepend (list, "last");
 
149
 * list = g_slist_prepend (list, "first");
 
150
 * ]|
 
151
 *
 
152
 * Returns: the new start of the #GSList
 
153
 */
85
154
GSList*
86
155
g_slist_prepend (GSList   *list,
87
156
                 gpointer  data)
95
164
  return new_list;
96
165
}
97
166
 
 
167
/**
 
168
 * g_slist_insert:
 
169
 * @list: a #GSList
 
170
 * @data: the data for the new element
 
171
 * @position: the position to insert the element. 
 
172
 *     If this is negative, or is larger than the number 
 
173
 *     of elements in the list, the new element is added on
 
174
 *     to the end of the list.
 
175
 *
 
176
 * Inserts a new element into the list at the given position.
 
177
 *
 
178
 * Returns: the new start of the #GSList
 
179
 */
98
180
GSList*
99
181
g_slist_insert (GSList   *list,
100
182
                gpointer  data,
141
223
  return list;
142
224
}
143
225
 
 
226
/**
 
227
 * g_slist_insert_before:
 
228
 * @slist: a #GSList
 
229
 * @sibling: node to insert @data before
 
230
 * @data: data to put in the newly-inserted node
 
231
 *
 
232
 * Inserts a node before @sibling containing @data. 
 
233
 * 
 
234
 * Returns: the new head of the list.
 
235
 */
144
236
GSList*
145
237
g_slist_insert_before (GSList  *slist,
146
238
                       GSList  *sibling,
181
273
    }
182
274
}
183
275
 
 
276
/**
 
277
 * g_slist_concat:
 
278
 * @list1: a #GSList
 
279
 * @list2: the #GSList to add to the end of the first #GSList
 
280
 *
 
281
 * Adds the second #GSList onto the end of the first #GSList.
 
282
 * Note that the elements of the second #GSList are not copied.
 
283
 * They are used directly.
 
284
 *
 
285
 * Returns: the start of the new #GSList
 
286
 */
184
287
GSList *
185
288
g_slist_concat (GSList *list1, GSList *list2)
186
289
{
195
298
  return list1;
196
299
}
197
300
 
 
301
/**
 
302
 * g_slist_remove:
 
303
 * @list: a #GSList
 
304
 * @data: the data of the element to remove
 
305
 *
 
306
 * Removes an element from a #GSList.
 
307
 * If two elements contain the same data, only the first is removed.
 
308
 * If none of the elements contain the data, the #GSList is unchanged.
 
309
 *
 
310
 * Returns: the new start of the #GSList
 
311
 */
198
312
GSList*
199
313
g_slist_remove (GSList        *list,
200
314
                gconstpointer  data)
221
335
  return list;
222
336
}
223
337
 
 
338
/**
 
339
 * g_slist_remove_all:
 
340
 * @list: a #GSList
 
341
 * @data: data to remove
 
342
 *
 
343
 * Removes all list nodes with data equal to @data. 
 
344
 * Returns the new head of the list. Contrast with 
 
345
 * g_slist_remove() which removes only the first node 
 
346
 * matching the given data.
 
347
 *
 
348
 * Returns: new head of @list
 
349
 */
224
350
GSList*
225
351
g_slist_remove_all (GSList        *list,
226
352
                    gconstpointer  data)
282
408
  return list;
283
409
}
284
410
 
 
411
/**
 
412
 * g_slist_remove_link:
 
413
 * @list: a #GSList
 
414
 * @link_: an element in the #GSList
 
415
 *
 
416
 * Removes an element from a #GSList, without 
 
417
 * freeing the element. The removed element's next 
 
418
 * link is set to %NULL, so that it becomes a
 
419
 * self-contained list with one element.
 
420
 *
 
421
 * Returns: the new start of the #GSList, without the element
 
422
 */
285
423
GSList* 
286
424
g_slist_remove_link (GSList *list,
287
 
                     GSList *link)
 
425
                     GSList *link_)
288
426
{
289
 
  return _g_slist_remove_link (list, link);
 
427
  return _g_slist_remove_link (list, link_);
290
428
}
291
429
 
 
430
/**
 
431
 * g_slist_delete_link:
 
432
 * @list: a #GSList
 
433
 * @link_: node to delete
 
434
 *
 
435
 * Removes the node link_ from the list and frees it. 
 
436
 * Compare this to g_slist_remove_link() which removes the node 
 
437
 * without freeing it.
 
438
 *
 
439
 * Returns: the new head of @list
 
440
 */
292
441
GSList*
293
442
g_slist_delete_link (GSList *list,
294
 
                     GSList *link)
 
443
                     GSList *link_)
295
444
{
296
 
  list = _g_slist_remove_link (list, link);
297
 
  _g_slist_free1 (link);
 
445
  list = _g_slist_remove_link (list, link_);
 
446
  _g_slist_free1 (link_);
298
447
 
299
448
  return list;
300
449
}
301
450
 
 
451
/**
 
452
 * g_slist_copy:
 
453
 * @list: a #GSList
 
454
 * 
 
455
 * Copies a #GSList.
 
456
 * 
 
457
 * <note><para>
 
458
 * Note that this is a "shallow" copy. If the list elements 
 
459
 * consist of pointers to data, the pointers are copied but 
 
460
 * the actual data isn't.
 
461
 * </para></note>
 
462
 *
 
463
 * Returns: a copy of @list
 
464
 */
302
465
GSList*
303
466
g_slist_copy (GSList *list)
304
467
{
325
488
  return new_list;
326
489
}
327
490
 
 
491
/**
 
492
 * g_slist_reverse:
 
493
 * @list: a #GSList
 
494
 *
 
495
 * Reverses a #GSList.
 
496
 *
 
497
 * Returns: the start of the reversed #GSList
 
498
 */
328
499
GSList*
329
500
g_slist_reverse (GSList *list)
330
501
{
343
514
  return prev;
344
515
}
345
516
 
 
517
/**
 
518
 * g_slist_nth:
 
519
 * @list: a #GSList
 
520
 * @n: the position of the element, counting from 0
 
521
 *
 
522
 * Gets the element at the given position in a #GSList.
 
523
 *
 
524
 * Returns: the element, or %NULL if the position is off 
 
525
 *     the end of the #GSList
 
526
 */
346
527
GSList*
347
528
g_slist_nth (GSList *list,
348
529
             guint   n)
353
534
  return list;
354
535
}
355
536
 
 
537
/**
 
538
 * g_slist_nth_data:
 
539
 * @list: a #GSList
 
540
 * @n: the position of the element
 
541
 *
 
542
 * Gets the data of the element at the given position.
 
543
 *
 
544
 * Returns: the element's data, or %NULL if the position 
 
545
 *     is off the end of the #GSList
 
546
 */
356
547
gpointer
357
548
g_slist_nth_data (GSList   *list,
358
549
                  guint     n)
363
554
  return list ? list->data : NULL;
364
555
}
365
556
 
 
557
/**
 
558
 * g_slist_find:
 
559
 * @list: a #GSList
 
560
 * @data: the element data to find
 
561
 *
 
562
 * Finds the element in a #GSList which 
 
563
 * contains the given data.
 
564
 *
 
565
 * Returns: the found #GSList element, 
 
566
 *     or %NULL if it is not found
 
567
 */
366
568
GSList*
367
569
g_slist_find (GSList        *list,
368
570
              gconstpointer  data)
377
579
  return list;
378
580
}
379
581
 
 
582
 
 
583
/**
 
584
 * g_slist_find_custom:
 
585
 * @list: a #GSList
 
586
 * @data: user data passed to the function
 
587
 * @func: the function to call for each element. 
 
588
 *     It should return 0 when the desired element is found
 
589
 *
 
590
 * Finds an element in a #GSList, using a supplied function to 
 
591
 * find the desired element. It iterates over the list, calling 
 
592
 * the given function which should return 0 when the desired 
 
593
 * element is found. The function takes two #gconstpointer arguments, 
 
594
 * the #GSList element's data as the first argument and the 
 
595
 * given user data.
 
596
 *
 
597
 * Returns: the found #GSList element, or %NULL if it is not found
 
598
 */
380
599
GSList*
381
600
g_slist_find_custom (GSList        *list,
382
601
                     gconstpointer  data,
394
613
  return NULL;
395
614
}
396
615
 
 
616
/**
 
617
 * g_slist_position:
 
618
 * @list: a #GSList
 
619
 * @llink: an element in the #GSList
 
620
 *
 
621
 * Gets the position of the given element 
 
622
 * in the #GSList (starting from 0).
 
623
 *
 
624
 * Returns: the position of the element in the #GSList, 
 
625
 *     or -1 if the element is not found
 
626
 */
397
627
gint
398
628
g_slist_position (GSList *list,
399
 
                  GSList *link)
 
629
                  GSList *llink)
400
630
{
401
631
  gint i;
402
632
 
403
633
  i = 0;
404
634
  while (list)
405
635
    {
406
 
      if (list == link)
 
636
      if (list == llink)
407
637
        return i;
408
638
      i++;
409
639
      list = list->next;
412
642
  return -1;
413
643
}
414
644
 
 
645
/**
 
646
 * g_slist_index:
 
647
 * @list: a #GSList
 
648
 * @data: the data to find
 
649
 *
 
650
 * Gets the position of the element containing 
 
651
 * the given data (starting from 0).
 
652
 *
 
653
 * Returns: the index of the element containing the data, 
 
654
 *     or -1 if the data is not found
 
655
 */
415
656
gint
416
657
g_slist_index (GSList        *list,
417
658
               gconstpointer  data)
430
671
  return -1;
431
672
}
432
673
 
 
674
/**
 
675
 * g_slist_last:
 
676
 * @list: a #GSList 
 
677
 *
 
678
 * Gets the last element in a #GSList.
 
679
 *  
 
680
 * <note><para>
 
681
 * This function iterates over the whole list.
 
682
 * </para></note>
 
683
 *
 
684
 * Returns: the last element in the #GSList, 
 
685
 *     or %NULL if the #GSList has no elements
 
686
 */
433
687
GSList*
434
688
g_slist_last (GSList *list)
435
689
{
442
696
  return list;
443
697
}
444
698
 
 
699
/**
 
700
 * g_slist_length:
 
701
 * @list: a #GSList
 
702
 *
 
703
 * Gets the number of elements in a #GSList.
 
704
 *
 
705
 * <note><para>
 
706
 * This function iterates over the whole list to 
 
707
 * count its elements.
 
708
 * </para></note>
 
709
 *
 
710
 * Returns: the number of elements in the #GSList
 
711
 */
445
712
guint
446
713
g_slist_length (GSList *list)
447
714
{
457
724
  return length;
458
725
}
459
726
 
 
727
/**
 
728
 * g_slist_foreach:
 
729
 * @list: a #GSList
 
730
 * @func: the function to call with each element's data
 
731
 * @user_data: user data to pass to the function
 
732
 *
 
733
 * Calls a function for each element of a #GSList.
 
734
 */
460
735
void
461
736
g_slist_foreach (GSList   *list,
462
737
                 GFunc     func,
524
799
    }
525
800
}
526
801
 
 
802
/**
 
803
 * g_slist_insert_sorted:
 
804
 * @list: a #GSList
 
805
 * @data: the data for the new element
 
806
 * @func: the function to compare elements in the list. 
 
807
 *     It should return a number > 0 if the first parameter 
 
808
 *     comes after the second parameter in the sort order.
 
809
 *
 
810
 * Inserts a new element into the list, using the given 
 
811
 * comparison function to determine its position.
 
812
 *
 
813
 * Returns: the new start of the #GSList
 
814
 */
527
815
GSList*
528
816
g_slist_insert_sorted (GSList       *list,
529
817
                       gpointer      data,
532
820
  return g_slist_insert_sorted_real (list, data, (GFunc) func, NULL);
533
821
}
534
822
 
 
823
/**
 
824
 * g_slist_insert_sorted_with_data:
 
825
 * @list: a #GSList
 
826
 * @data: the data for the new element
 
827
 * @func: the function to compare elements in the list. 
 
828
 *     It should return a number > 0 if the first parameter 
 
829
 *     comes after the second parameter in the sort order.
 
830
 * @user_data: data to pass to comparison function
 
831
 *
 
832
 * Inserts a new element into the list, using the given 
 
833
 * comparison function to determine its position.
 
834
 *
 
835
 * Returns: the new start of the #GSList
 
836
 *
 
837
 * Since: 2.10
 
838
 */
535
839
GSList*
536
840
g_slist_insert_sorted_with_data (GSList           *list,
537
841
                                 gpointer          data,
602
906
                             user_data);
603
907
}
604
908
 
 
909
/**
 
910
 * g_slist_sort:
 
911
 * @list: a #GSList
 
912
 * @compare_func: the comparison function used to sort the #GSList.
 
913
 *     This function is passed the data from 2 elements of the #GSList 
 
914
 *     and should return 0 if they are equal, a negative value if the 
 
915
 *     first element comes before the second, or a positive value if 
 
916
 *     the first element comes after the second.
 
917
 *
 
918
 * Sorts a #GSList using the given comparison function.
 
919
 *
 
920
 * Returns: the start of the sorted #GSList
 
921
 */
605
922
GSList *
606
923
g_slist_sort (GSList       *list,
607
924
              GCompareFunc  compare_func)
609
926
  return g_slist_sort_real (list, (GFunc) compare_func, NULL);
610
927
}
611
928
 
 
929
/**
 
930
 * g_slist_sort_with_data:
 
931
 * @list: a #GSList
 
932
 * @compare_func: comparison function
 
933
 * @user_data: data to pass to comparison function
 
934
 *
 
935
 * Like g_slist_sort(), but the sort function accepts a user data argument.
 
936
 *
 
937
 * Returns: new head of the list
 
938
 */
612
939
GSList *
613
940
g_slist_sort_with_data (GSList           *list,
614
941
                        GCompareDataFunc  compare_func,