Enlightenment CVS committal

Author  : cedric
Project : e17
Module  : proto/eina

Dir     : e17/proto/eina/src/lib


Modified Files:
        eina_inlist.c 


Log Message:
Add Inlist Iterator.


===================================================================
RCS file: /cvs/e/e17/proto/eina/src/lib/eina_inlist.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -3 -r1.4 -r1.5
--- eina_inlist.c       6 Aug 2008 18:15:19 -0000       1.4
+++ eina_inlist.c       12 Aug 2008 15:58:41 -0000      1.5
@@ -22,7 +22,108 @@
 /* FIXME: TODO please, refactor this :) */
 
 /*============================================================================*
- *                                   API                                      
* 
+ *                                  Local                                     *
+ 
*============================================================================*/
+typedef struct _Eina_Iterator_Inlist Eina_Iterator_Inlist;
+typedef struct _Eina_Accessor_Inlist Eina_Accessor_Inlist;
+
+struct _Eina_Iterator_Inlist
+{
+       Eina_Iterator iterator;
+       const Eina_Inlist *head;
+       const Eina_Inlist *current;
+};
+
+struct _Eina_Accessor_Inlist
+{
+       Eina_Accessor accessor;
+
+       const Eina_Inlist *head;
+       const Eina_Inlist *current;
+
+       unsigned int index;
+};
+
+static Eina_Bool
+eina_inlist_iterator_next(Eina_Iterator_Inlist *it, void **data) {
+       if (it->current == NULL) return EINA_FALSE;
+       if (data) *data = (void*) it->current;
+
+       it->current = it->current->next;
+
+       return EINA_TRUE;
+}
+
+static Eina_Inlist *
+eina_inlist_iterator_get_container(Eina_Iterator_Inlist *it) {
+       return (Eina_Inlist*) it->head;
+}
+
+static void
+eina_inlist_iterator_free(Eina_Iterator_Inlist *it) {
+       free(it);
+}
+
+static Eina_Bool
+eina_inlist_accessor_get_at(Eina_Accessor_Inlist *it, unsigned int index, void 
**data) {
+       const Eina_Inlist *over;
+       unsigned int middle;
+       unsigned int i;
+
+       if (it->index == index) {
+               over = it->current;
+       } else if (index > it->index) {
+               /* Looking after current. */
+               for (i = it->index, over = it->current;
+                    i < index && over != NULL;
+                    ++i, over = over->next)
+                       ;
+
+               if (over == NULL) return EINA_FALSE;
+       } else {
+               middle = it->index >> 1;
+
+               if (index > middle) {
+                       /* Looking backward from current. */
+                       for (i = it->index, over = it->current;
+                            i > index && over != NULL;
+                            --i, over = over->prev)
+                               ;
+
+                       if (over == NULL) return EINA_FALSE;
+               } else {
+                       /* Looking from the start. */
+                       for (i = 0, over = it->head;
+                            i < index && over != NULL;
+                            ++i, over = over->next)
+                               ;
+
+                       if (over == NULL) return EINA_FALSE;
+               }
+       }
+
+       it->current = over;
+       it->index = index;
+
+       if (data) *data = (void*) over;
+       return EINA_TRUE;
+}
+
+static Eina_Inlist *
+eina_inlist_accessor_get_container(Eina_Accessor_Inlist *it) {
+       return (Eina_Inlist *) it->head;
+}
+
+static void
+eina_inlist_accessor_free(Eina_Accessor_Inlist *it) {
+       free(it);
+}
+
+/*============================================================================*
+ *                                 Global                                     *
+ 
*============================================================================*/
+/*============================================================================*
+ *                                   API                                      *
  
*============================================================================*/
 /**
  * To be documented
@@ -175,4 +276,49 @@
                        return item;
        }
        return NULL;
+}
+
+EAPI Eina_Iterator *eina_inlist_iterator_new(const void *in_list) {
+       Eina_Iterator_Inlist *it;
+
+       if (!in_list) return NULL;
+
+       eina_error_set(0);
+       it = calloc(1, sizeof (Eina_Iterator_Inlist));
+       if (!it) {
+               eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
+               return NULL;
+       }
+
+       it->head = in_list;
+       it->current = in_list;
+
+       it->iterator.next = FUNC_ITERATOR_NEXT(eina_inlist_iterator_next);
+       it->iterator.get_container = 
FUNC_ITERATOR_GET_CONTAINER(eina_inlist_iterator_get_container);
+       it->iterator.free = FUNC_ITERATOR_FREE(eina_inlist_iterator_free);
+
+       return &it->iterator;
+}
+
+EAPI Eina_Accessor *eina_inlist_accessor_new(const void *in_list) {
+       Eina_Accessor_Inlist *it;
+
+       if (!in_list) return NULL;
+
+       eina_error_set(0);
+       it = calloc(1, sizeof (Eina_Accessor_Inlist));
+       if (!it) {
+               eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
+               return NULL;
+       }
+
+       it->head = in_list;
+       it->current = in_list;
+       it->index = 0;
+
+       it->accessor.get_at = FUNC_ACCESSOR_GET_AT(eina_inlist_accessor_get_at);
+       it->accessor.get_container = 
FUNC_ACCESSOR_GET_CONTAINER(eina_inlist_accessor_get_container);
+       it->accessor.free = FUNC_ACCESSOR_FREE(eina_inlist_accessor_free);
+
+       return &it->accessor;
 }



-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to