Tizen(Headed) Native API  6.5
Eina_Inlist basic usage

To see the full source for this example, click here: eina_inlist_01.c Eina_Inlist basic usage source

As explained before, inline lists mean its nodes pointers are part of same memory block/blob. This is done by using the macro EINA_INLIST inside the data structure that will be used:

struct my_struct {
     EINA_INLIST;
     int a, b;
};

The resulting node representing this struct can be exemplified by the following picture:

eina_inlist-node_eg1-my-struct.png

Let's define a comparison function that will be used later during the sorting of the list:

int
sort_cb(const void *d1, const void *d2)
{
   const Eina_Inlist *l1, *l2;
   const struct my_struct *x1, *x2;

   l1 = d1;
   l2 = d2;

   x1 = EINA_INLIST_CONTAINER_GET(l1, struct my_struct);
   x2 = EINA_INLIST_CONTAINER_GET(l2, struct my_struct);

   return x1->a - x2->a;
}

The Eina_Inlist can be used exactly the same way as Eina_List when appending, prepending and removing items. But since we already have the node pointers inside the structure, they need to be retrieved with the macro EINA_INLIST_GET :

   d = malloc(sizeof(*d));
   d->a = 1;
   d->b = 10;
   list = eina_inlist_append(NULL, EINA_INLIST_GET(d));

Notice that eina_inlist_append always receives the head of the list as first argument, and its return value should be used as the list pointer (head):

   d = malloc(sizeof(*d));
   d->a = 2;
   d->b = 20;
   list = eina_inlist_append(list, EINA_INLIST_GET(d));

After appending 3 items, the list now should look similar to this:

eina_inlist-node_eg1-inlist.png

The macro EINA_INLIST_FOREACH can be used to iterate over the list:

   printf("list=%p\n", list);
   EINA_INLIST_FOREACH(list, cur)
     printf("\ta=%d, b=%d\n", cur->a, cur->b);

eina_inlist_promote(), eina_inlist_demote(), eina_inlist_append_relative() and similar functions all work in the same way as the Eina_List :

   list = eina_inlist_promote(list, EINA_INLIST_GET(d));

   d = malloc(sizeof(*d));
   d->a = 4;
   d->b = 40;
   list = eina_inlist_append_relative(list, EINA_INLIST_GET(d), list);

   list = eina_inlist_demote(list, EINA_INLIST_GET(d));

Now let's use the sort_cb function declared above to sort our list:

   list = eina_inlist_sort(list, sort_cb);

Removing an element from the inlist is also similar to Eina_List :

   list = eina_inlist_remove(list, EINA_INLIST_GET(d));
   free(d);

Another way of walking through the inlist.

   for (itr = list; itr != NULL; itr = itr->next)
     {
        cur = EINA_INLIST_CONTAINER_GET(itr, struct my_struct);
        printf("\ta=%d, b=%d\n", cur->a, cur->b);
     }

Notice that in the previous piece of code, since we only have the pointers to the inlist nodes, we have to use the EINA_INLIST_CONTAINER_GET macro that will return the pointer to the entire structure. Of course, in this case it is the same as the list pointer, since the EINA_INLIST macro was used in the beginning of the structure.

Now to finish this example, lets delete this list:

   while (list)
     {
        struct my_struct *aux = EINA_INLIST_CONTAINER_GET(list,
                                                          struct my_struct);
        list = eina_inlist_remove(list, list);
        free(aux);
     }