Enlightenment CVS committal

Author  : mej
Project : eterm
Module  : libast

Dir     : eterm/libast/src


Modified Files:
        dlinked_list.c linked_list.c 


Log Message:
Wed Nov 19 17:39:01 2003                        Michael Jennings (mej)

Added linked_list and dlinked_list implementations of the vector
interface.

Added iterator functionality for linked_list and dlinked_list.

Added unit tests for the above.

===================================================================
RCS file: /cvsroot/enlightenment/eterm/libast/src/dlinked_list.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -3 -r1.10 -r1.11
--- dlinked_list.c      19 Nov 2003 04:21:15 -0000      1.10
+++ dlinked_list.c      19 Nov 2003 22:39:57 -0000      1.11
@@ -21,7 +21,7 @@
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-static const char cvs_ident[] = "$Id: dlinked_list.c,v 1.10 2003/11/19 04:21:15 mej 
Exp $";
+static const char cvs_ident[] = "$Id: dlinked_list.c,v 1.11 2003/11/19 22:39:57 mej 
Exp $";
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -29,6 +29,14 @@
 
 #include <libast_internal.h>
 
+/* *INDENT-OFF* */
+SPIF_DECL_OBJ(dlinked_list_iterator) {
+    SPIF_DECL_PARENT_TYPE(obj);
+    spif_dlinked_list_t subject;
+    spif_dlinked_list_item_t current;
+};
+/* *INDENT-ON* */
+
 static spif_dlinked_list_item_t spif_dlinked_list_item_new(void);
 static spif_bool_t spif_dlinked_list_item_init(spif_dlinked_list_item_t);
 static spif_bool_t spif_dlinked_list_item_done(spif_dlinked_list_item_t);
@@ -41,17 +49,22 @@
 static spif_bool_t spif_dlinked_list_item_set_data(spif_dlinked_list_item_t, 
spif_obj_t);
 
 static spif_dlinked_list_t spif_dlinked_list_new(void);
+static spif_dlinked_list_t spif_dlinked_list_vector_new(void);
 static spif_bool_t spif_dlinked_list_init(spif_dlinked_list_t);
+static spif_bool_t spif_dlinked_list_vector_init(spif_dlinked_list_t);
 static spif_bool_t spif_dlinked_list_done(spif_dlinked_list_t);
 static spif_bool_t spif_dlinked_list_del(spif_dlinked_list_t);
 static spif_str_t spif_dlinked_list_show(spif_dlinked_list_t, spif_charptr_t, 
spif_str_t, size_t);
 static spif_cmp_t spif_dlinked_list_comp(spif_dlinked_list_t, spif_dlinked_list_t);
 static spif_dlinked_list_t spif_dlinked_list_dup(spif_dlinked_list_t);
+static spif_dlinked_list_t spif_dlinked_list_vector_dup(spif_dlinked_list_t);
 static spif_classname_t spif_dlinked_list_type(spif_dlinked_list_t);
 static spif_bool_t spif_dlinked_list_append(spif_dlinked_list_t, spif_obj_t);
 static spif_bool_t spif_dlinked_list_contains(spif_dlinked_list_t, spif_obj_t);
+static spif_bool_t spif_dlinked_list_vector_contains(spif_dlinked_list_t, spif_obj_t);
 static size_t spif_dlinked_list_count(spif_dlinked_list_t);
 static spif_obj_t spif_dlinked_list_find(spif_dlinked_list_t, spif_obj_t);
+static spif_obj_t spif_dlinked_list_vector_find(spif_dlinked_list_t, spif_obj_t);
 static spif_obj_t spif_dlinked_list_get(spif_dlinked_list_t, size_t);
 static size_t spif_dlinked_list_index(spif_dlinked_list_t, spif_obj_t);
 static spif_bool_t spif_dlinked_list_insert(spif_dlinked_list_t, spif_obj_t);
@@ -62,6 +75,16 @@
 static spif_obj_t spif_dlinked_list_remove_at(spif_dlinked_list_t, size_t);
 static spif_bool_t spif_dlinked_list_reverse(spif_dlinked_list_t);
 static spif_obj_t *spif_dlinked_list_to_array(spif_dlinked_list_t);
