util: Introduce ASSIGN_CONTAINER to make iteration macros easier to read.
[sliver-openvswitch.git] / lib / classifier.h
index 5629fc0..76a3a5c 100644 (file)
@@ -135,20 +135,16 @@ struct cls_rule *cls_cursor_first(struct cls_cursor *);
 struct cls_rule *cls_cursor_next(struct cls_cursor *, struct cls_rule *);
 
 #define CLS_CURSOR_FOR_EACH(RULE, MEMBER, CURSOR)                       \
-    for ((RULE) = OBJECT_CONTAINING(cls_cursor_first(CURSOR),           \
-                                    RULE, MEMBER);                      \
+    for (ASSIGN_CONTAINER(RULE, cls_cursor_first(CURSOR), MEMBER);      \
          &(RULE)->MEMBER != NULL;                                       \
-         (RULE) = OBJECT_CONTAINING(cls_cursor_next(CURSOR,             \
-                                                    &(RULE)->MEMBER),   \
-                                    RULE, MEMBER))
+         ASSIGN_CONTAINER(RULE, cls_cursor_next(CURSOR, &(RULE)->MEMBER), \
+                          MEMBER))
 
 #define CLS_CURSOR_FOR_EACH_SAFE(RULE, NEXT, MEMBER, CURSOR)            \
-    for ((RULE) = OBJECT_CONTAINING(cls_cursor_first(CURSOR),           \
-                                    RULE, MEMBER);                      \
+    for (ASSIGN_CONTAINER(RULE, cls_cursor_first(CURSOR), MEMBER);      \
          (&(RULE)->MEMBER != NULL                                       \
-          ? ((NEXT) = OBJECT_CONTAINING(cls_cursor_next(CURSOR,         \
-                                                        &(RULE)->MEMBER), \
-                                        RULE, MEMBER), 1)               \
+          ? ASSIGN_CONTAINER(NEXT, cls_cursor_next(CURSOR, &(RULE)->MEMBER), \
+                             MEMBER)                                    \
           : 0);                                                         \
          (RULE) = (NEXT))