All pastes #542686 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-06-05 22:01 UTC
rendered paste body
struct 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);