+static spif_dlinked_list_iterator_t 
spif_dlinked_list_iterator_new(spif_dlinked_list_t subject);
+static spif_bool_t spif_dlinked_list_iterator_init(spif_dlinked_list_iterator_t self, 
spif_dlinked_list_t subject);
+static spif_bool_t spif_dlinked_list_iterator_done(spif_dlinked_list_iterator_t self);
+static spif_bool_t spif_dlinked_list_iterator_del(spif_dlinked_list_iterator_t self);
+static spif_str_t spif_dlinked_list_iterator_show(spif_dlinked_list_iterator_t self, 
spif_charptr_t name, spif_str_t buff, size_t indent);
+static spif_cmp_t spif_dlinked_list_iterator_comp(spif_dlinked_list_iterator_t self, 
spif_dlinked_list_iterator_t other);
+static spif_dlinked_list_iterator_t 
spif_dlinked_list_iterator_dup(spif_dlinked_list_iterator_t self);
+static spif_classname_t spif_dlinked_list_iterator_type(spif_dlinked_list_iterator_t 
self);
+static spif_bool_t spif_dlinked_list_iterator_has_next(spif_dlinked_list_iterator_t 
self);
+static spif_obj_t spif_dlinked_list_iterator_next(spif_dlinked_list_iterator_t self);
 
 /* *INDENT-OFF* */
 static SPIF_CONST_TYPE(class) dli_class = {
@@ -105,6 +128,45 @@
     (spif_func_t) spif_dlinked_list_to_array
 };
 spif_listclass_t SPIF_LISTCLASS_VAR(dlinked_list) = &dl_class;
+
+static spif_const_vectorclass_t dlv_class = {
+    {
+        SPIF_DECL_CLASSNAME(dlinked_list),
+        (spif_func_t) spif_dlinked_list_vector_new,
+        (spif_func_t) spif_dlinked_list_vector_init,
+        (spif_func_t) spif_dlinked_list_done,
+        (spif_func_t) spif_dlinked_list_del,
+        (spif_func_t) spif_dlinked_list_show,
+        (spif_func_t) spif_dlinked_list_comp,
+        (spif_func_t) spif_dlinked_list_vector_dup,
+        (spif_func_t) spif_dlinked_list_type
+    },
+    (spif_func_t) spif_dlinked_list_vector_contains,
+    (spif_func_t) spif_dlinked_list_count,
+    (spif_func_t) spif_dlinked_list_vector_find,
+    (spif_func_t) spif_dlinked_list_insert,
+    (spif_func_t) spif_dlinked_list_iterator,
+    (spif_func_t) spif_dlinked_list_remove,
+    (spif_func_t) spif_dlinked_list_to_array
+};
+spif_vectorclass_t SPIF_VECTORCLASS_VAR(dlinked_list) = &dlv_class;
+
+static spif_const_iteratorclass_t dlli_class = {
+    {
+        SPIF_DECL_CLASSNAME(dlinked_list),
+        (spif_func_t) spif_dlinked_list_iterator_new,
+        (spif_func_t) spif_dlinked_list_iterator_init,
+        (spif_func_t) spif_dlinked_list_iterator_done,
+        (spif_func_t) spif_dlinked_list_iterator_del,
+        (spif_func_t) spif_dlinked_list_iterator_show,
+        (spif_func_t) spif_dlinked_list_iterator_comp,
+        (spif_func_t) spif_dlinked_list_iterator_dup,
+        (spif_func_t) spif_dlinked_list_iterator_type
+    },
+    (spif_func_t) spif_dlinked_list_iterator_has_next,
+    (spif_func_t) spif_dlinked_list_iterator_next
+};
+spif_iteratorclass_t SPIF_ITERATORCLASS_VAR(dlinked_list) = &dlli_class;
 /* *INDENT-ON* */
 
 static spif_dlinked_list_item_t
