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.