@@ -212,9 +212,9 @@ sset_add_array(struct sset *set, char **names, size_t n)
void
sset_clear(struct sset *set)
{
- const char *name, *next;
+ const char *name;
- SSET_FOR_EACH_SAFE (name, next, set) {
+ SSET_FOR_EACH_SAFE (name, set) {
sset_delete(set, SSET_NODE_FROM_NAME(name));
}
}
@@ -320,9 +320,9 @@ sset_at_position(const struct sset *set, struct sset_position *pos)
void
sset_intersect(struct sset *a, const struct sset *b)
{
- const char *name, *next;
+ const char *name;
- SSET_FOR_EACH_SAFE (name, next, a) {
+ SSET_FOR_EACH_SAFE (name, a) {
if (!sset_contains(b, name)) {
sset_delete(a, SSET_NODE_FROM_NAME(name));
}
@@ -87,13 +87,26 @@ void sset_intersect(struct sset *, const struct sset *);
NAME != NULL; \
(NAME) = SSET_NEXT(SSET, NAME))
-#define SSET_FOR_EACH_SAFE(NAME, NEXT, SSET) \
+#define SSET_FOR_EACH_SAFE_LONG(NAME, NEXT, SSET) \
for ((NAME) = SSET_FIRST(SSET); \
(NAME != NULL \
? (NEXT) = SSET_NEXT(SSET, NAME), true \
: false); \
(NAME) = (NEXT))
+#define SSET_FOR_EACH_SAFE_SHORT(NAME, SSET) \
+ for (const char * NAME__next = \
+ ((NAME) = SSET_FIRST(SSET), NULL); \
+ (NAME != NULL \
+ ? (NAME__next = SSET_NEXT(SSET, NAME), true) \
+ : (NAME__next = NULL, false)); \
+ (NAME) = NAME__next)
+
+#define SSET_FOR_EACH_SAFE(...) \
+ OVERLOAD_SAFE_MACRO(SSET_FOR_EACH_SAFE_LONG, \
+ SSET_FOR_EACH_SAFE_SHORT, \
+ 3, __VA_ARGS__)
+
const char **sset_array(const struct sset *);
const char **sset_sort(const struct sset *);