diff options
-rw-r--r-- | src/common/util.c | 28 | ||||
-rw-r--r-- | src/common/util.h | 4 |
2 files changed, 31 insertions, 1 deletions
diff --git a/src/common/util.c b/src/common/util.c index dcce69bc1..d4708006f 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -92,6 +92,7 @@ void smartlist_add(smartlist_t *sl, void *element) { log_fn(LOG_WARN,"We've already got %d elements, discarding.",sl->max); } +#if 0 void smartlist_remove(smartlist_t *sl, void *element) { int i; if(element == NULL) @@ -102,6 +103,33 @@ void smartlist_remove(smartlist_t *sl, void *element) { i--; /* so we process the new i'th element */ } } +#endif + +int smartlist_isin(smartlist_t *sl, void *element) { + int i; + for(i=0; i < sl->num_used; i++) + if(sl->list[i] == element) + return 1; + return 0; +} + +int smartlist_overlap(smartlist_t *sl1, smartlist_t *sl2) { + int i; + for(i=0; i < sl2->num_used; i++) + if(smartlist_isin(sl1, sl2->list[i])) + return 1; + return 0; +} + +/* remove elements of sl1 that aren't in sl2 */ +void smartlist_intersect(smartlist_t *sl1, smartlist_t *sl2) { + int i; + for(i=0; i < sl1->num_used; i++) + if(!smartlist_isin(sl2, sl1->list[i])) { + sl1->list[i] = sl1->list[--sl1->num_used]; /* swap with the end */ + i--; /* so we process the new i'th element */ + } +} void *smartlist_choose(smartlist_t *sl) { if(sl->num_used) diff --git a/src/common/util.h b/src/common/util.h index b540181ff..c6a22c13a 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -48,7 +48,9 @@ typedef struct { smartlist_t *smartlist_create(int max_elements); void smartlist_free(smartlist_t *sl); void smartlist_add(smartlist_t *sl, void *element); -void smartlist_remove(smartlist_t *sl, void *element); +int smartlist_isin(smartlist_t *sl, void *element); +int smartlist_overlap(smartlist_t *sl1, smartlist_t *sl2); +void smartlist_intersect(smartlist_t *sl1, smartlist_t *sl2); void *smartlist_choose(smartlist_t *sl); const char *eat_whitespace(const char *s); |