From: Ben Pfaff Date: Thu, 28 Oct 2010 23:17:29 +0000 (-0700) Subject: hmap: New macro HMAP_FOR_EACH_CONTINUE. X-Git-Tag: v1.1.0~860 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=633d7b903cf4f428c7a89cac49c3008c78fa01f5;p=sliver-openvswitch.git hmap: New macro HMAP_FOR_EACH_CONTINUE. --- diff --git a/lib/hmap.h b/lib/hmap.h index 3929c9ce5..674c6c778 100644 --- a/lib/hmap.h +++ b/lib/hmap.h @@ -133,17 +133,17 @@ static inline struct hmap_node *hmap_first_in_bucket(const struct hmap *, size_t hash); static inline struct hmap_node *hmap_next_in_bucket(const struct hmap_node *); -/* Iteration. - * - * The _SAFE version is needed when NODE may be freed. It is not needed when - * NODE may be removed from the hash map but its members remain accessible and - * intact. */ +/* Iteration. */ + +/* Iterates through every node in HMAP. */ #define HMAP_FOR_EACH(NODE, MEMBER, HMAP) \ for ((NODE) = OBJECT_CONTAINING(hmap_first(HMAP), NODE, MEMBER); \ &(NODE)->MEMBER != NULL; \ (NODE) = OBJECT_CONTAINING(hmap_next(HMAP, &(NODE)->MEMBER), \ NODE, MEMBER)) +/* Safe when NODE may be freed (not needed when NODE may be removed from the + * hash map but its members remain accessible and intact). */ #define HMAP_FOR_EACH_SAFE(NODE, NEXT, MEMBER, HMAP) \ for ((NODE) = OBJECT_CONTAINING(hmap_first(HMAP), NODE, MEMBER); \ (&(NODE)->MEMBER != NULL \ @@ -152,6 +152,14 @@ static inline struct hmap_node *hmap_next_in_bucket(const struct hmap_node *); : 0); \ (NODE) = (NEXT)) +/* Continues an iteration from just after NODE. */ +#define HMAP_FOR_EACH_CONTINUE(NODE, MEMBER, HMAP) \ + for ((NODE) = OBJECT_CONTAINING(hmap_next(HMAP, &(NODE)->MEMBER), \ + NODE, MEMBER); \ + &(NODE)->MEMBER != NULL; \ + (NODE) = OBJECT_CONTAINING(hmap_next(HMAP, &(NODE)->MEMBER), \ + NODE, MEMBER)) + static inline struct hmap_node *hmap_first(const struct hmap *); static inline struct hmap_node *hmap_next(const struct hmap *, const struct hmap_node *);