@@ -213,6 +275,16 @@
     return self;
 }
 
+static spif_dlinked_list_t
+spif_dlinked_list_vector_new(void)
+{
+    spif_dlinked_list_t self;
+
+    self = SPIF_ALLOC(dlinked_list);
+    spif_dlinked_list_vector_init(self);
+    return self;
+}
+
 static spif_bool_t
 spif_dlinked_list_init(spif_dlinked_list_t self)
 {
@@ -225,6 +297,17 @@
 }
 
 static spif_bool_t
+spif_dlinked_list_vector_init(spif_dlinked_list_t self)
+{
+    spif_obj_init(SPIF_OBJ(self));
+    spif_obj_set_class(SPIF_OBJ(self), 
SPIF_CLASS(SPIF_VECTORCLASS_VAR(dlinked_list)));
+    self->len = 0;
+    self->head = SPIF_NULL_TYPE(dlinked_list_item);
+    self->tail = SPIF_NULL_TYPE(dlinked_list_item);
+    return TRUE;
+}
+
+static spif_bool_t
 spif_dlinked_list_done(spif_dlinked_list_t self)
 {
     spif_dlinked_list_item_t current;
@@ -308,6 +391,26 @@
     return tmp;
 }
 
+static spif_dlinked_list_t
+spif_dlinked_list_vector_dup(spif_dlinked_list_t self)
+{
+    spif_dlinked_list_t tmp;
+    spif_dlinked_list_item_t src, dest, prev;
+
+    tmp = spif_dlinked_list_vector_new();
+    memcpy(tmp, self, SPIF_SIZEOF_TYPE(dlinked_list));
+    tmp->head = spif_dlinked_list_item_dup(self->head);
+    for (src = self->head, dest = tmp->head, prev = SPIF_NULL_TYPE(dlinked_list_item);
+         src->next;
+         src = src->next, prev = dest, dest = dest->next) {
+        dest->next = spif_dlinked_list_item_dup(src->next);
+        dest->prev = prev;
+    }
+    dest->next = SPIF_NULL_TYPE(dlinked_list_item);
+    tmp->tail = prev;
+    return tmp;
+}
+
 static spif_classname_t
 spif_dlinked_list_type(spif_dlinked_list_t self)
 {
@@ -343,6 +446,12 @@
     return ((SPIF_LIST_ISNULL(spif_dlinked_list_find(self, obj))) ? (FALSE) : (TRUE));
 }
 
+static spif_bool_t
+spif_dlinked_list_vector_contains(spif_dlinked_list_t self, spif_obj_t obj)
+{
+    return ((SPIF_LIST_ISNULL(spif_dlinked_list_vector_find(self, obj))) ? (FALSE) : 
(TRUE));
+}
+
 static size_t
 spif_dlinked_list_count(spif_dlinked_list_t self)
 {
@@ -363,6 +472,24 @@
 }
 
 static spif_obj_t
