Skip to content
Snippets Groups Projects
Commit f4cb5d8c authored by Roger Dingledine's avatar Roger Dingledine
Browse files

extend smartlist with _remove() and _subtract()

svn:r922
parent 2997ef8d
No related branches found
No related tags found
No related merge requests found
......@@ -92,6 +92,17 @@ void smartlist_add(smartlist_t *sl, void *element) {
log_fn(LOG_WARN,"We've already got %d elements, discarding.",sl->max);
}
void smartlist_remove(smartlist_t *sl, void *element) {
int i;
if(element == NULL)
return;
for(i=0; i < sl->num_used; i++)
if(sl->list[i] == element) {
sl->list[i] = sl->list[--sl->num_used]; /* swap with the end */
i--; /* so we process the new i'th element */
}
}
int smartlist_isin(smartlist_t *sl, void *element) {
int i;
for(i=0; i < sl->num_used; i++)
......@@ -118,6 +129,13 @@ void smartlist_intersect(smartlist_t *sl1, smartlist_t *sl2) {
}
}
/* remove all elements of sl2 from sl1 */
void smartlist_subtract(smartlist_t *sl1, smartlist *sl2) {
int i;
for(i=0; i < sl2->num_used; i++)
smartlist_remove(sl1, sl2->list[i]);
}
void *smartlist_choose(smartlist_t *sl) {
if(sl->num_used)
return sl->list[crypto_pseudo_rand_int(sl->num_used)];
......
......@@ -48,9 +48,11 @@ 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_subtract(smartlist_t *sl1, smartlist *sl2);
void *smartlist_choose(smartlist_t *sl);
const char *eat_whitespace(const char *s);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment