jeyzu pushed a commit to branch master.

commit 2036f7d3447d4e568f2736441c839678da310f22
Author: Jérémy Zurcher <[email protected]>
Date:   Tue Apr 9 12:03:05 2013 +0200

    eina: add eina_inlist_first and eina_inlist_last
    
       - both as static inline functions
       - test added in eina_inlist_simple
---
 ChangeLog                         |  4 ++++
 NEWS                              |  2 ++
 src/Makefile_Eina.am              |  1 +
 src/lib/eina/eina_inline_inlist.x | 46 +++++++++++++++++++++++++++++++++++++++
 src/lib/eina/eina_inlist.h        | 34 +++++++++++++++++++++++++++++
 src/tests/eina/eina_test_inlist.c |  6 +++++
 6 files changed, 93 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index f9734d0..2a8e558 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-04-09  Jérémy Zurcher (jeyzu)
+
+        * Eina: Add eina_inlist_first and eina_inlist_last
+
 2013-04-08  Tom Hacohen
 
         * Evas font: Fix a bug with cluster size calculation with texts ending
diff --git a/NEWS b/NEWS
index de6a308..ed33eef 100644
--- a/NEWS
+++ b/NEWS
@@ -23,6 +23,8 @@ Additions:
      - Add eina_list_shuffle()
      - Add eina_file_mkstemp()
      - Add eina_log_timing()
+     - Add eina_inlist_first
+     - Add eina_inlist_last
     * Add Cserve2 scalecache support
     * ecore_x:
      - Add window profile support.
diff --git a/src/Makefile_Eina.am b/src/Makefile_Eina.am
index d79486b..1080b58 100644
--- a/src/Makefile_Eina.am
+++ b/src/Makefile_Eina.am
@@ -26,6 +26,7 @@ lib/eina/eina_clist.h \
 lib/eina/eina_inline_clist.x \
 lib/eina/eina_inarray.h \
 lib/eina/eina_inlist.h \
+lib/eina/eina_inline_inlist.x \
 lib/eina/eina_list.h \
 lib/eina/eina_file.h \
 lib/eina/eina_mempool.h \
diff --git a/src/lib/eina/eina_inline_inlist.x 
b/src/lib/eina/eina_inline_inlist.x
new file mode 100644
index 0000000..f4cd95e
--- /dev/null
+++ b/src/lib/eina/eina_inline_inlist.x
@@ -0,0 +1,46 @@
+/* EINA - EFL data type library
+ * Copyright (C) 2013 Jérémy Zurcher
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef EINA_INLIST_INLINE_H_
+#define EINA_INLIST_INLINE_H_
+
+static inline Eina_Inlist *
+eina_inlist_first(const Eina_Inlist *list)
+{
+   Eina_Inlist *l;
+
+   if (!list) return NULL;
+
+   for (l = (Eina_Inlist*)list; l->prev; l = l->prev);
+
+   return l;
+}
+
+static inline Eina_Inlist *
+eina_inlist_last(const Eina_Inlist *list)
+{
+   Eina_Inlist *l;
+
+   if (!list) return NULL;
+
+   for (l = (Eina_Inlist*)list; l->next; l = l->next);
+
+   return l;
+}
+
+#endif /* EINA_INLIST_INLINE_H_ */
diff --git a/src/lib/eina/eina_inlist.h b/src/lib/eina/eina_inlist.h
index 6a318d7..2829967 100644
--- a/src/lib/eina/eina_inlist.h
+++ b/src/lib/eina/eina_inlist.h
@@ -580,6 +580,38 @@ EAPI Eina_Inlist   *eina_inlist_demote(Eina_Inlist *list,
                                        Eina_Inlist *item) EINA_ARG_NONNULL(1, 
2) EINA_WARN_UNUSED_RESULT;
 
 /**
+ * @brief Get the first list node in the list.
+ *
+ * @param list The list to get the first list node from.
+ * @return The first list node in the list.
+ *
+ * This function returns the first list node in the list @p list. If
+ * @p list is @c NULL, @c NULL is returned.
+ *
+ * This is a O(N) operation (it takes time proportional
+ * to the length of the list).
+ *
+ * @since 1.8
+ */
+static inline Eina_Inlist *eina_inlist_first(const Eina_Inlist *list) 
EINA_PURE EINA_WARN_UNUSED_RESULT;
+
+/**
+ * @brief Get the last list node in the list.
+ *
+ * @param list The list to get the last list node from.
+ * @return The last list node in the list.
+ *
+ * This function returns the last list node in the list @p list. If
+ * @p list is @c NULL, @c NULL is returned.
+ *
+ * This is a O(N) operation (it takes time proportional
+ * to the length of the list).
+ *
+ * @since 1.8
+ */
+static inline Eina_Inlist *eina_inlist_last(const Eina_Inlist *list) EINA_PURE 
EINA_WARN_UNUSED_RESULT;
+
+/**
  * @brief Get the count of the number of items in a list.
  *
  * @param list The list whose count to return.
@@ -825,6 +857,8 @@ EAPI Eina_Inlist *eina_inlist_sort(Eina_Inlist *head, 
Eina_Compare_Cb func);
   for (it = NULL, it = (list ? _EINA_INLIST_CONTAINER(it, list->last) : NULL); 
\
        it; it = (EINA_INLIST_GET(it)->prev ? _EINA_INLIST_CONTAINER(it, 
EINA_INLIST_GET(it)->prev) : NULL))
 
+#include "eina_inline_inlist.x"
+
 /**
  * @}
  */
diff --git a/src/tests/eina/eina_test_inlist.c 
b/src/tests/eina/eina_test_inlist.c
index 7d29b37..46257c8 100644
--- a/src/tests/eina/eina_test_inlist.c
+++ b/src/tests/eina/eina_test_inlist.c
@@ -86,6 +86,7 @@ _eina_test_inlist_build(int i)
 START_TEST(eina_inlist_simple)
 {
    Eina_Inlist *lst = NULL;
+   Eina_Inlist *tmpl = NULL;
    Eina_Test_Inlist *tmp;
    Eina_Test_Inlist *prev;
    int i = 0;
@@ -285,6 +286,11 @@ START_TEST(eina_inlist_simple)
    lst = bkp;
 #endif
 
+   tmpl = eina_inlist_last(lst);
+   fail_if(tmpl == lst);
+   tmpl = eina_inlist_first(tmpl);
+   fail_if(tmpl != lst);
+
    tmp = EINA_INLIST_CONTAINER_GET(lst, Eina_Test_Inlist);
    lst = eina_inlist_demote(lst, lst);
    fail_if(EINA_INLIST_CONTAINER_GET(lst, Eina_Test_Inlist) == tmp);

-- 

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter

Reply via email to