Estoy usando la estructura de listas doblemente enlazada de GLib, GList. Me gustaría saber si hay estándar macro para iterar sobre un GList. No pude encontrar nada de eso en la documentación de GLib. Como resultado, he creado mi propia macro, pero prefiero usar algo estándar si existe.Macro para iterar sobre un GList
Para ilustrar el problema: Por lo general escribo una gran cantidad de código que se parece a esto:
GList *list, *elem;
MyType *item;
for(elem = list; elem; elem = elem->next) {
item = elem->data;
/* do something with item */
}
Con una macro que se puede reducir a
GList *list;
MyType *item;
GFOREACH(item, list) {
/* do something with item */
}
que es mucho menos ruidoso.
Nota: Me di cuenta de que GLib proporciona una función foreach para iterar sobre una lista y llamar a una llamada de retorno para cada elemento, pero a menudo la vía indirecta de una devolución de llamada hace que el código sea más difícil de leer, especialmente si la devolución de llamada es solamente usado una vez.
Actualización: ya que no hay ninguna macro estándar, estoy poniendo la macro estoy usando aquí en caso de que sea de alguna utilidad para alguien más. Correcciones/mejoras son bienvenidas.
#define GFOREACH(item, list) for(GList *__glist = list; __glist && (item = __glist->data, true); __glist = __glist->next)
Estoy bastante seguro de que GLib solo proporciona las funciones foreach para iterar sobre sus diversas estructuras de datos. Estoy de acuerdo, no siempre es bueno para la legibilidad, aunque con un nombre descriptivo para la devolución de llamada generalmente me parece bien. – Cascabel