What: Add two new macros to opal_list.h:
#define opal_list_foreach(item, list, type) \
for (item = (type *) (list)->opal_list_sentinel.opal_list_next ; \
item != (type *) &(list)->opal_list_sentinel ; \
item = (type *) ((opal_list_item_t *) (item))->opal_list_next)
#define opal_list_foreach_safe(item, next, list, type) \
for (item = (type *) (list)->opal_list_sentinel.opal_list_next, \
next = (type *) ((opal_list_item_t *) (item))->opal_list_next ;\
item != (type *) &(list)->opal_list_sentinel ; \
item = next, next = (type *) ((opal_list_item_t *)
(item))->opal_list_next)
The first macro provides a simple iterator over an unchanging list and the
second macro is safe for opal_list_item_remove(item).
Why: These macros provide a clean way to do the following:
for (item = opal_list_get_first (list) ;
item != opal_list_get_end (list) ;
item = opal_list_get_next (item)) {
some_class_t *foo = (some_class_t *) foo;
...
}
becomes:
some_class_t *foo;
opal_list_foreach(foo, list, some_class_t) {
...
}
When: This is a very simple addition but I wanted to give a heads up on the
devel list because these macros are different from what we usually provide
(though they should look familiar to those familiar with the Linux kernel). I
intend to commit these macros to the truck (and CMR for 1.7.1) tomorrow (Wed
01/29/13) around 12:00 PM MST.
Thoughs? Comments?
-Nathan Hjelm
HPC-3, LANL