Browse Source

extend smartlist with a few smarter operations

svn:r910
Roger Dingledine 22 years ago
parent
commit
4d3d99fa0c
2 changed files with 31 additions and 1 deletions
  1. 28 0
      src/common/util.c
  2. 3 1
      src/common/util.h

+ 28 - 0
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)

+ 3 - 1
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);