1d684210ec469baaf3b71cdd5d3f803b2b90fcde
[profile/ivi/eina.git] / src / lib / eina_list.c
1 /* EINA - EFL data type library
2  * Copyright (C) 2002-2008 Carsten Haitzler, Gustavo Sverzut Barbieri, Tilman Sauerbeck,
3  *                         Vincent Torri, Cedric Bail, Jorge Luis Zapata Muga,
4  *                         Corey Donohoe, Arnaud de Turckheim, Alexandre Becoulet
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library;
18  * if not, see <http://www.gnu.org/licenses/>.
19  *
20  * This file incorporates work covered by the following copyright and
21  * permission notice:
22  *
23  * Copyright (C) 2004 ncn
24  * Copyright (C) 2006 Sebastian Dransfeld
25  * Copyright (C) 2007 Christopher Michael
26  *
27  *  Permission is hereby granted, free of charge, to any person obtaining a copy
28  *  of this software and associated documentation files (the "Software"), to
29  *  deal in the Software without restriction, including without limitation the
30  *  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
31  *  sell copies of the Software, and to permit persons to whom the Software is
32  *  furnished to do so, subject to the following conditions:
33
34  *  The above copyright notice and this permission notice shall be included in
35  *  all copies of the Software and its Copyright notices. In addition publicly
36  *  documented acknowledgment must be given that this software has been used if no
37  *  source code of this software is made available publicly. This includes
38  *  acknowledgments in either Copyright notices, Manuals, Publicity and Marketing
39  *  documents or any documentation provided with any product containing this
40  *  software. This License does not apply to any software that links to the
41  *  libraries provided by this software (statically or dynamically), but only to
42  *  the software provided.
43
44  *  Please see the OLD-COPYING.PLAIN for a plain-english explanation of this notice
45  *  and it's intent.
46
47  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
48  *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
49  *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
50  *  THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
51  *  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
52  *  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
53  */
54
55
56 /**
57  * @page tutorial_list_page List Tutorial
58  *
59  * to be written...
60  *
61  */
62
63 #ifdef HAVE_CONFIG_H
64 # include "config.h"
65 #endif
66
67 #include <stdlib.h>
68 #include <stdio.h>
69 #include <string.h>
70
71 #ifdef HAVE_EVIL
72 # include <Evil.h>
73 #endif
74
75 #include "eina_config.h"
76 #include "eina_private.h"
77 #include "eina_error.h"
78 #include "eina_mempool.h"
79
80 /* undefs EINA_ARG_NONULL() so NULL checks are not compiled out! */
81 #include "eina_safety_checks.h"
82 #include "eina_list.h"
83
84
85 /*============================================================================*
86  *                                  Local                                     *
87  *============================================================================*/
88
89 /**
90  * @cond LOCAL
91  */
92
93 #define EINA_MAGIC_CHECK_LIST(d, ...)                           \
94   do {                                                          \
95     if (!EINA_MAGIC_CHECK(d, EINA_MAGIC_LIST))                  \
96     {                                                           \
97         EINA_MAGIC_FAIL(d, EINA_MAGIC_LIST);                    \
98         return __VA_ARGS__;                                     \
99     }                                                           \
100   } while(0);
101
102 #define EINA_MAGIC_CHECK_LIST_ITERATOR(d, ...)                  \
103   do {                                                          \
104     if (!EINA_MAGIC_CHECK(d, EINA_MAGIC_LIST_ITERATOR))         \
105     {                                                           \
106         EINA_MAGIC_FAIL(d, EINA_MAGIC_LIST_ITERATOR);           \
107         return __VA_ARGS__;                                     \
108     }                                                           \
109   } while(0);
110
111 #define EINA_MAGIC_CHECK_LIST_ACCESSOR(d, ...)                  \
112   do {                                                          \
113     if (!EINA_MAGIC_CHECK(d, EINA_MAGIC_LIST_ACCESSOR))         \
114     {                                                           \
115         EINA_MAGIC_FAIL(d, EINA_MAGIC_LIST_ACCESSOR);           \
116         return __VA_ARGS__;                                     \
117     }                                                           \
118   } while(0);
119
120 #define EINA_MAGIC_CHECK_LIST_ACCOUNTING(d)                     \
121   do {                                                          \
122     if (!EINA_MAGIC_CHECK(d, EINA_MAGIC_LIST_ACCOUNTING))       \
123     {                                                           \
124         EINA_MAGIC_FAIL(d, EINA_MAGIC_LIST_ACCOUNTING);         \
125         return;                                                 \
126     }                                                           \
127   } while(0);
128
129 #define EINA_LIST_SORT_STACK_SIZE 32
130
131 typedef struct _Eina_Iterator_List Eina_Iterator_List;
132 typedef struct _Eina_Accessor_List Eina_Accessor_List;
133
134 struct _Eina_Iterator_List
135 {
136    Eina_Iterator iterator;
137
138    const Eina_List *head;
139    const Eina_List *current;
140
141    EINA_MAGIC
142 };
143
144 struct _Eina_Accessor_List
145 {
146    Eina_Accessor accessor;
147
148    const Eina_List *head;
149    const Eina_List *current;
150
151    unsigned int index;
152
153    EINA_MAGIC
154 };
155
156 static Eina_Mempool *_eina_list_mp = NULL;
157 static Eina_Mempool *_eina_list_accounting_mp = NULL;
158 static int _eina_list_log_dom = -1;
159
160 #define ERR(...) EINA_LOG_DOM_ERR(_eina_list_log_dom, __VA_ARGS__)
161 #define DBG(...) EINA_LOG_DOM_DBG(_eina_list_log_dom, __VA_ARGS__)
162
163 static inline Eina_List_Accounting*
164 _eina_list_mempool_accounting_new(__UNUSED__ Eina_List *list)
165 {
166    Eina_List_Accounting *tmp;
167
168    tmp = eina_mempool_malloc(_eina_list_accounting_mp, sizeof (Eina_List_Accounting));
169    if (!tmp) return NULL;
170
171    EINA_MAGIC_SET(tmp, EINA_MAGIC_LIST_ACCOUNTING);
172
173    return tmp;
174 }
175 static inline void
176 _eina_list_mempool_accounting_free(Eina_List_Accounting *accounting)
177 {
178    EINA_MAGIC_CHECK_LIST_ACCOUNTING(accounting);
179
180    EINA_MAGIC_SET(accounting, EINA_MAGIC_NONE);
181    eina_mempool_free(_eina_list_accounting_mp, accounting);
182 }
183
184 static inline Eina_List*
185 _eina_list_mempool_list_new(__UNUSED__ Eina_List *list)
186 {
187    Eina_List *tmp;
188
189    tmp = eina_mempool_malloc(_eina_list_mp, sizeof (Eina_List));
190    if (!tmp) return NULL;
191
192    EINA_MAGIC_SET(tmp, EINA_MAGIC_LIST);
193
194    return tmp;
195 }
196 static inline void
197 _eina_list_mempool_list_free(Eina_List *list)
198 {
199    EINA_MAGIC_CHECK_LIST(list);
200
201    list->accounting->count--;
202    if (list->accounting->count == 0)
203      _eina_list_mempool_accounting_free(list->accounting);
204
205    EINA_MAGIC_SET(list, EINA_MAGIC_NONE);
206    eina_mempool_free(_eina_list_mp, list);
207 }
208
209 static Eina_List *
210 _eina_list_setup_accounting(Eina_List *list)
211 {
212    EINA_MAGIC_CHECK_LIST(list, NULL);
213
214    list->accounting = _eina_list_mempool_accounting_new(list);
215    if (!list->accounting) goto on_error;
216
217    list->accounting->last = list;
218    list->accounting->count = 1;
219
220    return list;
221
222  on_error:
223    _eina_list_mempool_list_free(list);
224    return NULL;
225 }
226
227 static inline void
228 _eina_list_update_accounting(Eina_List *list, Eina_List *new_list)
229 {
230    EINA_MAGIC_CHECK_LIST(list);
231    EINA_MAGIC_CHECK_LIST(new_list);
232
233    list->accounting->count++;
234    new_list->accounting = list->accounting;
235 }
236
237 #if 0
238 static Eina_Mempool2 _eina_list_mempool =
239 {
240    sizeof(Eina_List),
241    320,
242    0, NULL, NULL
243 };
244 static Eina_Mempool2 _eina_list_accounting_mempool =
245 {
246    sizeof(Eina_List_Accounting),
247    80,
248    0, NULL, NULL
249 };
250 #endif
251
252 static Eina_Bool
253 eina_list_iterator_next(Eina_Iterator_List *it, void **data)
254 {
255    EINA_MAGIC_CHECK_LIST_ITERATOR(it, EINA_FALSE);
256
257    if (it->current == NULL) return EINA_FALSE;
258    *data = eina_list_data_get(it->current);
259
260    it->current = eina_list_next(it->current);
261
262    return EINA_TRUE;
263 }
264
265 static Eina_Bool
266 eina_list_iterator_prev(Eina_Iterator_List *it, void **data)
267 {
268    EINA_MAGIC_CHECK_LIST_ITERATOR(it, EINA_FALSE);
269
270    if (it->current == NULL) return EINA_FALSE;
271    *data = eina_list_data_get(it->current);
272
273    it->current = eina_list_prev(it->current);
274
275    return EINA_TRUE;
276 }
277
278 static Eina_List *
279 eina_list_iterator_get_container(Eina_Iterator_List *it)
280 {
281    EINA_MAGIC_CHECK_LIST_ITERATOR(it, NULL);
282
283    return (Eina_List *) it->head;
284 }
285
286 static void
287 eina_list_iterator_free(Eina_Iterator_List *it)
288 {
289    EINA_MAGIC_CHECK_LIST_ITERATOR(it);
290
291    MAGIC_FREE(it);
292 }
293
294 static Eina_Bool
295 eina_list_accessor_get_at(Eina_Accessor_List *it, unsigned int index, void **data)
296 {
297    const Eina_List *over;
298    unsigned int middle;
299    unsigned int i;
300
301    EINA_MAGIC_CHECK_LIST_ACCESSOR(it, EINA_FALSE);
302
303    if (index >= eina_list_count(it->head)) return EINA_FALSE;
304
305    if (it->index == index)
306      {
307         over = it->current;
308      }
309    else if (index > it->index)
310      {
311         /* After current position. */
312         middle = ((eina_list_count(it->head) - it->index) >> 1) + it->index;
313
314         if (index > middle)
315           {
316              /* Go backward from the end. */
317              for (i = eina_list_count(it->head) - 1, over = eina_list_last(it->head);
318                   i > index && over != NULL;
319                   --i, over = eina_list_prev(over))
320                ;
321           }
322         else
323           {
324              /* Go forward from current. */
325              for (i = it->index, over = it->current;
326                   i < index && over != NULL;
327                   ++i, over = eina_list_next(over))
328                ;
329           }
330      }
331    else
332      {
333         /* Before current position. */
334         middle = it->index >> 1;
335
336         if (index > middle)
337           {
338              /* Go backward from current. */
339              for (i = it->index, over = it->current;
340                   i > index && over != NULL;
341                   --i, over = eina_list_prev(over))
342                ;
343           }
344         else
345           {
346              /* Go forward from start. */
347              for (i = 0, over = it->head;
348                   i < index && over != NULL;
349                   ++i, over = eina_list_next(over))
350                ;
351           }
352      }
353
354    if (over == NULL) return EINA_FALSE;
355
356    it->current = over;
357    it->index = index;
358
359    *data = eina_list_data_get(it->current);
360    return EINA_TRUE;
361 }
362
363 static Eina_List *
364 eina_list_accessor_get_container(Eina_Accessor_List *it)
365 {
366    EINA_MAGIC_CHECK_LIST_ACCESSOR(it, NULL);
367
368    return (Eina_List *) it->head;
369 }
370
371 static void
372 eina_list_accessor_free(Eina_Accessor_List *it)
373 {
374    EINA_MAGIC_CHECK_LIST_ACCESSOR(it);
375
376    MAGIC_FREE(it);
377 }
378
379 static Eina_List *
380 eina_list_sort_rebuild_prev(Eina_List *list)
381 {
382    Eina_List *prev = NULL;
383
384    EINA_MAGIC_CHECK_LIST(list, NULL);
385
386    for (; list; list = list->next)
387      {
388        list->prev = prev;
389        prev = list;
390      }
391
392    return prev;
393 }
394
395 static Eina_List *
396 eina_list_sort_merge(Eina_List *a, Eina_List *b, Eina_Compare_Cb func)
397 {
398    Eina_List *first, *last;
399
400    if (func(a->data, b->data) < 0)
401      a = (last = first = a)->next;
402    else
403      b = (last = first = b)->next;
404
405    while (a && b)
406      if (func(a->data, b->data) < 0)
407        a = (last = last->next = a)->next;
408      else
409        b = (last = last->next = b)->next;
410
411    last->next = a ? a : b;
412
413    return first;
414 }
415
416 /**
417  * @endcond
418  */
419
420 /*============================================================================*
421  *                                 Global                                     *
422  *============================================================================*/
423
424 /*============================================================================*
425  *                                   API                                      *
426  *============================================================================*/
427
428 /**
429  * @addtogroup Eina_List_Group List
430  *
431  * @brief These functions provide double linked list management.
432  *
433  * For more information, you can look at the @ref tutorial_list_page.
434  *
435  * @{
436  */
437
438 /**
439  * @internal
440  * @brief Initialize the list module.
441  *
442  * @return #EINA_TRUE on success, #EINA_FALSE on failure.
443  *
444  * This function sets up the list module of Eina. It is called by
445  * eina_init().
446  *
447  * This function creates mempool to speed up list node and accounting
448  * management, using EINA_MEMPOOL environment variable if it is set to
449  * choose the memory pool type to use.
450  *
451  * @see eina_init()
452  */
453 Eina_Bool
454 eina_list_init(void)
455 {
456    const char *choice, *tmp;
457
458    _eina_list_log_dom = eina_log_domain_register("eina_list", EINA_LOG_COLOR_DEFAULT);
459    if (_eina_list_log_dom < 0)
460      {
461         EINA_LOG_ERR("Could not register log domain: eina_list");
462         return EINA_FALSE;
463      }
464
465 #ifdef EINA_DEFAULT_MEMPOOL
466    choice = "pass_through";
467 #else
468    choice = "chained_mempool";
469 #endif
470    tmp = getenv("EINA_MEMPOOL");
471    if (tmp && tmp[0])
472      choice = tmp;
473
474    _eina_list_mp = eina_mempool_add
475      (choice, "list", NULL, sizeof(Eina_List), 320);
476    if (!_eina_list_mp)
477      {
478         ERR("ERROR: Mempool for list cannot be allocated in list init.");
479         goto on_init_fail;
480      }
481    _eina_list_accounting_mp = eina_mempool_add
482      (choice, "list_accounting", NULL, sizeof(Eina_List_Accounting), 80);
483    if (!_eina_list_accounting_mp)
484      {
485         ERR("ERROR: Mempool for list accounting cannot be allocated in list init.");
486         eina_mempool_del(_eina_list_mp);
487         goto on_init_fail;
488      }
489
490    eina_magic_string_set(EINA_MAGIC_ITERATOR, "Eina Iterator");
491    eina_magic_string_set(EINA_MAGIC_ACCESSOR, "Eina Accessor");
492    eina_magic_string_set(EINA_MAGIC_LIST, "Eina List");
493    eina_magic_string_set(EINA_MAGIC_LIST_ITERATOR, "Eina List Iterator");
494    eina_magic_string_set(EINA_MAGIC_LIST_ACCESSOR, "Eina List Accessor");
495    eina_magic_string_set(EINA_MAGIC_LIST_ACCOUNTING, "Eina List Accounting");
496
497    return EINA_TRUE;
498
499  on_init_fail:
500    eina_log_domain_unregister(_eina_list_log_dom);
501    _eina_list_log_dom = -1;
502    return EINA_FALSE;
503 }
504
505 /**
506  * @internal
507  * @brief Shut down the list module.
508  *
509  * @return #EINA_TRUE on success, #EINA_FALSE on failure.
510  *
511  * This function shuts down the list module set up by
512  * eina_list_init(). It is called by eina_shutdown().
513  *
514  * @see eina_shutdown()
515  */
516 Eina_Bool
517 eina_list_shutdown(void)
518 {
519    eina_mempool_del(_eina_list_accounting_mp);
520    eina_mempool_del(_eina_list_mp);
521
522    eina_log_domain_unregister(_eina_list_log_dom);
523    _eina_list_log_dom = -1;
524    return EINA_TRUE;
525 }
526
527 /**
528  * @brief Append the given data to the given linked list.
529  *
530  * @param list The given list.
531  * @param data The data to append.
532  * @return A list pointer.
533  *
534  * This function appends @p data to @p list. If @p list is @c NULL, a
535  * new list is returned. On success, a new list pointer that should be
536  * used in place of the one given to this function is
537  * returned. Otherwise, the old pointer is returned.
538  *
539  * The following example code demonstrates how to ensure that the
540  * given data has been successfully appended.
541  *
542  * @code
543  * Eina_List *list = NULL;
544  * extern void *my_data;
545  *
546  * list = eina_list_append(list, my_data);
547  * if (eina_error_get())
548  *   {
549  *     fprintf(stderr, "ERROR: Memory is low. List allocation failed.\n");
550  *     exit(-1);
551  *   }
552  * @endcode
553  */
554 EAPI Eina_List *
555 eina_list_append(Eina_List *list, const void *data)
556 {
557    Eina_List *l, *new_l;
558
559    eina_error_set(0);
560    new_l = _eina_list_mempool_list_new(list);
561    if (!new_l) return list;
562    new_l->next = NULL;
563    new_l->data = (void *)data;
564    if (!list)
565      {
566         new_l->prev = NULL;
567         return _eina_list_setup_accounting(new_l);
568      }
569
570    EINA_MAGIC_CHECK_LIST(list, NULL);
571
572    l = list->accounting->last;
573    list->accounting->last = new_l;
574
575    l->next = new_l;
576    new_l->prev = l;
577
578    _eina_list_update_accounting(list, new_l);
579    return list;
580 }
581
582 /**
583  * @brief Prepends the given data to the given linked list.
584  *
585  * @param list The given list.
586  * @param data The data to prepend.
587  * @return A list pointer.
588  *
589  * This function prepends @p data to @p list. If @p list is @c NULL, a
590  * new list is returned. On success, a new list pointer that should be
591  * used in place of the one given to this function is
592  * returned. Otherwise, the old pointer is returned.
593  *
594  * The following example code demonstrates how to ensure that the
595  * given data has been successfully prepended.
596  *
597  * Example:
598  * @code
599  * Eina_List *list = NULL;
600  * extern void *my_data;
601  *
602  * list = eina_list_prepend(list, my_data);
603  * if (eina_error_get())
604  *   {
605  *     fprintf(stderr, "ERROR: Memory is low. List allocation failed.\n");
606  *     exit(-1);
607  *   }
608  * @endcode
609  */
610 EAPI Eina_List *
611 eina_list_prepend(Eina_List *list, const void *data)
612 {
613    Eina_List *new_l;
614
615    eina_error_set(0);
616    new_l = _eina_list_mempool_list_new(list);
617    if (!new_l) return list;
618
619    new_l->prev = NULL;
620    new_l->next = list;
621    new_l->data = (void *)data;
622
623    if (!list) return _eina_list_setup_accounting(new_l);
624
625    EINA_MAGIC_CHECK_LIST(list, NULL);
626
627    list->prev = new_l;
628
629    _eina_list_update_accounting(list, new_l);
630
631    return new_l;
632 }
633
634 /**
635  * @brief Insert the given data into the given linked list after the specified data.
636  *
637  * @param list The given linked list.
638  * @param data The data to insert.
639  * @param relative The data to insert after.
640  * @return A list pointer.
641  *
642  * This function inserts @p data to @p list after @p relative. If
643  * @p relative is not in the list, @p data is appended to the end of
644  * the list.  If @p list is @c NULL, a  new list is returned. If there
645  * are multiple instances of @p relative in the list, @p data is
646  * inserted after the first instance.On success, a new list pointer
647  * that should be used in place of the one given to this function is
648  * returned. Otherwise, the old pointer is returned.
649  *
650  * The following example code demonstrates how to ensure that the
651  * given data has been successfully inserted.
652  *
653  * @code
654  * Eina_List *list = NULL;
655  * extern void *my_data;
656  * extern void *relative_member;
657  *
658  * list = eina_list_append(list, relative_member);
659  * if (eina_error_get())
660  *   {
661  *     fprintf(stderr, "ERROR: Memory is low. List allocation failed.\n");
662  *     exit(-1);
663  *   }
664  * list = eina_list_append_relative(list, my_data, relative_member);
665  * if (eina_error_get())
666  *   {
667  *     fprintf(stderr, "ERROR: Memory is low. List allocation failed.\n");
668  *     exit(-1);
669  *   }
670  * @endcode
671  */
672 EAPI Eina_List *
673 eina_list_append_relative(Eina_List *list, const void *data, const void *relative)
674 {
675    Eina_List *l;
676    void *list_data;
677
678    if (list) EINA_MAGIC_CHECK_LIST(list, NULL);
679
680    EINA_LIST_FOREACH(list, l, list_data)
681      {
682          if (list_data == relative)
683              return eina_list_append_relative_list(list, data, l);
684      }
685
686    return eina_list_append(list, data);
687 }
688
689 /**
690  * @brief Append a list node to a linked list after the specified member
691  *
692  * @param list The given linked list.
693  * @param data The data to insert.
694  * @param relative The list node to insert after.
695  * @return A list pointer.
696  *
697  * This function inserts @p data to @p list after the list node
698  * @p relative. If @p list or @p relative are @c NULL, @p data is just
699  * appended to @p list using eina_list_append(). If @p list is
700  * @c NULL, a  new list is returned. If there are multiple instances
701  * of @p relative in the list, @p data is inserted after the first
702  * instance. On success, a new list pointer that should be used in
703  * place of the one given to this function is returned. Otherwise, the
704  * old pointer is returned.
705  */
706 EAPI Eina_List *
707 eina_list_append_relative_list(Eina_List *list, const void *data, Eina_List *relative)
708 {
709    Eina_List *new_l;
710
711    if ((!list) || (!relative)) return eina_list_append(list, data);
712    eina_error_set(0);
713    new_l = _eina_list_mempool_list_new(list);
714    if (!new_l) return list;
715
716    EINA_MAGIC_CHECK_LIST(relative, NULL);
717    new_l->next = relative->next;
718    new_l->data = (void *)data;
719
720    if (relative->next)
721      relative->next->prev = new_l;
722
723    relative->next = new_l;
724    new_l->prev = relative;
725
726    _eina_list_update_accounting(list, new_l);
727
728    if (!new_l->next)
729      new_l->accounting->last = new_l;
730
731    return list;
732 }
733
734 /**
735  * @brief Prepend a data pointer to a linked list before the specified member
736  *
737  * @param list The given linked list.
738  * @param data The data to insert.
739  * @param relative The data to insert before.
740  * @return A list pointer.
741  *
742  * This function inserts @p data to @p list before @p relative. If
743  * @p relative is not in the list, @p data is prepended to the list
744  * with eina_list_prepend(). If @p list is @c NULL, a  new list is
745  * returned. If there are multiple instances of @p relative in the
746  * list, @p data is inserted before the first instance. On success, a
747  * new list pointer that should be used in place of the one given to
748  * this function is returned. Otherwise, the old pointer is returned.
749  *
750  * The following code example demonstrates how to ensure that the
751  * given data has been successfully inserted.
752  *
753  * @code
754  * Eina_List *list = NULL;
755  * extern void *my_data;
756  * extern void *relative_member;
757  *
758  * list = eina_list_append(list, relative_member);
759  * if (eina_error_get_error())
760  *   {
761  *     fprintf(stderr, "ERROR: Memory is low. List allocation failed.\n");
762  *     exit(-1);
763  *   }
764  * list = eina_list_prepend_relative(list, my_data, relative_member);
765  * if (eina_error_get())
766  *   {
767  *     fprintf(stderr, "ERROR: Memory is low. List allocation failed.\n");
768  *     exit(-1);
769  *   }
770  * @endcode
771  */
772 EAPI Eina_List *
773 eina_list_prepend_relative(Eina_List *list, const void *data, const void *relative)
774 {
775    Eina_List *l;
776    void *list_data;
777
778    if (list) EINA_MAGIC_CHECK_LIST(list, NULL);
779
780    EINA_LIST_FOREACH(list, l, list_data)
781      {
782          if (list_data == relative)
783              return eina_list_prepend_relative_list(list, data, l);
784      }
785    return eina_list_prepend(list, data);
786 }
787
788 /**
789  * @brief Prepend a list node to a linked list before the specified member
790  *
791  * @param list The given linked list.
792  * @param data The data to insert.
793  * @param relative The list node to insert before.
794  * @return A list pointer.
795  *
796  * This function inserts @p data to @p list before the list node
797  * @p relative. If @p list or @p relative are @c NULL, @p data is just
798  * prepended to @p list using eina_list_prepend(). If @p list is
799  * @c NULL, a  new list is returned. If there are multiple instances
800  * of @p relative in the list, @p data is inserted before the first
801  * instance. On success, a new list pointer that should be used in
802  * place of the one given to this function is returned. Otherwise, the
803  * old pointer is returned.
804  */
805 EAPI Eina_List *
806 eina_list_prepend_relative_list(Eina_List *list, const void *data, Eina_List *relative)
807 {
808    Eina_List *new_l;
809
810    if ((!list) || (!relative)) return eina_list_prepend(list, data);
811    eina_error_set(0);
812    new_l = _eina_list_mempool_list_new(list);
813    if (!new_l) return list;
814
815    EINA_MAGIC_CHECK_LIST(relative, NULL);
816
817    new_l->prev = relative->prev;
818    new_l->next = relative;
819    new_l->data = (void *)data;
820
821    if (relative->prev) relative->prev->next = new_l;
822    relative->prev = new_l;
823
824    _eina_list_update_accounting(list, new_l);
825
826    if (new_l->prev)
827      return list;
828
829    return new_l;
830 }
831
832 /**
833  * @brief Insert a new node into a sorted list.
834  *
835  * @param list The given linked list, @b must be sorted.
836  * @param data The data to insert sorted.
837  * @return A list pointer.
838  *
839  * This function inserts values into a linked list assuming it was
840  * sorted and the result will be sorted. If @p list is @c NULLL, a new
841  * list is returned. On success, a new list pointer that should be
842  * used in place of the one given to this function is
843  * returned. Otherwise, the old pointer is returned. See eina_error_get().
844  *
845  * @note O(log2(n)) comparisons (calls to func) average/worst case
846  * performance as it uses eina_list_search_sorted_near_list() and thus
847  * is bounded to that. As said in eina_list_search_sorted_near_list(),
848  * lists do not have O(1) access time, so walking to the correct node
849  * can be costly, consider worst case to be almost O(n) pointer
850  * dereference (list walk).
851  */
852 EAPI Eina_List *
853 eina_list_sorted_insert(Eina_List *list, Eina_Compare_Cb func, const void *data)
854 {
855    Eina_List *lnear;
856    int cmp;
857
858    if (!list) return eina_list_append(NULL, data);
859
860    lnear = eina_list_search_sorted_near_list(list, func, data, &cmp);
861    if (cmp < 0)
862      return eina_list_append_relative_list(list, data, lnear);
863    else
864      return eina_list_prepend_relative_list(list, data, lnear);
865 }
866
867 /**
868  * @brief Remove the first instance of the specified data from the given list.
869  *
870  * @param list The given list.
871  * @param data The specified data.
872  * @return A list pointer.
873  *
874  * This function removes the first instance of @p data from
875  * @p list. If the specified data is not in the given list (tihis
876  * include the case where @p data is @c NULL), nothing is done. If
877  * @p list is @c NULL, @c NULL is returned, otherwise a new list
878  * pointer that should be used in place of the one passed to this
879  * function.
880  */
881 EAPI Eina_List *
882 eina_list_remove(Eina_List *list, const void *data)
883 {
884    Eina_List *l;
885
886    if (list) EINA_MAGIC_CHECK_LIST(list, NULL);
887
888    l = eina_list_data_find_list(list, data);
889    return eina_list_remove_list(list, l);
890 }
891
892 /**
893  * @brief Remove the specified data.
894  *
895  * @param list The given linked list.
896  * @param remove_list The list node which is to be removed.
897  * @return A list pointer.
898  *
899  * This function removes the list node @p remove_list from @p list and
900  * frees the list node structure @p remove_list. If @p list is
901  * @c NULL, this function returns @c NULL. If @p remove_list is
902  * @c NULL, it returns @p list, otherwise, a new list pointer that
903  * should be used in place of the one passed to this function.
904  *
905  * The following code gives an example (notice we use EINA_LIST_FOREACH
906  * instead of EINA_LIST_FOREACH_SAFE because we stop the loop after
907  * removing the current node).
908  *
909  * @code
910  * extern Eina_List *list;
911  * Eina_List *l;
912  * extern void *my_data;
913  * void *data
914  *
915  * EINA_LIST_FOREACH(list, l, data)
916  *   {
917  *     if (data == my_data)
918  *       {
919  *         list = eina_list_remove_list(list, l);
920  *         break;
921  *       }
922  *   }
923  * @endcode
924  */
925 EAPI Eina_List *
926 eina_list_remove_list(Eina_List *list, Eina_List *remove_list)
927 {
928    Eina_List *return_l;
929
930    if (!list) return NULL;
931    if (!remove_list) return list;
932
933    EINA_MAGIC_CHECK_LIST(remove_list, NULL);
934
935    if (remove_list->next) remove_list->next->prev = remove_list->prev;
936    if (remove_list->prev)
937      {
938         remove_list->prev->next = remove_list->next;
939         return_l = list;
940      }
941    else
942      return_l = remove_list->next;
943    if (remove_list == remove_list->accounting->last)
944      {
945        EINA_MAGIC_CHECK_LIST(list, NULL);
946        list->accounting->last = remove_list->prev;
947      }
948    _eina_list_mempool_list_free(remove_list);
949    return return_l;
950 }
951
952 /**
953  * @brief Free an entire list and all the nodes, ignoring the data contained.
954
955  * @param list The list to free
956  * @return A NULL pointer
957  *
958  * This function frees all the nodes of @p list. It does not free the
959  * data of the nodes. To free them, use #EINA_LIST_FREE.
960  */
961 EAPI Eina_List *
962 eina_list_free(Eina_List *list)
963 {
964    Eina_List *l, *free_l;
965
966    if (!list) return NULL;
967
968    EINA_MAGIC_CHECK_LIST(list, NULL);
969
970    for (l = list; l;)
971      {
972         free_l = l;
973         l = l->next;
974
975         _eina_list_mempool_list_free(free_l);
976      }
977
978    return NULL;
979 }
980
981 /**
982  * @brief Move the specified data to the head of the list.
983  *
984  * @param list The list handle to move the data.
985  * @param move_list The list node to move.
986  * @return A new list handle to replace the old one
987  *
988  * This function move @p move_list to the front of @p list. If list is
989  * @c NULL, @c NULL is returned. If @p move_list is @c NULL,
990  * @p list is returned. Otherwise, a new list pointer that should be
991  * used in place of the one passed to this function.
992  *
993  * Example:
994  * @code
995  * extern Eina_List *list;
996  * Eina_List *l;
997  * extern void *my_data;
998  * void *data;
999  *
1000  * EINA_LIST_FOREACH(list, l, data)
1001  *   {
1002  *     if (data == my_data)
1003  *       {
1004  *         list = eina_list_promote_list(list, l);
1005  *         break;
1006  *       }
1007  *   }
1008  * @endcode
1009  */
1010 EAPI Eina_List *
1011 eina_list_promote_list(Eina_List *list, Eina_List *move_list)
1012 {
1013    if (!list) return NULL;
1014    if (!move_list) return list;
1015    /* Promoting head to be head. */
1016    if (move_list == list) return list;
1017    if (move_list->next == list) return move_list;
1018
1019    EINA_MAGIC_CHECK_LIST(list, NULL);
1020    EINA_MAGIC_CHECK_LIST(move_list, NULL);
1021
1022    /* Remove the promoted item from the list. */
1023    if (!move_list->prev)
1024       move_list->next->prev = NULL;
1025    else
1026      {
1027         move_list->prev->next = move_list->next;
1028         if (move_list == list->accounting->last)
1029            list->accounting->last = move_list->prev;
1030         else
1031            move_list->next->prev = move_list->prev;
1032      }
1033
1034    /* Add the promoted item in the list. */
1035    move_list->next = list;
1036    move_list->prev = list->prev;
1037    list->prev = move_list;
1038    if (move_list->prev)
1039       move_list->prev->next = move_list;
1040
1041    return move_list;
1042 }
1043
1044 /**
1045  * @brief Move the specified data to the tail of the list.
1046  *
1047  * @param list The list handle to move the data.
1048  * @param move_list The list node to move.
1049  * @return A new list handle to replace the old one
1050  *
1051  * This function move @p move_list to the back of @p list. If list is
1052  * @c NULL, @c NULL is returned. If @p move_list is @c NULL,
1053  * @p list is returned. Otherwise, a new list pointer that should be
1054  * used in place of the one passed to this function.
1055  *
1056  * Example:
1057  * @code
1058  * extern Eina_List *list;
1059  * Eina_List *l;
1060  * extern void *my_data;
1061  * void *data;
1062  *
1063  * EINA_LIST_FOREACH(list, l, data)
1064  *   {
1065  *     if (data == my_data)
1066  *       {
1067  *         list = eina_list_demote_list(list, l);
1068  *         break;
1069  *       }
1070  *   }
1071  * @endcode
1072  */
1073 EAPI Eina_List *
1074 eina_list_demote_list(Eina_List *list, Eina_List *move_list)
1075 {
1076    if (!list) return NULL;
1077    if (!move_list) return list;
1078    /* Demoting tail to be tail. */
1079    if (move_list == list->accounting->last) return list;
1080
1081    EINA_MAGIC_CHECK_LIST(list, NULL);
1082    EINA_MAGIC_CHECK_LIST(move_list, NULL);
1083
1084    /* Update pointer list if necessary. */
1085    if (list == move_list)
1086       list = move_list->next;
1087    /* Remove the demoted item from the list. */
1088    if (move_list->prev)
1089       move_list->prev->next = move_list->next;
1090    move_list->next->prev = move_list->prev;
1091    /* Add the demoted item in the list. */
1092    move_list->prev = list->accounting->last;
1093    move_list->prev->next = move_list;
1094    move_list->next = NULL;
1095    list->accounting->last = move_list;
1096
1097    return list;
1098 }
1099
1100 /**
1101  * @brief Find a member of a list and return the member.
1102  *
1103  * @param list The list to search for a data.
1104  * @param data The data pointer to find in the list.
1105  * @return The found member data pointer if foun, @c NULL otherwise.
1106  *
1107  * This function searches in @p list from beginning to end for the
1108  * first member whose data pointer is @p data. If it is found, @p data
1109  * will be returned, otherwise NULL will be returned.
1110  *
1111  * Example:
1112  * @code
1113  * extern Eina_List *list;
1114  * extern void *my_data;
1115  *
1116  * if (eina_list_data_find(list, my_data) == my_data)
1117  *   {
1118  *     printf("Found member %p\n", my_data);
1119  *   }
1120  * @endcode
1121  */
1122 EAPI void *
1123 eina_list_data_find(const Eina_List *list, const void *data)
1124 {
1125    if (eina_list_data_find_list(list, data)) return (void*) data;
1126    return NULL;
1127 }
1128
1129 /**
1130  * @brief Find a member of a list and return the list node containing that member.
1131  *
1132  * @param list The list to search for data.
1133  * @param data The data pointer to find in the list.
1134  * @return The found members list node on success, @c NULL otherwise.
1135  *
1136  * This function searches in @p list from beginning to end for the
1137  * first member whose data pointer is @p data. If it is found, the
1138  * list node containing the specified member is returned, otherwise
1139  * @c NULL is returned.
1140  */
1141 EAPI Eina_List *
1142 eina_list_data_find_list(const Eina_List *list, const void *data)
1143 {
1144    const Eina_List *l;
1145    void *list_data;
1146
1147    if (list) EINA_MAGIC_CHECK_LIST(list, NULL);
1148
1149    EINA_LIST_FOREACH(list, l, list_data)
1150      {
1151         if (list_data == data) return (Eina_List *)l;
1152      }
1153
1154    return NULL;
1155 }
1156
1157 /**
1158  * @brief Get the nth member's data pointer in a list.
1159  *
1160  * @param list The list to get the specified member number from.
1161  * @param n The number of the element (0 being the first).
1162  * @return The data pointer stored in the specified element.
1163  *
1164  * This function returns the data pointer of element number @p n, in
1165  * the @p list. The first element in the array is element number 0. If
1166  * the element number @p n does not exist, @c NULL is
1167  * returned. Otherwise, the data of the found element is returned.
1168  */
1169 EAPI void *
1170 eina_list_nth(const Eina_List *list, unsigned int n)
1171 {
1172    Eina_List *l;
1173
1174    l = eina_list_nth_list(list, n);
1175    return l ? l->data : NULL;
1176 }
1177
1178 /**
1179  * @brief Get the nth member's list node in a list.
1180  *
1181  * @param list The list to get the specfied member number from.
1182  * @param n The number of the element (0 being the first).
1183  * @return The list node stored in the numbered element.
1184  *
1185  * This function returns the list node of element number @p n, in
1186  * @ list. The first element in the array is element number 0. If the
1187  * element number @p n does not exist or @p list is @c NULL or @p n is
1188  * greater than the count of elements in @p list minus 1, @c NULL is
1189  * returned. Otherwise the list node stored in the numbered element is
1190  * returned.
1191  */
1192 EAPI Eina_List *
1193 eina_list_nth_list(const Eina_List *list, unsigned int n)
1194 {
1195    const Eina_List *l;
1196    unsigned int i;
1197
1198    if (list) EINA_MAGIC_CHECK_LIST(list, NULL);
1199
1200    /* check for non-existing nodes */
1201    if ((!list) || (n > (list->accounting->count - 1)))
1202      return NULL;
1203
1204    /* if the node is in the 2nd half of the list, search from the end
1205     * else, search from the beginning.
1206     */
1207    if (n > (list->accounting->count / 2))
1208      {
1209         for (i = list->accounting->count - 1,
1210              l = list->accounting->last;
1211              l;
1212              l = l->prev, i--)
1213           {
1214              if (i == n) return (Eina_List *)l;
1215           }
1216      }
1217    else
1218      {
1219         for (i = 0, l = list; l; l = l->next, i++)
1220           {
1221              if (i == n) return (Eina_List *)l;
1222           }
1223      }
1224    abort();
1225 }
1226
1227 /**
1228  * @brief Get the last list node in the list.
1229  *
1230  * @param list The list to get the last list node from.
1231  * @return The last list node in the list.
1232  *
1233  * This function returns the last list node in the list. If @p list is
1234  * @c NULL or empty, @c NULL is returned.
1235  *
1236  * This is a order-1 operation (it takes the same short time
1237  * regardless of the length of the list).
1238  */
1239 static inline Eina_List *eina_list_last(const Eina_List *list);
1240
1241 /**
1242  * @brief Get the next list node after the specified list node.
1243  *
1244  * @param list The list node to get the next list node from
1245  * @return The next list node on success, @c NULL otherwise.
1246  *
1247  * This function returns the next list node after the current one in
1248  * @p list. It is equivalent to list->next. If @p list is @c NULL or
1249  * if no next list node exists, it returns @c NULL.
1250  */
1251 static inline Eina_List *eina_list_next(const Eina_List *list);
1252
1253 /**
1254  * @brief Get the previous list node before the specified list node.
1255  *
1256  * @param list The list node to get the previous list node from.
1257  * @return The previous list node o success, @c NULL otherwise.
1258  * if no previous list node exists
1259  *
1260  * This function returns the previous list node before the current one
1261  * in @p list. It is equivalent to list->prev. If @p list is @c NULL or
1262  * if no previous list node exists, it returns @c NULL.
1263  */
1264 static inline Eina_List *eina_list_prev(const Eina_List *list);
1265
1266 /**
1267  * @brief Get the list node data member.
1268  *
1269  * @param list The list node to get the data member of.
1270  * @return The data member from the list node.
1271  *
1272  * This function returns the data member of the specified list node @p
1273  * list. It is equivalent to list->data. If @p list is @c NULL, this
1274  * function returns @c NULL.
1275  */
1276 static inline void *eina_list_data_get(const Eina_List *list);
1277
1278 /**
1279  * @brief Get the count of the number of items in a list.
1280  *
1281  * @param list The list whose count to return.
1282  * @return The number of members in the list.
1283  *
1284  * This function returns how many members @p list contains. If the
1285  * list is @c NULL, 0 is returned.
1286  *
1287  * NB: This is an order-1 operation and takes the same tiem regardless
1288  * of the length of the list.
1289  */
1290 static inline unsigned int eina_list_count(const Eina_List *list);
1291
1292 /**
1293  * @brief Reverse all the elements in the list.
1294  *
1295  * @param list The list to reverse.
1296  * @return The list head after it has been reversed.
1297  *
1298  * This function reverses the order of all elements in @p list, so the
1299  * last member is now first, and so on. If @p list is @c NULL, this
1300  * functon returns @c NULL.
1301  *
1302  * @note @b in-place: this will change the given list, so you should
1303  * now point to the new list head that is returned by this function.
1304  *
1305  * @see eina_list_reverse_clone()
1306  * @see eina_list_iterator_reversed_new()
1307  */
1308 EAPI Eina_List *
1309 eina_list_reverse(Eina_List *list)
1310 {
1311    Eina_List *l1, *l2;
1312
1313    if (!list) return NULL;
1314
1315    EINA_MAGIC_CHECK_LIST(list, NULL);
1316
1317    l1 = list;
1318    l2 = list->accounting->last;
1319    while (l1 != l2)
1320      {
1321         void *data;
1322
1323         data = l1->data;
1324         l1->data = l2->data;
1325         l2->data = data;
1326         l1 = l1->next;
1327         if (l1 == l2) break;
1328         l2 = l2->prev;
1329      }
1330
1331    return list;
1332 }
1333
1334 /**
1335  * @brief Clone (copy) all the elements in the list in reverse order.
1336  *
1337  * @param list The list to reverse.
1338  * @return The new list that has been reversed.
1339  *
1340  * This function reverses the order of all elements in @p list, so the
1341  * last member is now first, and so on. If @p list is @c NULL, this
1342  * functon returns @c NULL. This returns a copy of the given list.
1343  *
1344  * @note @b copy: this will copy the list and you should then
1345  * eina_list_free() when it is not required anymore.
1346  *
1347  * @see eina_list_reverse()
1348  * @see eina_list_clone()
1349  */
1350 EAPI Eina_List *
1351 eina_list_reverse_clone(const Eina_List *list)
1352 {
1353    const Eina_List *l;
1354    Eina_List *clone;
1355    void *data;
1356
1357    if (!list) return NULL;
1358
1359    EINA_MAGIC_CHECK_LIST(list, NULL);
1360
1361    clone = NULL;
1362    EINA_LIST_FOREACH(list, l, data)
1363      clone = eina_list_prepend(clone, data);
1364
1365    return clone;
1366 }
1367
1368 /**
1369  * @brief Clone (copy) all the elements in the list in exact order.
1370  *
1371  * @param list The list to clone.
1372  * @return The new list that has been cloned.
1373  *
1374  * This function clone in order of all elements in @p list. If @p list
1375  * is @c NULL, this functon returns @c NULL. This returns a copy of
1376  * the given list.
1377  *
1378  * @note @b copy: this will copy the list and you should then
1379  * eina_list_free() when it is not required anymore.
1380  *
1381  * @see eina_list_reverse_clone()
1382  */
1383 EAPI Eina_List *
1384 eina_list_clone(const Eina_List *list)
1385 {
1386    const Eina_List *l;
1387    Eina_List *clone;
1388    void *data;
1389
1390    if (!list) return NULL;
1391
1392    EINA_MAGIC_CHECK_LIST(list, NULL);
1393
1394    clone = NULL;
1395    EINA_LIST_FOREACH(list, l, data)
1396      clone = eina_list_append(clone, data);
1397
1398    return clone;
1399 }
1400
1401 /**
1402  * @brief Sort a list according to the ordering func will return.
1403  *
1404  * @param list The list handle to sort.
1405  * @param size The length of the list to sort.
1406  * @param func A function pointer that can handle comparing the list data
1407  * nodes.
1408  * @return the new head of list.
1409  *
1410  * This function sorts @p list. @p size if the number of the first
1411  * element to sort. If @p size is 0 or greater than the number of
1412  * elements in @p list, all the elemnts are sorted. @p func is used to
1413  * compare two elements of @p list. If @p list or @p func are @c NULL,
1414  * this function returns @c NULL.
1415  *
1416  * @note @b in-place: this will change the given list, so you should
1417  * now point to the new list head that is returned by this function.
1418  *
1419  * @note worst case is O(n * log2(n)) comparisons (calls to func()),
1420  * O(n) comparisons average case. That means that for 1,000,000 list
1421  * elements, sort will usually do 1,000,000 comparisons, but may do up
1422  * to 20,000,000.
1423  *
1424  * Example:
1425  * @code
1426  * int
1427  * sort_cb(const void *d1, const void *d2)
1428  * {
1429  *    const char *txt = NULL;
1430  *    const char *txt2 = NULL;
1431  *
1432  *    if(!d1) return(1);
1433  *    if(!d2) return(-1);
1434  *
1435  *    return(strcmp((const char*)d1, (const char*)d2));
1436  * }
1437  * extern Eina_List *list;
1438  *
1439  * list = eina_list_sort(list, eina_list_count(list), sort_cb);
1440  * @endcode
1441  */
1442 EAPI Eina_List *
1443 eina_list_sort(Eina_List *list, unsigned int size, Eina_Compare_Cb func)
1444 {
1445    unsigned int i = 0;
1446    unsigned int n = 0;
1447    Eina_List *tail = list;
1448    Eina_List *unsort = NULL;
1449    Eina_List *stack[EINA_LIST_SORT_STACK_SIZE];
1450
1451    EINA_SAFETY_ON_NULL_RETURN_VAL(func, list);
1452    if (!list) return NULL;
1453    EINA_MAGIC_CHECK_LIST(list, NULL);
1454
1455    /* if the caller specified an invalid size, sort the whole list */
1456    if ((size == 0) ||
1457        (size > list->accounting->count))
1458      size = list->accounting->count;
1459
1460    if (size != list->accounting->count)
1461      {
1462         unsort = eina_list_nth_list(list, size);
1463         if (unsort)
1464           unsort->prev->next = NULL;
1465      }
1466
1467    while (tail)
1468      {
1469        unsigned int idx, tmp;
1470
1471        Eina_List *a = tail;
1472        Eina_List *b = tail->next;
1473
1474        if (!b)
1475          {
1476            stack[i++] = a;
1477            break;
1478          }
1479
1480        tail = b->next;
1481
1482        if (func(a->data, b->data) < 0)
1483          ((stack[i++] = a)->next = b)->next = 0;
1484        else
1485          ((stack[i++] = b)->next = a)->next = 0;
1486
1487        tmp = n++;
1488        for (idx = n ^ tmp; idx &= idx - 1; i--)
1489          stack[i-2] = eina_list_sort_merge(stack[i-2], stack[i-1], func);
1490      }
1491
1492    while (i-- > 1)
1493      stack[i-1] = eina_list_sort_merge(stack[i-1], stack[i], func);
1494
1495    list = stack[0];
1496    tail = eina_list_sort_rebuild_prev(list);
1497
1498    if (unsort)
1499      {
1500        tail->next = unsort;
1501        unsort->prev = tail;
1502      }
1503    else
1504      list->accounting->last = tail;
1505
1506    return list;
1507 }
1508
1509 /**
1510  * @brief Merge two list.
1511  *
1512  * @param left Head list to merge.
1513  * @param right Tail list to merge.
1514  * @return A new merged list.
1515  *
1516  * This function put right at the end of left and return the head.
1517  *
1518  * Both left and right does not exist anymore after the merge.
1519  *
1520  * @note merge cost is O(n), being @b n the size of the smallest
1521  * list. This is due the need to fix accounting of that segment,
1522  * making count and last access O(1).
1523  */
1524 EAPI Eina_List *
1525 eina_list_merge(Eina_List *left, Eina_List *right)
1526 {
1527    unsigned int n_left, n_right;
1528
1529    if (!left) return right;
1530    if (!right) return left;
1531
1532    left->accounting->last->next = right;
1533    right->prev = left->accounting->last;
1534
1535    n_left = left->accounting->count;
1536    n_right = right->accounting->count;
1537
1538    if (n_left >= n_right)
1539      {
1540         Eina_List *itr = right;
1541         left->accounting->last = right->accounting->last;
1542         left->accounting->count += n_right;
1543
1544         _eina_list_mempool_accounting_free(right->accounting);
1545
1546         do
1547           {
1548              itr->accounting = left->accounting;
1549              itr = itr->next;
1550           }
1551         while (itr);
1552      }
1553    else
1554      {
1555         Eina_List *itr = left->accounting->last;
1556         right->accounting->count += n_left;
1557
1558         _eina_list_mempool_accounting_free(left->accounting);
1559
1560         do
1561           {
1562              itr->accounting = right->accounting;
1563              itr = itr->prev;
1564           }
1565         while (itr);
1566      }
1567
1568    return left;
1569 }
1570
1571 /**
1572  * @brief Merge two sorted list according to the ordering func will return.
1573  *
1574  * @param left First list to merge.
1575  * @param right Second list to merge.
1576  * @param func A function pointer that can handle comparing the list data
1577  * nodes.
1578  * @return A new sorted list.
1579  *
1580  * This function compare the head of @p left and @p right, and choose the
1581  * smallest one to be head of the returned list. It will continue this process
1582  * for all entry of both list.
1583  *
1584  * Both left and right does not exist anymore after the merge.
1585  * If @p func is NULL, it will return NULL.
1586  *
1587  * Example:
1588  * @code
1589  * int
1590  * sort_cb(void *d1, void *d2)
1591  * {
1592  *   const char *txt = NULL;
1593  *    const char *txt2 = NULL;
1594  *
1595  *    if(!d1) return(1);
1596  *    if(!d2) return(-1);
1597  *
1598  *    return(strcmp((const char*)d1, (const char*)d2));
1599  * }
1600  * extern Eina_List *sorted1;
1601  * extern Eina_List *sorted2;
1602  *
1603  * list = eina_list_sorted_merge(sorted1, sorted2, sort_cb);
1604  * @endcode
1605  */
1606 EAPI Eina_List *
1607 eina_list_sorted_merge(Eina_List *left, Eina_List *right, Eina_Compare_Cb func)
1608 {
1609    Eina_List *ret;
1610    Eina_List *current;
1611
1612    EINA_SAFETY_ON_NULL_RETURN_VAL(func, NULL);
1613
1614    if (!left) return right;
1615    if (!right) return left;
1616
1617    if (func(left->data, right->data) < 0)
1618      {
1619         ret = left;
1620         current = left;
1621         left = left->next;
1622         ret->accounting->count += right->accounting->count;
1623
1624         _eina_list_mempool_accounting_free(right->accounting);
1625      }
1626    else
1627      {
1628         ret = right;
1629         current = right;
1630         right = right->next;
1631         ret->accounting->count += left->accounting->count;
1632
1633         _eina_list_mempool_accounting_free(left->accounting);
1634      }
1635
1636    while (left && right)
1637      {
1638         if (func(left->data, right->data) < 0)
1639           {
1640              current->next = left;
1641              left->prev = current;
1642              left = left->next;
1643           }
1644         else
1645           {
1646              current->next = right;
1647              right->prev = current;
1648              right = right->next;
1649           }
1650
1651         current = current->next;
1652         current->accounting = ret->accounting;
1653      }
1654
1655    if (left)
1656      {
1657         current->next = left;
1658         left->prev = current;
1659         current->accounting = ret->accounting;
1660      }
1661
1662    if (right)
1663      {
1664         current->next = right;
1665         right->prev = current;
1666         current->accounting = ret->accounting;
1667      }
1668
1669    while (current->next)
1670      {
1671         current = current->next;
1672         current->accounting = ret->accounting;
1673      }
1674
1675    ret->accounting->last = current;
1676
1677    return ret;
1678 }
1679
1680 /**
1681  * @brief Returns node nearest to data is in the sorted list.
1682  *
1683  * @param list The list to search for data, @b must be sorted.
1684  * @param func A function pointer that can handle comparing the list data nodes.
1685  * @param data reference value to search.
1686  * @param result_cmp if provided returns the result of
1687  * func(node->data, data) node being the last (returned) node. If node
1688  * was found (exact match), then it is 0. If returned node is smaller
1689  * than requested data, it is less than 0 and if it's bigger it's
1690  * greater than 0. It is the last value returned by func().
1691  * @return the nearest node, NULL if not found.
1692  *
1693  * This can be used to check if some value is inside the list and get
1694  * the nearest container node in this case. It should be used when list is
1695  * known to be sorted as it will do binary search for results.
1696  *
1697  * Example: imagine user gives a string, you check if it's in the list
1698  * before duplicating its contents, otherwise you want to insert it
1699  * sorted. In this case you get the result of this function and either
1700  * append or prepend the value.
1701  *
1702  * @note O(log2(n)) average/worst case performance, for 1,000,000
1703  * elements it will do a maximum of 20 comparisons. This is much
1704  * faster than the 1,000,000 comparisons made naively walking the list
1705  * from head to tail, so depending on the number of searches and
1706  * insertions, it may be worth to eina_list_sort() the list and do he
1707  * searches later. As lists do not have O(1) access time, walking to
1708  * the correct node can be costly, consider worst case to be almost
1709  * O(n) pointer dereference (list walk).
1710  *
1711  * @see eina_list_search_sorted_list()
1712  * @see eina_list_sort()
1713  * @see eina_list_sorted_merge()
1714  */
1715 EAPI Eina_List *
1716 eina_list_search_sorted_near_list(const Eina_List *list, Eina_Compare_Cb func, const void *data, int *result_cmp)
1717 {
1718    const Eina_List *ct;
1719    unsigned int inf, sup, cur;
1720    int cmp;
1721
1722    if (!list)
1723      {
1724         if (result_cmp) *result_cmp = 0;
1725         return NULL;
1726      }
1727
1728    if (list->accounting->count == 1)
1729      {
1730         if (result_cmp) *result_cmp = func(list->data, data);
1731         return (Eina_List *)list;
1732      }
1733
1734    /* list walk is expensive, do quick check: tail */
1735    ct = list->accounting->last;
1736    cmp = func(ct->data, data);
1737    if (cmp <= 0)
1738      goto end;
1739
1740    /* list walk is expensive, do quick check: head */
1741    ct = list;
1742    cmp = func(ct->data, data);
1743    if (cmp >= 0)
1744      goto end;
1745
1746    /* inclusive bounds */
1747    inf = 1;
1748    sup = list->accounting->count - 2;
1749    cur = 1;
1750    ct = list->next;
1751
1752    /* no loop, just compare if comparison value is important to caller */
1753    if (inf > sup)
1754      {
1755         if (result_cmp) cmp = func(ct->data, data);
1756         goto end;
1757      }
1758
1759    while (inf <= sup)
1760      {
1761         unsigned int tmp = cur;
1762         cur = inf + ((sup - inf) >> 1);
1763         if      (tmp < cur) for (; tmp != cur; tmp++, ct = ct->next);
1764         else if (tmp > cur) for (; tmp != cur; tmp--, ct = ct->prev);
1765
1766         cmp = func(ct->data, data);
1767         if (cmp == 0)
1768           break;
1769         else if (cmp < 0)
1770           inf = cur + 1;
1771         else if (cmp > 0)
1772           {
1773              if (cur > 0)
1774                sup = cur - 1;
1775              else break;
1776           }
1777         else break;
1778      }
1779
1780  end:
1781    if (result_cmp) *result_cmp = cmp;
1782    return (Eina_List *)ct;
1783 }
1784
1785 /**
1786  * @brief Returns node if data is in the sorted list.
1787  *
1788  * @param list The list to search for data, @b must be sorted.
1789  * @param func A function pointer that can handle comparing the list data nodes.
1790  * @param data reference value to search.
1791  * @return the node if func(node->data, data) == 0, NULL if not found.
1792  *
1793  * This can be used to check if some value is inside the list and get
1794  * the container node in this case. It should be used when list is
1795  * known to be sorted as it will do binary search for results.
1796  *
1797  * Example: imagine user gives a string, you check if it's in the list
1798  * before duplicating its contents.
1799  *
1800  * @note O(log2(n)) average/worst case performance, for 1,000,000
1801  * elements it will do a maximum of 20 comparisons. This is much
1802  * faster than the 1,000,000 comparisons made by
1803  * eina_list_search_unsorted_list(), so depending on the number of
1804  * searches and insertions, it may be worth to eina_list_sort() the
1805  * list and do he searches later. As said in
1806  * eina_list_search_sorted_near_list(), lists do not have O(1) access
1807  * time, so walking to the correct node can be costly, consider worst
1808  * case to be almost O(n) pointer dereference (list walk).
1809  *
1810  * @see eina_list_search_sorted()
1811  * @see eina_list_sort()
1812  * @see eina_list_sorted_merge()
1813  * @see eina_list_search_unsorted_list()
1814  * @see eina_list_search_sorted_near_list()
1815  */
1816 EAPI Eina_List *
1817 eina_list_search_sorted_list(const Eina_List *list, Eina_Compare_Cb func, const void *data)
1818 {
1819    Eina_List *lnear;
1820    int cmp;
1821
1822    lnear = eina_list_search_sorted_near_list(list, func, data, &cmp);
1823    if (!lnear) return NULL;
1824    if (cmp == 0)
1825      return lnear;
1826    return NULL;
1827 }
1828
1829
1830 /**
1831  * @brief Returns node data if it is in the sorted list.
1832  *
1833  * @param list The list to search for data, @b must be sorted.
1834  * @param func A function pointer that can handle comparing the list data nodes.
1835  * @param data reference value to search.
1836  * @return the node value (@c node->data) if func(node->data, data) == 0,
1837  * NULL if not found.
1838  *
1839  * This can be used to check if some value is inside the list and get
1840  * the existing instance in this case. It should be used when list is
1841  * known to be sorted as it will do binary search for results.
1842  *
1843  * Example: imagine user gives a string, you check if it's in the list
1844  * before duplicating its contents.
1845  *
1846  * @note O(log2(n)) average/worst case performance, for 1,000,000
1847  * elements it will do a maximum of 20 comparisons. This is much
1848  * faster than the 1,000,000 comparisons made by
1849  * eina_list_search_unsorted(), so depending on the number of
1850  * searches and insertions, it may be worth to eina_list_sort() the
1851  * list and do he searches later. As said in
1852  * eina_list_search_sorted_near_list(), lists do not have O(1) access
1853  * time, so walking to the correct node can be costly, consider worst
1854  * case to be almost O(n) pointer dereference (list walk).
1855  *
1856  * @see eina_list_search_sorted_list()
1857  * @see eina_list_sort()
1858  * @see eina_list_sorted_merge()
1859  * @see eina_list_search_unsorted_list()
1860  */
1861 EAPI void *
1862 eina_list_search_sorted(const Eina_List *list, Eina_Compare_Cb func, const void *data)
1863 {
1864    return eina_list_data_get(eina_list_search_sorted_list(list, func, data));
1865 }
1866
1867 /**
1868  * @brief Returns node if data is in the unsorted list.
1869  *
1870  * @param list The list to search for data, may be unsorted.
1871  * @param func A function pointer that can handle comparing the list data nodes.
1872  * @param data reference value to search.
1873  * @return the node if func(node->data, data) == 0, NULL if not found.
1874  *
1875  * This can be used to check if some value is inside the list and get
1876  * the container node in this case.
1877  *
1878  * Example: imagine user gives a string, you check if it's in the list
1879  * before duplicating its contents.
1880  *
1881  * @note this is expensive and may walk the whole list, it's order-N,
1882  * that is for 1,000,000 elements list it may walk and compare
1883  * 1,000,000 nodes.
1884  *
1885  * @see eina_list_search_sorted_list()
1886  * @see eina_list_search_unsorted()
1887  */
1888 EAPI Eina_List *
1889 eina_list_search_unsorted_list(const Eina_List *list, Eina_Compare_Cb func, const void *data)
1890 {
1891    const Eina_List *l;
1892    void *d;
1893
1894    EINA_LIST_FOREACH(list, l, d)
1895      {
1896        if (!func(d, data))
1897          return (Eina_List*) l;
1898      }
1899    return NULL;
1900 }
1901
1902 /**
1903  * @brief Returns node data if it is in the unsorted list.
1904  *
1905  * @param list The list to search for data, may be unsorted.
1906  * @param func A function pointer that can handle comparing the list data nodes.
1907  * @param data reference value to search.
1908  * @return the node value (@c node->data) if func(node->data, data) == 0,
1909  * NULL if not found.
1910  *
1911  * This can be used to check if some value is inside the list and get
1912  * the existing instance in this case.
1913  *
1914  * Example: imagine user gives a string, you check if it's in the list
1915  * before duplicating its contents.
1916  *
1917  * @note this is expensive and may walk the whole list, it's order-N,
1918  * that is for 1,000,000 elements list it may walk and compare
1919  * 1,000,000 nodes.
1920  *
1921  * @see eina_list_search_sorted()
1922  * @see eina_list_search_unsorted_list()
1923  */
1924 EAPI void *
1925 eina_list_search_unsorted(const Eina_List *list, Eina_Compare_Cb func, const void *data)
1926 {
1927    return eina_list_data_get(eina_list_search_unsorted_list(list, func, data));
1928 }
1929
1930
1931 /**
1932  * @brief Returned a new iterator asociated to a list.
1933  *
1934  * @param list The list.
1935  * @return A new iterator.
1936  *
1937  * This function returns a newly allocated iterator associated to @p
1938  * list. If @p list is @c NULL or the count member of @p list is less
1939  * or equal than 0, this function still returns a valid iterator that
1940  * will always return false on eina_iterator_next(), thus keeping API
1941  * sane.
1942  *
1943  * If the memory can not be allocated, NULL is returned and
1944  * #EINA_ERROR_OUT_OF_MEMORY is set. Otherwise, a valid iterator is
1945  * returned.
1946  *
1947  * @warning if the list structure changes then the iterator becomes
1948  *    invalid! That is, if you add or remove nodes this iterator
1949  *    behavior is undefined and your program may crash!
1950  */
1951 EAPI Eina_Iterator *
1952 eina_list_iterator_new(const Eina_List *list)
1953 {
1954    Eina_Iterator_List *it;
1955
1956    eina_error_set(0);
1957    it = calloc(1, sizeof (Eina_Iterator_List));
1958    if (!it) {
1959       eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
1960       return NULL;
1961    }
1962
1963    EINA_MAGIC_SET(it, EINA_MAGIC_LIST_ITERATOR);
1964    EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
1965
1966    it->head = list;
1967    it->current = list;
1968
1969    it->iterator.next = FUNC_ITERATOR_NEXT(eina_list_iterator_next);
1970    it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(eina_list_iterator_get_container);
1971    it->iterator.free = FUNC_ITERATOR_FREE(eina_list_iterator_free);
1972
1973    return &it->iterator;
1974 }
1975
1976 /**
1977  * @brief Returned a new reversed iterator asociated to a list.
1978  *
1979  * @param list The list.
1980  * @return A new iterator.
1981  *
1982  * This function returns a newly allocated iterator associated to @p
1983  * list. If @p list is @c NULL or the count member of @p list is less
1984  * or equal than 0, this function still returns a valid iterator that
1985  * will always return false on eina_iterator_next(), thus keeping API
1986  * sane.
1987  *
1988  * Unlike eina_list_iterator_new(), this will walk the list backwards.
1989  *
1990  * If the memory can not be allocated, NULL is returned and
1991  * #EINA_ERROR_OUT_OF_MEMORY is set. Otherwise, a valid iterator is
1992  * returned.
1993  *
1994  * @warning if the list structure changes then the iterator becomes
1995  *    invalid! That is, if you add or remove nodes this iterator
1996  *    behavior is undefined and your program may crash!
1997  */
1998 EAPI Eina_Iterator *
1999 eina_list_iterator_reversed_new(const Eina_List *list)
2000 {
2001    Eina_Iterator_List *it;
2002
2003    eina_error_set(0);
2004    it = calloc(1, sizeof (Eina_Iterator_List));
2005    if (!it) {
2006       eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
2007       return NULL;
2008    }
2009
2010    EINA_MAGIC_SET(it, EINA_MAGIC_LIST_ITERATOR);
2011    EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
2012
2013    it->head = eina_list_last(list);
2014    it->current = it->head;
2015
2016    it->iterator.next = FUNC_ITERATOR_NEXT(eina_list_iterator_prev);
2017    it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(eina_list_iterator_get_container);
2018    it->iterator.free = FUNC_ITERATOR_FREE(eina_list_iterator_free);
2019
2020    return &it->iterator;
2021 }
2022
2023 /**
2024  * @brief Returned a new accessor asociated to a list.
2025  *
2026  * @param list The list.
2027  * @return A new accessor.
2028  *
2029  * This function returns a newly allocated accessor associated to
2030  * @p list. If @p list is @c NULL or the count member of @p list is
2031  * less or equal than 0, this function returns NULL. If the memory can
2032  * not be allocated, NULL is returned and #EINA_ERROR_OUT_OF_MEMORY is
2033  * set. Otherwise, a valid accessor is returned.
2034  */
2035 EAPI Eina_Accessor *
2036 eina_list_accessor_new(const Eina_List *list)
2037 {
2038    Eina_Accessor_List *it;
2039
2040    eina_error_set(0);
2041    it = calloc(1, sizeof (Eina_Accessor_List));
2042    if (!it) {
2043       eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
2044       return NULL;
2045    }
2046
2047    EINA_MAGIC_SET(it, EINA_MAGIC_LIST_ACCESSOR);
2048    EINA_MAGIC_SET(&it->accessor, EINA_MAGIC_ACCESSOR);
2049
2050    it->head = list;
2051    it->current = list;
2052    it->index = 0;
2053
2054    it->accessor.get_at = FUNC_ACCESSOR_GET_AT(eina_list_accessor_get_at);
2055    it->accessor.get_container = FUNC_ACCESSOR_GET_CONTAINER(eina_list_accessor_get_container);
2056    it->accessor.free = FUNC_ACCESSOR_FREE(eina_list_accessor_free);
2057
2058    return &it->accessor;
2059 }
2060
2061 /**
2062  * @}
2063  */