* @note There's no need to initialize an element before adding it to the list.
* @since 1.1.0
*/
-static inline void eina_clist_add_after(Eina_Clist *elem, Eina_Clist *to_add)
-{
- to_add->next = elem->next;
- to_add->prev = elem;
- elem->next->prev = to_add;
- elem->next = to_add;
-}
+static inline void eina_clist_add_after(Eina_Clist *elem, Eina_Clist *to_add);
/**
* Add an element before the specified one.
* @note There's no need to initialize an element before adding it to the list.
* @since 1.1.0
*/
-static inline void eina_clist_add_before(Eina_Clist *elem, Eina_Clist *to_add)
-{
- to_add->next = elem;
- to_add->prev = elem->prev;
- elem->prev->next = to_add;
- elem->prev = to_add;
-}
+static inline void eina_clist_add_before(Eina_Clist *elem, Eina_Clist *to_add);
/**
* Add element at the head of the list.
* @note There's no need to initialize an element before adding it to the list.
* @since 1.1.0
*/
-static inline void eina_clist_add_head(Eina_Clist *list, Eina_Clist *elem)
-{
- eina_clist_add_after(list, elem);
-}
+static inline void eina_clist_add_head(Eina_Clist *list, Eina_Clist *elem);
/**
* Add element at the tail of the list.
* @note There's no need to initialize an element before adding it to the list.
* @since 1.1.0
*/
-static inline void eina_clist_add_tail(Eina_Clist *list, Eina_Clist *elem)
-{
- eina_clist_add_before(list, elem);
-}
+static inline void eina_clist_add_tail(Eina_Clist *list, Eina_Clist *elem);
/**
* Init an (unlinked) element.
* @note It is not necessary to call this before adding an element to this list.
* @since 1.1.0
*/
-static inline void eina_clist_element_init(Eina_Clist *elem)
-{
- elem->next = NULL;
- elem->prev = NULL;
-}
+static inline void eina_clist_element_init(Eina_Clist *elem);
/**
* Check if an element is in a list or not.
* it has been added to a list or remove from a list.
* @since 1.1.0
*/
-static inline int eina_clist_element_is_linked(Eina_Clist *elem)
-{
- return (elem->next != NULL && elem->prev != NULL);
-}
+static inline int eina_clist_element_is_linked(Eina_Clist *elem);
/**
* Remove an element from its list.
* @post The element is marked as not being in any list
* @since 1.1.0
*/
-static inline void eina_clist_remove(Eina_Clist *elem)
-{
- elem->next->prev = elem->prev;
- elem->prev->next = elem->next;
- eina_clist_element_init(elem);
-}
+static inline void eina_clist_remove(Eina_Clist *elem);
/**
* Get the next element.
* @return The element after @elem in @list or NULL if @a elem is last in @a list
* @since 1.1.0
*/
-static inline Eina_Clist *eina_clist_next(const Eina_Clist *list, const Eina_Clist *elem)
-{
- Eina_Clist *ret = elem->next;
- if (elem->next == list) ret = NULL;
- return ret;
-}
+static inline Eina_Clist *eina_clist_next(const Eina_Clist *list, const Eina_Clist *elem);
/**
* Get the previous element.
* @return The element before @a elem or NULL if @a elem is the first in the list
* @since 1.1.0
*/
-static inline Eina_Clist *eina_clist_prev(const Eina_Clist *list, const Eina_Clist *elem)
-{
- Eina_Clist *ret = elem->prev;
- if (elem->prev == list) ret = NULL;
- return ret;
-}
+static inline Eina_Clist *eina_clist_prev(const Eina_Clist *list, const Eina_Clist *elem);
/**
* Get the first element.
* @returns The first element in @a list or NULL if @a list is empty
* @since 1.1.0
*/
-static inline Eina_Clist *eina_clist_head(const Eina_Clist *list)
-{
- return eina_clist_next(list, list);
-}
+static inline Eina_Clist *eina_clist_head(const Eina_Clist *list);
/**
* Get the last element.
* @returns The last element in @a list or NULL if @list is empty
* @since 1.1.0
*/
-static inline Eina_Clist *eina_clist_tail(const Eina_Clist *list)
-{
- return eina_clist_prev(list, list);
-}
+static inline Eina_Clist *eina_clist_tail(const Eina_Clist *list);
/**
* Check if a list is empty.
* @returns non-zero if @a list is empty, zero if it is not
* @since 1.1.0
*/
-static inline int eina_clist_empty(const Eina_Clist *list)
-{
- return list->next == list;
-}
+static inline int eina_clist_empty(const Eina_Clist *list);
/**
* Initialize a list
* initialize the list by zero'ing out the list head.
* @since 1.1.0
*/
-static inline void eina_clist_init(Eina_Clist *list)
-{
- list->next = list->prev = list;
-}
+static inline void eina_clist_init(Eina_Clist *list);
/**
* Count the elements of a list
* @returns The number of items in the list
* @since 1.1.0
*/
-static inline unsigned int eina_clist_count(const Eina_Clist *list)
-{
- unsigned count = 0;
- const Eina_Clist *ptr;
- for (ptr = list->next; ptr != list; ptr = ptr->next) count++;
- return count;
-}
+static inline unsigned int eina_clist_count(const Eina_Clist *list);
/**
* Move all elements from src to the tail of dst
* @post @a src is initialized but empty after this operation
* @since 1.1.0
*/
-static inline void eina_clist_move_tail(Eina_Clist *dst, Eina_Clist *src)
-{
- if (eina_clist_empty(src)) return;
-
- dst->prev->next = src->next;
- src->next->prev = dst->prev;
- dst->prev = src->prev;
- src->prev->next = dst;
- eina_clist_init(src);
-}
+static inline void eina_clist_move_tail(Eina_Clist *dst, Eina_Clist *src);
/**
* move all elements from src to the head of dst
* @post @a src is initialized but empty after this operation
* @since 1.1.0
*/
-static inline void eina_clist_move_head(Eina_Clist *dst, Eina_Clist *src)
-{
- if (eina_clist_empty(src)) return;
-
- dst->next->prev = src->prev;
- src->prev->next = dst->next;
- dst->next = src->next;
- src->next->prev = dst;
- eina_clist_init(src);
-}
+static inline void eina_clist_move_head(Eina_Clist *dst, Eina_Clist *src);
/**
* iterate through the list
#define EINA_CLIST_ENTRY(elem, type, field) \
((type *)((char *)(elem) - (unsigned long)(&((type *)0)->field)))
+#include "eina_inline_clist.x"
+
/*
* @}
*/
--- /dev/null
+/*
+ * Linked lists support
+ *
+ * Copyright (C) 2002 Alexandre Julliard
+ * Copyright (C) 2011 Mike McCormack (adapted for Eina)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __EINA_CLIST_INLINE_H__
+#define __EINA_CLIST_INLINE_H__
+
+#include <stddef.h>
+
+static inline void eina_clist_add_after(Eina_Clist *elem, Eina_Clist *to_add)
+{
+ to_add->next = elem->next;
+ to_add->prev = elem;
+ elem->next->prev = to_add;
+ elem->next = to_add;
+}
+
+static inline void eina_clist_add_before(Eina_Clist *elem, Eina_Clist *to_add)
+{
+ to_add->next = elem;
+ to_add->prev = elem->prev;
+ elem->prev->next = to_add;
+ elem->prev = to_add;
+}
+
+static inline void eina_clist_add_head(Eina_Clist *list, Eina_Clist *elem)
+{
+ eina_clist_add_after(list, elem);
+}
+
+static inline void eina_clist_add_tail(Eina_Clist *list, Eina_Clist *elem)
+{
+ eina_clist_add_before(list, elem);
+}
+
+static inline void eina_clist_element_init(Eina_Clist *elem)
+{
+ elem->next = NULL;
+ elem->prev = NULL;
+}
+
+static inline int eina_clist_element_is_linked(Eina_Clist *elem)
+{
+ return (elem->next != NULL && elem->prev != NULL);
+}
+
+static inline void eina_clist_remove(Eina_Clist *elem)
+{
+ elem->next->prev = elem->prev;
+ elem->prev->next = elem->next;
+ eina_clist_element_init(elem);
+}
+
+static inline Eina_Clist *eina_clist_next(const Eina_Clist *list, const Eina_Clist *elem)
+{
+ Eina_Clist *ret = elem->next;
+ if (elem->next == list) ret = NULL;
+ return ret;
+}
+
+static inline Eina_Clist *eina_clist_prev(const Eina_Clist *list, const Eina_Clist *elem)
+{
+ Eina_Clist *ret = elem->prev;
+ if (elem->prev == list) ret = NULL;
+ return ret;
+}
+
+static inline Eina_Clist *eina_clist_head(const Eina_Clist *list)
+{
+ return eina_clist_next(list, list);
+}
+
+static inline Eina_Clist *eina_clist_tail(const Eina_Clist *list)
+{
+ return eina_clist_prev(list, list);
+}
+
+static inline int eina_clist_empty(const Eina_Clist *list)
+{
+ return list->next == list;
+}
+
+static inline void eina_clist_init(Eina_Clist *list)
+{
+ list->next = list->prev = list;
+}
+
+static inline unsigned int eina_clist_count(const Eina_Clist *list)
+{
+ unsigned count = 0;
+ const Eina_Clist *ptr;
+ for (ptr = list->next; ptr != list; ptr = ptr->next) count++;
+ return count;
+}
+
+static inline void eina_clist_move_tail(Eina_Clist *dst, Eina_Clist *src)
+{
+ if (eina_clist_empty(src)) return;
+
+ dst->prev->next = src->next;
+ src->next->prev = dst->prev;
+ dst->prev = src->prev;
+ src->prev->next = dst;
+ eina_clist_init(src);
+}
+
+static inline void eina_clist_move_head(Eina_Clist *dst, Eina_Clist *src)
+{
+ if (eina_clist_empty(src)) return;
+
+ dst->next->prev = src->prev;
+ src->prev->next = dst->next;
+ dst->next = src->next;
+ src->next->prev = dst;
+ eina_clist_init(src);
+}
+
+#endif