summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2003-12-13 23:32:03 +0000
committerRoger Dingledine <arma@torproject.org>2003-12-13 23:32:03 +0000
commit4d3d99fa0c5215bbaec94ba51424cdcedda3417a (patch)
tree9a67deb5f65adc0beecea153db113ca3349cd055
parent325935b1c63de1874d8b7d7669fe543e26441b4a (diff)
downloadtor-4d3d99fa0c5215bbaec94ba51424cdcedda3417a.tar.gz
tor-4d3d99fa0c5215bbaec94ba51424cdcedda3417a.zip
extend smartlist with a few smarter operations
svn:r910
-rw-r--r--src/common/util.c28
-rw-r--r--src/common/util.h4
2 files changed, 31 insertions, 1 deletions
diff --git a/src/common/util.c b/src/common/util.c
index dcce69bc15..d4708006f0 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 b540181ff4..c6a22c13a7 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);