Commit 4d3d99fa authored by Roger Dingledine's avatar Roger Dingledine
Browse files

extend smartlist with a few smarter operations


svn:r910
parent 325935b1
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -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)
+3 −1
Original line number Diff line number Diff line
@@ -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);