rendered paste bodystruct Ecore_Object {
Ecore_Iter_Interface *iter_interface;
}
sturct Ecore_List {
Ecore_Object obj;
...
}
struct Ecore_Iter_Interface {
Ecore_Iter *(*instance)(void *list);
void *(*free)(Ecore_Iter *iter);
void *(*next)(Ecore_Iter *iter);
void *(*prev)(Ecore_Iter *iter);
void *(*first)(Ecore_Iter *iter);
}
Ecore_List *ecore_list_new()
{
...
if (!list_iter_interface)
{
list_iter_interface = NEW(Ecore_Iter_Interface);
list_iter_interface->instance = ecore_list_iterator_new;
list_iter_interface->free = ecore_list_iterator_free;
list_iter_interface->next = ecore_list_iterator_next;
list_iter_interface->prev = ecore_list_iterator_prev;
list_iter_interface->first = ecore_list_iterator_first;
}
list->obj.iter = list_iter;
...
}
struct Ecore_List_Iterator
{
Ecore_List *list_head;
Ecore_List_Node *current;
}
Ecore_Iter *ecore_iterator_new(void *list)
{
return (ECORE_OBJECT(list)->iter_interface->instance(list));
}
Ecore_Iter *ecore_list_iterator_new(void *list)
{
iter = NEW(Ecore_List_Iterator);
iter->list = list;
/* Register with list for maintaining consistency */
...
return iter;
}
iter = ecore_iterator_new(my_dlist);
while (value = ecore_iterator_next(iter))
{
}
ecore_iterator_free(iter);
iter = ecore_iterator_new(my_tree)
while (value = ecore_iterator_next(iter))
{
}
ecore_iterator_free(iter);