* @cond LOCAL
*/
-static const char EINA_MAGIC_LIST_STR[] = "Eina List";
static const char EINA_MAGIC_LIST_ITERATOR_STR[] = "Eina List Iterator";
static const char EINA_MAGIC_LIST_ACCESSOR_STR[] = "Eina List Accessor";
+#ifdef EINA_LIST_MAGIC
+static const char EINA_MAGIC_LIST_STR[] = "Eina List";
static const char EINA_MAGIC_LIST_ACCOUNTING_STR[] = "Eina List Accounting";
} \
} while(0)
+#define EINA_MAGIC_CHECK_LIST_ACCOUNTING(d) \
+ do { \
+ if (!EINA_MAGIC_CHECK(d, EINA_MAGIC_LIST_ACCOUNTING)) \
+ { \
+ EINA_MAGIC_FAIL(d, EINA_MAGIC_LIST_ACCOUNTING); \
+ return; \
+ } \
+ } while(0)
+#endif
+
#define EINA_MAGIC_CHECK_LIST_ITERATOR(d, ...) \
do { \
if (!EINA_MAGIC_CHECK(d, EINA_MAGIC_LIST_ITERATOR)) \
} \
} while(0)
-#define EINA_MAGIC_CHECK_LIST_ACCOUNTING(d) \
- do { \
- if (!EINA_MAGIC_CHECK(d, EINA_MAGIC_LIST_ACCOUNTING)) \
- { \
- EINA_MAGIC_FAIL(d, EINA_MAGIC_LIST_ACCOUNTING); \
- return; \
- } \
- } while(0)
#define EINA_LIST_SORT_STACK_SIZE 32
const Eina_List *head;
const Eina_List *current;
-
EINA_MAGIC
};
const Eina_List *current;
unsigned int index;
-
EINA_MAGIC
};
sizeof (Eina_List_Accounting));
if (!tmp)
return NULL;
-
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_SET(tmp, EINA_MAGIC_LIST_ACCOUNTING);
-
+#endif
return tmp;
}
static inline void
_eina_list_mempool_accounting_free(Eina_List_Accounting *accounting)
{
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST_ACCOUNTING(accounting);
-
EINA_MAGIC_SET(accounting, EINA_MAGIC_NONE);
+#endif
eina_freeq_ptr_main_add(accounting, _eina_list_accounting_free, sizeof(*accounting));
}
tmp = eina_mempool_malloc(_eina_list_mp, sizeof (Eina_List));
if (!tmp)
return NULL;
-
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_SET(tmp, EINA_MAGIC_LIST);
-
+#endif
return tmp;
}
static inline void
_eina_list_mempool_list_free(Eina_List *list)
{
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list);
-
+#endif
if (list->accounting)
{
list->accounting->count--;
if (list->accounting->count == 0)
_eina_list_mempool_accounting_free(list->accounting);
}
-
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_SET(list, EINA_MAGIC_NONE);
+#endif
eina_freeq_ptr_main_add(list, _eina_list_list_free, sizeof(*list));
}
static Eina_List *
_eina_list_setup_accounting(Eina_List *list)
{
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
list->accounting = _eina_list_mempool_accounting_new(list);
if (!list->accounting)
goto on_error;
static inline void
_eina_list_update_accounting(Eina_List *list, Eina_List *new_list)
{
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list);
EINA_MAGIC_CHECK_LIST(new_list);
-
+#endif
list->accounting->count++;
new_list->accounting = list->accounting;
}
eina_list_iterator_next(Eina_Iterator_List *it, void **data)
{
EINA_MAGIC_CHECK_LIST_ITERATOR(it, EINA_FALSE);
-
if (!it->current)
return EINA_FALSE;
eina_list_iterator_prev(Eina_Iterator_List *it, void **data)
{
EINA_MAGIC_CHECK_LIST_ITERATOR(it, EINA_FALSE);
-
if (!it->current)
return EINA_FALSE;
eina_list_iterator_get_container(Eina_Iterator_List *it)
{
EINA_MAGIC_CHECK_LIST_ITERATOR(it, NULL);
-
return (Eina_List *)it->head;
}
eina_list_iterator_free(Eina_Iterator_List *it)
{
EINA_MAGIC_CHECK_LIST_ITERATOR(it);
-
MAGIC_FREE(it);
}
unsigned int i;
EINA_MAGIC_CHECK_LIST_ACCESSOR(it, EINA_FALSE);
-
if (idx >= eina_list_count(it->head))
return EINA_FALSE;
eina_list_accessor_get_container(Eina_Accessor_List *it)
{
EINA_MAGIC_CHECK_LIST_ACCESSOR(it, NULL);
-
return (Eina_List *)it->head;
}
eina_list_accessor_free(Eina_Accessor_List *it)
{
EINA_MAGIC_CHECK_LIST_ACCESSOR(it);
-
MAGIC_FREE(it);
}
Eina_Accessor_List *ac;
EINA_MAGIC_CHECK_LIST_ACCESSOR(list, NULL);
-
EINA_SAFETY_ON_NULL_RETURN_VAL(list, NULL);
ac = calloc(1, sizeof (Eina_Accessor_List));
{
Eina_List *prev = NULL;
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
for (; list; list = list->next)
{
list->prev = prev;
}
#define EMS(n) eina_magic_string_static_set(n, n ## _STR)
+#ifdef EINA_LIST_MAGIC
EMS(EINA_MAGIC_LIST);
+ EMS(EINA_MAGIC_LIST_ACCOUNTING);
+#endif
EMS(EINA_MAGIC_LIST_ITERATOR);
EMS(EINA_MAGIC_LIST_ACCESSOR);
- EMS(EINA_MAGIC_LIST_ACCOUNTING);
#undef EMS
return EINA_TRUE;
return _eina_list_setup_accounting(new_l);
}
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST_GOTO(list, on_error);
-
+#endif
l = list->accounting->last;
list->accounting->last = new_l;
_eina_list_update_accounting(list, new_l);
return list;
-
+#ifdef EINA_LIST_MAGIC
on_error:
+#endif
_eina_list_mempool_list_free(new_l);
return NULL;
}
if (!list)
return _eina_list_setup_accounting(new_l);
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST_GOTO(list, on_error);
-
+#endif
list->prev = new_l;
_eina_list_update_accounting(list, new_l);
return new_l;
+#ifdef EINA_LIST_MAGIC
on_error:
+#endif
_eina_list_mempool_list_free(new_l);
return NULL;
}
Eina_List *l;
void *list_data;
+#ifdef EINA_LIST_MAGIC
if (list)
EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
EINA_LIST_FOREACH(list, l, list_data)
{
if (list_data == relative)
if ((!list) || (!relative))
return eina_list_append(list, data);
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(relative, NULL);
+#endif
new_l = _eina_list_mempool_list_new(list);
if (!new_l) return list;
Eina_List *l;
void *list_data;
+#ifdef EINA_LIST_MAGIC
if (list)
EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
EINA_LIST_FOREACH(list, l, list_data)
{
if (list_data == relative)
if ((!list) || (!relative))
return eina_list_prepend(list, data);
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(relative, NULL);
-
+#endif
new_l = _eina_list_mempool_list_new(list);
if (!new_l) return list;
{
Eina_List *l;
+#ifdef EINA_LIST_MAGIC
if (list)
EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
l = eina_list_data_find_list(list, data);
return eina_list_remove_list(list, l);
}
if (!remove_list)
return list;
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(remove_list, NULL);
-
+#endif
if (remove_list->next)
remove_list->next->prev = remove_list->prev;
if (remove_list == remove_list->accounting->last)
{
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL);
+#endif
list->accounting->last = remove_list->prev;
}
if (!list)
return NULL;
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
for (l = list; l; )
{
free_l = l;
if (move_list->next == list)
return move_list;
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL);
EINA_MAGIC_CHECK_LIST(move_list, NULL);
-
+#endif
/* Remove the promoted item from the list. */
if (!move_list->prev)
move_list->next->prev = NULL;
if (move_list == list->accounting->last)
return list;
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL);
EINA_MAGIC_CHECK_LIST(move_list, NULL);
-
+#endif
/* Update pointer list if necessary. */
if (list == move_list)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(from, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE);
+#ifdef EINA_LIST_MAGIC
if (*to) EINA_MAGIC_CHECK_LIST(*to, EINA_FALSE);
EINA_MAGIC_CHECK_LIST(*from, EINA_FALSE);
-
+#endif
l = eina_list_data_find_list(*from, data);
EINA_SAFETY_ON_NULL_RETURN_VAL(l, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(to, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(from, EINA_FALSE);
+#ifdef EINA_LIST_MAGIC
if (*to) EINA_MAGIC_CHECK_LIST(*to, EINA_FALSE);
EINA_MAGIC_CHECK_LIST(*from, EINA_FALSE);
EINA_MAGIC_CHECK_LIST(data, EINA_FALSE);
-
+#endif
*to = eina_list_append(*to, data->data);
*from = eina_list_remove_list(*from, data);
return EINA_TRUE;
const Eina_List *l;
void *list_data;
+#ifdef EINA_LIST_MAGIC
if (list)
EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
EINA_LIST_FOREACH(list, l, list_data)
{
if (list_data == data)
const Eina_List *l;
unsigned int i;
+#ifdef EINA_LIST_MAGIC
if (list)
EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
/* check for non-existing nodes */
if ((!list) || (n > (list->accounting->count - 1)))
return NULL;
if (!list)
return NULL;
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
l1 = list;
l2 = list->accounting->last;
while (l1 != l2)
if (!list)
return NULL;
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
lclone = NULL;
EINA_LIST_FOREACH(list, l, data)
lclone = eina_list_prepend(lclone, data);
if (!list)
return NULL;
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
lclone = NULL;
EINA_LIST_FOREACH(list, l, data)
lclone = eina_list_append(lclone, data);
if (!list)
return NULL;
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
/* if the caller specified an invalid limit, sort the whole list */
if ((limit == 0) ||
(limit > list->accounting->count))
if (!list)
return NULL;
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
accounting = list->accounting;
n = accounting->count;
shuffled_list = shuffled_last = NULL;
int ret = 0;
if (!list) return -1;
+#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, -1);
-
+#endif
EINA_LIST_FOREACH(list, l, list_data)
{
if (list_data == data)