+spif_dlinked_list_vector_find(spif_dlinked_list_t self, spif_obj_t obj)
+{
+    spif_dlinked_list_item_t current;
+
+    for (current = self->head; current; current = current->next) {
+        spif_cmp_t c;
+
+        c = SPIF_OBJ_COMP(current->data, obj);
+        if (SPIF_CMP_IS_EQUAL(c)) {
+            return current->data;
+        } else if (SPIF_CMP_IS_GREATER(c)) {
+            break;
+        }
+    }
+    return SPIF_NULL_TYPE(obj);
+}
+
+static spif_obj_t
 spif_dlinked_list_get(spif_dlinked_list_t self, size_t idx)
 {
     size_t i;
@@ -455,8 +582,7 @@
 static spif_iterator_t
 spif_dlinked_list_iterator(spif_dlinked_list_t self)
 {
-    USE_VAR(self);
-    return SPIF_NULL_TYPE(iterator);
+    return SPIF_CAST(iterator) spif_dlinked_list_iterator_new(self);
 }
 
 static spif_bool_t
@@ -581,5 +707,121 @@
     for (i = 0, current = self->head; i < self->len; current = current->next, i++) {
         tmp[i] = SPIF_CAST(obj) SPIF_OBJ(spif_dlinked_list_item_get_data(current));
     }
+    return tmp;
+}
+
+static spif_dlinked_list_iterator_t
+spif_dlinked_list_iterator_new(spif_dlinked_list_t subject)
+{
+    spif_dlinked_list_iterator_t self;
+
+    self = SPIF_ALLOC(dlinked_list_iterator);
+    spif_dlinked_list_iterator_init(self, subject);
+    return self;
+}
+
+static spif_bool_t
+spif_dlinked_list_iterator_init(spif_dlinked_list_iterator_t self, 
spif_dlinked_list_t subject)
+{
+    spif_obj_init(SPIF_OBJ(self));
+    spif_obj_set_class(SPIF_OBJ(self), 
SPIF_CLASS(SPIF_ITERATORCLASS_VAR(dlinked_list)));
+    self->subject = subject;
+    if (SPIF_LIST_ISNULL(self->subject)) {
+        self->current = SPIF_NULL_TYPE(dlinked_list_item);
+    } else {
+        self->current = self->subject->head;
+    }
+    return TRUE;
+}
+
+static spif_bool_t
+spif_dlinked_list_iterator_done(spif_dlinked_list_iterator_t self)
+{
+    self->subject = SPIF_NULL_TYPE(dlinked_list);
+    self->current = SPIF_NULL_TYPE(dlinked_list_item);
+    return TRUE;
+}
+
+static spif_bool_t
+spif_dlinked_list_iterator_del(spif_dlinked_list_iterator_t self)
+{
+    spif_dlinked_list_iterator_done(self);
+    SPIF_DEALLOC(self);
+    return TRUE;
+}
+
+static spif_str_t
+spif_dlinked_list_iterator_show(spif_dlinked_list_iterator_t self, spif_charptr_t 
name, spif_str_t buff, size_t indent)
+{
+    char tmp[4096];
+
+    if (SPIF_ITERATOR_ISNULL(self)) {
+        SPIF_OBJ_SHOW_NULL(iterator, name, buff, indent, tmp);
+        return buff;
+    }
+
+    memset(tmp, ' ', indent);
+    snprintf(tmp + indent, sizeof(tmp) - indent, "(spif_dlinked_list_iterator_t) %s:  
%010p {\n", name, self);
+    if (SPIF_STR_ISNULL(buff)) {
+        buff = spif_str_new_from_ptr(tmp);
+    } else {
+        spif_str_append_from_ptr(buff, tmp);
+    }
+
+    buff = spif_dlinked_list_show(self->subject, "subject", buff, indent + 2);
+    buff = spif_dlinked_list_item_show(self->current, "current", buff, indent + 2);
+
+    snprintf(tmp + indent, sizeof(tmp) - indent, "}\n");
+    spif_str_append_from_ptr(buff, tmp);
+    return buff;
+}
+
+static spif_cmp_t
+spif_dlinked_list_iterator_comp(spif_dlinked_list_iterator_t self, 
spif_dlinked_list_iterator_t other)
+{
+    return spif_dlinked_list_comp(self->subject, other->subject);
+}
+
+static spif_dlinked_list_iterator_t
+spif_dlinked_list_iterator_dup(spif_dlinked_list_iterator_t self)
+{
+    spif_dlinked_list_iterator_t tmp;
+
+    tmp = spif_dlinked_list_iterator_new(self->subject);
+    tmp->current = self->current;
+    return tmp;
+}
+
+static spif_classname_t
+spif_dlinked_list_iterator_type(spif_dlinked_list_iterator_t self)
+{
+    return SPIF_OBJ_CLASSNAME(self);
+}
+
+static spif_bool_t
+spif_dlinked_list_iterator_has_next(spif_dlinked_list_iterator_t self)
+{
+    spif_dlinked_list_t subject;
+
+    ASSERT_RVAL(!SPIF_ITERATOR_ISNULL(self), FALSE);
+    subject = self->subject;
+    REQUIRE_RVAL(!SPIF_LIST_ISNULL(subject), FALSE);
+    if (self->current) {
+        return TRUE;
+    } else {
+        return FALSE;
+    }
+}
+
+static spif_obj_t
+spif_dlinked_list_iterator_next(spif_dlinked_list_iterator_t self)
+{
+    spif_obj_t tmp;
+
+    ASSERT_RVAL(!SPIF_ITERATOR_ISNULL(self), SPIF_NULL_TYPE(obj));
+    REQUIRE_RVAL(!SPIF_LIST_ISNULL(self->subject), SPIF_NULL_TYPE(obj));
+    REQUIRE_RVAL(!SPIF_DLINKED_LIST_ITEM_ISNULL(self->current), SPIF_NULL_TYPE(obj));
+    tmp = self->current->data;
+    self->current = self->current->next;
     return tmp;
 }
===================================================================
RCS file: /cvsroot/enlightenment/eterm/libast/src/linked_list.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- linked_list.c       19 Nov 2003 04:21:15 -0000      1.13
+++ linked_list.c       19 Nov 2003 22:39:57 -0000      1.14
@@ -21,7 +21,7 @@
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-static const char cvs_ident[] = "$Id: linked_list.c,v 1.13 2003/11/19 04:21:15 mej 
Exp $";
+static const char cvs_ident[] = "$Id: linked_list.c,v 1.14 2003/11/19 22:39:57 mej 
Exp $";
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -29,6 +29,14 @@
 
 #include <libast_internal.h>
 
+/* *INDENT-OFF* */
+SPIF_DECL_OBJ(linked_list_iterator) {
+    SPIF_DECL_PARENT_TYPE(obj);
+    spif_linked_list_t subject;
+    spif_linked_list_item_t current;
+};
+/* *INDENT-ON* */
+
 static spif_linked_list_item_t spif_linked_list_item_new(void);
 static spif_bool_t spif_linked_list_item_init(spif_linked_list_item_t);
 static spif_bool_t spif_linked_list_item_done(spif_linked_list_item_t);
@@ -41,17 +49,22 @@
 static spif_bool_t spif_linked_list_item_set_data(spif_linked_list_item_t, 
spif_obj_t);
 
 static spif_linked_list_t spif_linked_list_new(void);
+static spif_linked_list_t spif_linked_list_vector_new(void);
 static spif_bool_t spif_linked_list_init(spif_linked_list_t);
+static spif_bool_t spif_linked_list_vector_init(spif_linked_list_t);
 static spif_bool_t spif_linked_list_done(spif_linked_list_t);
 static spif_bool_t spif_linked_list_del(spif_linked_list_t);
 static spif_str_t spif_linked_list_show(spif_linked_list_t, spif_charptr_t, 
spif_str_t, size_t);
 static spif_cmp_t spif_linked_list_comp(spif_linked_list_t, spif_linked_list_t);
 static spif_linked_list_t spif_linked_list_dup(spif_linked_list_t);
+static spif_linked_list_t spif_linked_list_vector_dup(spif_linked_list_t);
 static spif_classname_t spif_linked_list_type(spif_linked_list_t);
 static spif_bool_t spif_linked_list_append(spif_linked_list_t, spif_obj_t);
 static spif_bool_t spif_linked_list_contains(spif_linked_list_t, spif_obj_t);
+static spif_bool_t spif_linked_list_vector_contains(spif_linked_list_t, spif_obj_t);
 static size_t spif_linked_list_count(spif_linked_list_t);
 static spif_obj_t spif_linked_list_find(spif_linked_list_t, spif_obj_t);
+static spif_obj_t spif_linked_list_vector_find(spif_linked_list_t, spif_obj_t);
 static spif_obj_t spif_linked_list_get(spif_linked_list_t, size_t);
 static size_t spif_linked_list_index(spif_linked_list_t, spif_obj_t);
 static spif_bool_t spif_linked_list_insert(spif_linked_list_t, spif_obj_t);
@@ -62,6 +75,16 @@
 static spif_obj_t spif_linked_list_remove_at(spif_linked_list_t, size_t);
 static spif_bool_t spif_linked_list_reverse(spif_linked_list_t);
 static spif_obj_t *spif_linked_list_to_array(spif_linked_list_t);
+static spif_linked_list_iterator_t spif_linked_list_iterator_new(spif_linked_list_t 
subject);
+static spif_bool_t spif_linked_list_iterator_init(spif_linked_list_iterator_t self, 
spif_linked_list_t subject);
+static spif_bool_t spif_linked_list_iterator_done(spif_linked_list_iterator_t self);
+static spif_bool_t spif_linked_list_iterator_del(spif_linked_list_iterator_t self);
+static spif_str_t spif_linked_list_iterator_show(spif_linked_list_iterator_t self, 
spif_charptr_t name, spif_str_t buff, size_t indent);
+static spif_cmp_t spif_linked_list_iterator_comp(spif_linked_list_iterator_t self, 
spif_linked_list_iterator_t other);
+static spif_linked_list_iterator_t 
spif_linked_list_iterator_dup(spif_linked_list_iterator_t self);
+static spif_classname_t spif_linked_list_iterator_type(spif_linked_list_iterator_t 
self);
+static spif_bool_t spif_linked_list_iterator_has_next(spif_linked_list_iterator_t 
self);
+static spif_obj_t spif_linked_list_iterator_next(spif_linked_list_iterator_t self);
 
 /* *INDENT-OFF* */
 static SPIF_CONST_TYPE(class) lli_class = {
@@ -105,6 +128,45 @@
     (spif_func_t) spif_linked_list_to_array
 };
 spif_listclass_t SPIF_LISTCLASS_VAR(linked_list) = &ll_class;
+
+static spif_const_vectorclass_t llv_class = {
+    {
+        SPIF_DECL_CLASSNAME(linked_list),
+        (spif_func_t) spif_linked_list_vector_new,
+        (spif_func_t) spif_linked_list_vector_init,
+        (spif_func_t) spif_linked_list_done,
+        (spif_func_t) spif_linked_list_del,
+        (spif_func_t) spif_linked_list_show,
+        (spif_func_t) spif_linked_list_comp,
+        (spif_func_t) spif_linked_list_vector_dup,
+        (spif_func_t) spif_linked_list_type
+    },
+    (spif_func_t) spif_linked_list_vector_contains,
+    (spif_func_t) spif_linked_list_count,
+    (spif_func_t) spif_linked_list_vector_find,
+    (spif_func_t) spif_linked_list_insert,
+    (spif_func_t) spif_linked_list_iterator,
+    (spif_func_t) spif_linked_list_remove,
+    (spif_func_t) spif_linked_list_to_array
+};
+spif_vectorclass_t SPIF_VECTORCLASS_VAR(linked_list) = &llv_class;
+
+static spif_const_iteratorclass_t li_class = {
+    {
+        SPIF_DECL_CLASSNAME(linked_list),
+        (spif_func_t) spif_linked_list_iterator_new,
+        (spif_func_t) spif_linked_list_iterator_init,
+        (spif_func_t) spif_linked_list_iterator_done,
+        (spif_func_t) spif_linked_list_iterator_del,
+        (spif_func_t) spif_linked_list_iterator_show,
+        (spif_func_t) spif_linked_list_iterator_comp,
+        (spif_func_t) spif_linked_list_iterator_dup,
+        (spif_func_t) spif_linked_list_iterator_type
+    },
+    (spif_func_t) spif_linked_list_iterator_has_next,
+    (spif_func_t) spif_linked_list_iterator_next
+};
+spif_iteratorclass_t SPIF_ITERATORCLASS_VAR(linked_list) = &li_class;
 /* *INDENT-ON* */
 
 static spif_linked_list_item_t
@@ -211,6 +273,16 @@
     return self;
 }
 
+static spif_linked_list_t
+spif_linked_list_vector_new(void)
+{
+    spif_linked_list_t self;
+
+    self = SPIF_ALLOC(linked_list);
+    spif_linked_list_vector_init(self);
+    return self;
+}
+
 static spif_bool_t
 spif_linked_list_init(spif_linked_list_t self)
 {
@@ -222,6 +294,16 @@
 }
 
 static spif_bool_t
+spif_linked_list_vector_init(spif_linked_list_t self)
+{
+    spif_obj_init(SPIF_OBJ(self));
+    spif_obj_set_class(SPIF_OBJ(self), SPIF_CLASS(SPIF_VECTORCLASS_VAR(linked_list)));
+    self->len = 0;
+    self->head = SPIF_NULL_TYPE(linked_list_item);
+    return TRUE;
+}
+
+static spif_bool_t
 spif_linked_list_done(spif_linked_list_t self)
 {
     spif_linked_list_item_t current;
@@ -303,6 +385,22 @@
     return tmp;
 }
 
+static spif_linked_list_t
+spif_linked_list_vector_dup(spif_linked_list_t self)
+{
+    spif_linked_list_t tmp;
+    spif_linked_list_item_t src, dest;
+
+    tmp = spif_linked_list_vector_new();
+    memcpy(tmp, self, SPIF_SIZEOF_TYPE(linked_list));
+    tmp->head = spif_linked_list_item_dup(self->head);
+    for (src = self->head, dest = tmp->head; src->next; src = src->next, dest = 
dest->next) {
+        dest->next = spif_linked_list_item_dup(src->next);
+    }
+    dest->next = SPIF_NULL_TYPE(linked_list_item);
+    return tmp;
+}
+
 static spif_classname_t
 spif_linked_list_type(spif_linked_list_t self)
 {
@@ -336,6 +434,12 @@
     return ((SPIF_LIST_ISNULL(spif_linked_list_find(self, obj))) ? (FALSE) : (TRUE));
 }
 
+static spif_bool_t
+spif_linked_list_vector_contains(spif_linked_list_t self, spif_obj_t obj)
+{
+    return ((SPIF_LIST_ISNULL(spif_linked_list_vector_find(self, obj))) ? (FALSE) : 
(TRUE));
+}
+
 static size_t
 spif_linked_list_count(spif_linked_list_t self)
 {
@@ -356,6 +460,24 @@
 }
 
 static spif_obj_t
+spif_linked_list_vector_find(spif_linked_list_t self, spif_obj_t obj)
+{
+    spif_linked_list_item_t current;
+
+    for (current = self->head; current; current = current->next) {
+        spif_cmp_t c;
+
+        c = SPIF_OBJ_COMP(current->data, obj);
+        if (SPIF_CMP_IS_EQUAL(c)) {
+            return current->data;
+        } else if (SPIF_CMP_IS_GREATER(c)) {
+            break;
+        }
+    }
+    return SPIF_NULL_TYPE(obj);
+}
+
+static spif_obj_t
 spif_linked_list_get(spif_linked_list_t self, size_t idx)
 {
     size_t i;
@@ -425,8 +547,7 @@
 static spif_iterator_t
 spif_linked_list_iterator(spif_linked_list_t self)
 {
-    USE_VAR(self);
-    return SPIF_NULL_TYPE(iterator);
+    return SPIF_CAST(iterator) spif_linked_list_iterator_new(self);
 }
 
 static spif_bool_t
@@ -526,5 +647,121 @@
     for (i = 0, current = self->head; i < self->len; current = current->next, i++) {
         tmp[i] = SPIF_CAST(obj) SPIF_OBJ(spif_linked_list_item_get_data(current));
     }
+    return tmp;
+}
+
+static spif_linked_list_iterator_t
+spif_linked_list_iterator_new(spif_linked_list_t subject)
+{
+    spif_linked_list_iterator_t self;
+
+    self = SPIF_ALLOC(linked_list_iterator);
+    spif_linked_list_iterator_init(self, subject);
+    return self;
+}
+
+static spif_bool_t
+spif_linked_list_iterator_init(spif_linked_list_iterator_t self, spif_linked_list_t 
subject)
+{
+    spif_obj_init(SPIF_OBJ(self));
+    spif_obj_set_class(SPIF_OBJ(self), 
SPIF_CLASS(SPIF_ITERATORCLASS_VAR(linked_list)));
+    self->subject = subject;
+    if (SPIF_LIST_ISNULL(self->subject)) {
+        self->current = SPIF_NULL_TYPE(linked_list_item);
+    } else {
+        self->current = self->subject->head;
+    }
+    return TRUE;
+}
+
+static spif_bool_t
+spif_linked_list_iterator_done(spif_linked_list_iterator_t self)
+{
+    self->subject = SPIF_NULL_TYPE(linked_list);
+    self->current = SPIF_NULL_TYPE(linked_list_item);
+    return TRUE;
+}
+
+static spif_bool_t
+spif_linked_list_iterator_del(spif_linked_list_iterator_t self)
+{
+    spif_linked_list_iterator_done(self);
+    SPIF_DEALLOC(self);
+    return TRUE;
+}
+
+static spif_str_t
+spif_linked_list_iterator_show(spif_linked_list_iterator_t self, spif_charptr_t name, 
spif_str_t buff, size_t indent)
+{
+    char tmp[4096];
+
+    if (SPIF_ITERATOR_ISNULL(self)) {
+        SPIF_OBJ_SHOW_NULL(iterator, name, buff, indent, tmp);
+        return buff;
+    }
+
+    memset(tmp, ' ', indent);
+    snprintf(tmp + indent, sizeof(tmp) - indent, "(spif_linked_list_iterator_t) %s:  
%010p {\n", name, self);
+    if (SPIF_STR_ISNULL(buff)) {
+        buff = spif_str_new_from_ptr(tmp);
+    } else {
+        spif_str_append_from_ptr(buff, tmp);
+    }
+
+    buff = spif_linked_list_show(self->subject, "subject", buff, indent + 2);
+    buff = spif_linked_list_item_show(self->current, "current", buff, indent + 2);
+
+    snprintf(tmp + indent, sizeof(tmp) - indent, "}\n");
+    spif_str_append_from_ptr(buff, tmp);
+    return buff;
+}
+
+static spif_cmp_t
+spif_linked_list_iterator_comp(spif_linked_list_iterator_t self, 
spif_linked_list_iterator_t other)
+{
+    return spif_linked_list_comp(self->subject, other->subject);
+}
+
+static spif_linked_list_iterator_t
+spif_linked_list_iterator_dup(spif_linked_list_iterator_t self)
+{
+    spif_linked_list_iterator_t tmp;
+
+    tmp = spif_linked_list_iterator_new(self->subject);
+    tmp->current = self->current;
+    return tmp;
+}
+
+static spif_classname_t
+spif_linked_list_iterator_type(spif_linked_list_iterator_t self)
+{
+    return SPIF_OBJ_CLASSNAME(self);
+}
+
+static spif_bool_t
+spif_linked_list_iterator_has_next(spif_linked_list_iterator_t self)
+{
+    spif_linked_list_t subject;
+
+    ASSERT_RVAL(!SPIF_ITERATOR_ISNULL(self), FALSE);
+    subject = self->subject;
+    REQUIRE_RVAL(!SPIF_LIST_ISNULL(subject), FALSE);
+    if (self->current) {
+        return TRUE;
+    } else {
+        return FALSE;
+    }
+}
+
+static spif_obj_t
+spif_linked_list_iterator_next(spif_linked_list_iterator_t self)
+{
+    spif_obj_t tmp;
+
+    ASSERT_RVAL(!SPIF_ITERATOR_ISNULL(self), SPIF_NULL_TYPE(obj));
+    REQUIRE_RVAL(!SPIF_LIST_ISNULL(self->subject), SPIF_NULL_TYPE(obj));
+    REQUIRE_RVAL(!SPIF_LINKED_LIST_ITEM_ISNULL(self->current), SPIF_NULL_TYPE(obj));
+    tmp = self->current->data;
+    self->current = self->current->next;
     return tmp;
 }




-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?  SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to