X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fsset.h;h=7d1d496285dfd7a02dc3144305b8f554b88bcce3;hb=HEAD;hp=a739fce00c75357e9f8d4563cac42c4698fb04a2;hpb=43d1478b1690ecd0ef6b63890bc13438c1914e47;p=cascardo%2Fovs.git diff --git a/lib/sset.h b/lib/sset.h index a739fce00..7d1d49628 100644 --- a/lib/sset.h +++ b/lib/sset.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 Nicira Networks. + * Copyright (c) 2011, 2012, 2013, 2015, 2016 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ #define SSET_H #include "hmap.h" +#include "util.h" #ifdef __cplusplus extern "C" { @@ -63,31 +64,44 @@ char *sset_pop(struct sset *); struct sset_node *sset_find(const struct sset *, const char *); bool sset_contains(const struct sset *, const char *); bool sset_equals(const struct sset *, const struct sset *); +struct sset_node *sset_at_position(const struct sset *, + uint32_t *bucketp, uint32_t *offsetp); + +/* Set operations. */ +void sset_intersect(struct sset *, const struct sset *); /* Iteration macros. */ #define SSET_FOR_EACH(NAME, SSET) \ for ((NAME) = SSET_FIRST(SSET); \ - SSET_NODE_FROM_NAME(NAME) != NULL; \ + NAME != NULL; \ (NAME) = SSET_NEXT(SSET, NAME)) #define SSET_FOR_EACH_SAFE(NAME, NEXT, SSET) \ for ((NAME) = SSET_FIRST(SSET); \ - (SSET_NODE_FROM_NAME(NAME) != NULL \ + (NAME != NULL \ ? (NEXT) = SSET_NEXT(SSET, NAME), true \ : false); \ (NAME) = (NEXT)) + +const char **sset_array(const struct sset *); +const char **sset_sort(const struct sset *); /* Implementation helper macros. */ #define SSET_NODE_FROM_HMAP_NODE(HMAP_NODE) \ CONTAINER_OF(HMAP_NODE, struct sset_node, hmap_node) #define SSET_NAME_FROM_HMAP_NODE(HMAP_NODE) \ - ((const char *) (SSET_NODE_FROM_HMAP_NODE(HMAP_NODE)->name)) + HMAP_NODE == NULL \ + ? NULL \ + : (CONST_CAST(const char *, (SSET_NODE_FROM_HMAP_NODE(HMAP_NODE)->name))) #define SSET_NODE_FROM_NAME(NAME) CONTAINER_OF(NAME, struct sset_node, name) -#define SSET_FIRST(SSET) SSET_NAME_FROM_HMAP_NODE(hmap_first(&(SSET)->map)) +#define SSET_FIRST(SSET) \ + (BUILD_ASSERT_TYPE(SSET, struct sset *), \ + SSET_NAME_FROM_HMAP_NODE(hmap_first(&(SSET)->map))) #define SSET_NEXT(SSET, NAME) \ - SSET_NAME_FROM_HMAP_NODE( \ - hmap_next(&(SSET)->map, &SSET_NODE_FROM_NAME(NAME)->hmap_node)) + (BUILD_ASSERT_TYPE(SSET, struct sset *), \ + SSET_NAME_FROM_HMAP_NODE( \ + hmap_next(&(SSET)->map, &SSET_NODE_FROM_NAME(NAME)->hmap_node))) #ifdef __cplusplus }