Ziirish's Home :: Blog

Ziirish's Pub

 
 

Un petit billet qui ne sert pas à grand chose pour le commun des mortels, mais qui aide à la lisibilité de certains morceaux de code en... C

Vous vous souvenez certainement de cet article dans lequel je vous présentais mon "ArrayList" en C.

Et pour qui a fait un peu de Java 1.6, il est inutile de préciser que le foreach, ça roxxx sa mère en string !

Pour rappel, plutôt que de se casser le cul à faire :


List list = new ArrayList<String>();
Iterator it = list.iterator();
while (it.hasNext()) {
    // blah blah blah
    it.next();
}

On a un nouveau truc sexy et tout con (non, j'ai pas dit que toutes les filles sexy étaient connes), ça se présente de la sorte :


List list = new ArrayList<String>();
for (String st : list) {
    // blah blah blah
}

Facile, non ? Bon, du coup, je me suis dit qu'il me fallait un truc comme ça à moi. Bien entendu, j'avais déjà implémenté un foreach à l'aide d'un callback. Mais j'avoue que c'est pas super intuitif, et peut-être aussi un peu casse cul d'externaliser tout son traitement dans une fonction...

J'ai donc pris 5 minutes et je vous ai concocté un petit foreach aux oignons. Ne retenez pas vos larmes ;)


/* On ajoute dans notre .h ces deux define */
#define BEGIN_FOREACH_DT(dt) \
CidDataTable *p_dt=dt; \
CidDataCase *p_temp=dt->head; \
while(p_temp!=NULL) \
{

#define END_FOREACH_DT \
p_temp=p_temp->next; \
} \
cid_free_datatable(&p_dt);

Et maintenant, on peut transformer très simplement ça :


CidDataTable *p_table = cid_create_datatable(G_TYPE_STRING,"toto","tata",G_TYPE_INVALID);
CidDataCase *p_temp = p_folders->head;
while (p_temp != NULL)
{
    /* blah blah blah */
    p_temp = p_temp->next;
}
cid_free_datatable (&p_table);

En un truc beaucoup plus lisible :


CidDataTable *p_table = cid_create_datatable(G_TYPE_STRING,"toto","tata",G_TYPE_INVALID);
BEGIN_FOREACH_DT(p_table)
    /* blah blah blah */
END_FOREACH_DT

Il faut juste retenir que la donnée courante se trouve dans le pointeur nommé p_temp.