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