summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2013-10-25 13:38:38 -0700
committerEric Anholt <eric@anholt.net>2013-10-25 15:29:09 -0700
commit5594ed57413bf0117c592cf8edc8c9363b98a578 (patch)
treeeb91118aaee8acb55d2356f0047aa9f4f7d5ecd0
parent9dd53079a431768b76431fa632a5ea086d0c54e9 (diff)
Add set_contains and int_set_contains functions.
These are convenience functions on top of set_search and int_set_search. With a set, containment is often the most important notion of interest, and it helps to be able to query this without needing to declare a local struct set_entry*. v2: Whitespace consistency (changes by anholt)
-rw-r--r--int-set.c12
-rw-r--r--int-set.h8
-rw-r--r--set.c12
-rw-r--r--set.h8
-rw-r--r--tests/int-set/delete_and_lookup.c6
-rw-r--r--tests/int-set/delete_management.c1
-rw-r--r--tests/int-set/insert_and_lookup.c2
-rw-r--r--tests/int-set/insert_many.c1
-rw-r--r--tests/int-set/replacement.c2
-rw-r--r--tests/set/delete_and_lookup.c6
-rw-r--r--tests/set/delete_management.c1
-rw-r--r--tests/set/insert_and_lookup.c2
-rw-r--r--tests/set/insert_many.c1
-rw-r--r--tests/set/replacement.c2
14 files changed, 60 insertions, 4 deletions
diff --git a/int-set.c b/int-set.c
index c58ee5d..853bb9e 100644
--- a/int-set.c
+++ b/int-set.c
@@ -137,6 +137,18 @@ int_set_destroy(struct int_set *set)
free(set);
}
+/* Does the set contain an entry with the given value.
+ */
+bool
+int_set_contains(struct int_set *set, uint32_t value)
+{
+ struct int_set_entry *entry;
+
+ entry = int_set_search(set, value);
+
+ return entry != NULL;
+}
+
/**
* Finds a set entry with the given value
*
diff --git a/int-set.h b/int-set.h
index c2ccf9e..34b0692 100644
--- a/int-set.h
+++ b/int-set.h
@@ -29,6 +29,7 @@
#define SET_H
#include <inttypes.h>
+#include <stdbool.h>
struct int_set_entry {
uint32_t value;
@@ -55,12 +56,15 @@ int_set_destroy(struct int_set *set);
struct int_set_entry *
int_set_add(struct int_set *set, uint32_t value);
-struct int_set_entry *
-int_set_search(struct int_set *set, uint32_t value);
+bool
+int_set_contains(struct int_set *set, uint32_t value);
void
int_set_remove(struct int_set *set, uint32_t value);
+struct int_set_entry *
+int_set_search(struct int_set *set, uint32_t value);
+
void
int_set_remove_entry(struct int_set *set, struct int_set_entry *entry);
diff --git a/set.c b/set.c
index b600030..fe8ab41 100644
--- a/set.c
+++ b/set.c
@@ -153,6 +153,18 @@ set_destroy(struct set *ht, void (*delete_function)(struct set_entry *entry))
free(ht);
}
+/* Does the set contain an entry with the given key and hash.
+ */
+bool
+set_contains(struct set *ht, uint32_t hash, const void *key)
+{
+ struct set_entry *entry;
+
+ entry = set_search(ht, hash, key);
+
+ return entry != NULL;
+}
+
/**
* Finds a set entry with the given key and hash of that key.
*
diff --git a/set.h b/set.h
index aebeecd..1a041ba 100644
--- a/set.h
+++ b/set.h
@@ -29,6 +29,7 @@
#define SET_H
#include <inttypes.h>
+#include <stdbool.h>
struct set_entry {
uint32_t hash;
@@ -56,12 +57,15 @@ set_destroy(struct set *set,
struct set_entry *
set_add(struct set *set, uint32_t hash, const void *key);
-struct set_entry *
-set_search(struct set *set, uint32_t hash, const void *key);
+bool
+set_contains(struct set *set, uint32_t hash, const void *key);
void
set_remove(struct set *set, uint32_t hash, const void *key);
+struct set_entry *
+set_search(struct set *set, uint32_t hash, const void *key);
+
void
set_remove_entry(struct set *set, struct set_entry *entry);
diff --git a/tests/int-set/delete_and_lookup.c b/tests/int-set/delete_and_lookup.c
index f37cd0f..5cc3fb8 100644
--- a/tests/int-set/delete_and_lookup.c
+++ b/tests/int-set/delete_and_lookup.c
@@ -51,24 +51,30 @@ main(int argc, char **argv)
int_set_add(set, value2);
int_set_add(set, value3);
+ assert(int_set_contains(set, value3));
entry = int_set_search(set, value3);
assert(entry->value == value3);
+ assert(int_set_contains(set, value2));
entry = int_set_search(set, value2);
assert(entry->value == value2);
+ assert(int_set_contains(set, value1));
entry = int_set_search(set, value1);
assert(entry->value == value1);
int_set_remove_entry(set, entry);
int_set_remove(set, value2);
+ assert(!int_set_contains(set, value1));
entry = int_set_search(set, value1);
assert(entry == NULL);
+ assert(!int_set_contains(set, value2));
entry = int_set_search(set, value2);
assert(entry == NULL);
+ assert(int_set_contains(set, value3));
entry = int_set_search(set, value3);
assert(entry->value == value3);
diff --git a/tests/int-set/delete_management.c b/tests/int-set/delete_management.c
index 0d4bfe3..93f7cf8 100644
--- a/tests/int-set/delete_management.c
+++ b/tests/int-set/delete_management.c
@@ -52,6 +52,7 @@ main(int argc, char **argv)
/* Make sure that all our entries were present at the end. */
for (i = size - 100; i < size; i++) {
+ assert(int_set_contains(set, i));
entry = int_set_search(set, i);
assert(entry);
assert(entry->value == i);
diff --git a/tests/int-set/insert_and_lookup.c b/tests/int-set/insert_and_lookup.c
index 575aac7..ea68321 100644
--- a/tests/int-set/insert_and_lookup.c
+++ b/tests/int-set/insert_and_lookup.c
@@ -44,9 +44,11 @@ main(int argc, char **argv)
int_set_add(set, value1);
int_set_add(set, value2);
+ assert(int_set_contains(set, value1));
entry = int_set_search(set, value1);
assert(entry->value == value1);
+ assert(int_set_contains(set, value2));
entry = int_set_search(set, value2);
assert(entry->value == value2);
diff --git a/tests/int-set/insert_many.c b/tests/int-set/insert_many.c
index 99ad9ea..4c06394 100644
--- a/tests/int-set/insert_many.c
+++ b/tests/int-set/insert_many.c
@@ -46,6 +46,7 @@ main(int argc, char **argv)
}
for (i = 0; i < size; i++) {
+ assert(int_set_contains(set, i));
entry = int_set_search(set, i);
assert(entry);
assert(entry->value == i);
diff --git a/tests/int-set/replacement.c b/tests/int-set/replacement.c
index ef9faaa..011a9a4 100644
--- a/tests/int-set/replacement.c
+++ b/tests/int-set/replacement.c
@@ -43,12 +43,14 @@ main(int argc, char **argv)
int_set_add(set, value);
int_set_add(set, value);
+ assert(int_set_contains(set, value));
entry = int_set_search(set, value);
assert(entry);
assert(entry->value == value);
int_set_remove_entry(set, entry);
+ assert(!int_set_contains(set, value));
entry = int_set_search(set, value);
assert(!entry);
diff --git a/tests/set/delete_and_lookup.c b/tests/set/delete_and_lookup.c
index 6ad6209..93d3bc7 100644
--- a/tests/set/delete_and_lookup.c
+++ b/tests/set/delete_and_lookup.c
@@ -58,24 +58,30 @@ main(int argc, char **argv)
set_add(set, hash_str2, str2);
set_add(set, hash_str2, str3);
+ assert(set_contains(set, hash_str3, str3));
entry = set_search(set, hash_str3, str3);
assert(strcmp(entry->key, str3) == 0);
+ assert(set_contains(set, hash_str2, str2));
entry = set_search(set, hash_str2, str2);
assert(strcmp(entry->key, str2) == 0);
+ assert(set_contains(set, hash_str1, str1));
entry = set_search(set, hash_str1, str1);
assert(strcmp(entry->key, str1) == 0);
set_remove_entry(set, entry);
set_remove(set, hash_str2, str2);
+ assert(!set_contains(set, hash_str1, str1));
entry = set_search(set, hash_str1, str1);
assert(entry == NULL);
+ assert(!set_contains(set, hash_str2, str2));
entry = set_search(set, hash_str2, str2);
assert(entry == NULL);
+ assert(set_contains(set, hash_str3, str3));
entry = set_search(set, hash_str3, str3);
assert(strcmp(entry->key, str3) == 0);
diff --git a/tests/set/delete_management.c b/tests/set/delete_management.c
index f54c9c5..14f1fe1 100644
--- a/tests/set/delete_management.c
+++ b/tests/set/delete_management.c
@@ -67,6 +67,7 @@ main(int argc, char **argv)
/* Make sure that all our entries were present at the end. */
for (i = size - 100; i < size; i++) {
+ assert(set_contains(set, i, &keys[i]));
entry = set_search(set, i, &keys[i]);
assert(entry);
assert(key_value(entry->key) == i);
diff --git a/tests/set/insert_and_lookup.c b/tests/set/insert_and_lookup.c
index 367daac..6b01bdd 100644
--- a/tests/set/insert_and_lookup.c
+++ b/tests/set/insert_and_lookup.c
@@ -46,9 +46,11 @@ main(int argc, char **argv)
set_add(set, hash_str1, str1);
set_add(set, hash_str2, str2);
+ assert(set_contains(set, hash_str1, str1));
entry = set_search(set, hash_str1, str1);
assert(strcmp(entry->key, str1) == 0);
+ assert(set_contains(set, hash_str2, str2));
entry = set_search(set, hash_str2, str2);
assert(strcmp(entry->key, str2) == 0);
diff --git a/tests/set/insert_many.c b/tests/set/insert_many.c
index 4c8dfd0..2dc15da 100644
--- a/tests/set/insert_many.c
+++ b/tests/set/insert_many.c
@@ -61,6 +61,7 @@ main(int argc, char **argv)
}
for (i = 0; i < size; i++) {
+ assert(set_contains(set, i, keys + i));
entry = set_search(set, i, keys + i);
assert(entry);
assert(key_value(entry->key) == i);
diff --git a/tests/set/replacement.c b/tests/set/replacement.c
index 8723ecb..2c7555e 100644
--- a/tests/set/replacement.c
+++ b/tests/set/replacement.c
@@ -46,12 +46,14 @@ main(int argc, char **argv)
set_add(set, hash_str1, str1);
set_add(set, hash_str2, str2);
+ assert(set_contains(set, hash_str1, str1));
entry = set_search(set, hash_str1, str1);
assert(entry);
assert(entry->key == str2);
set_remove_entry(set, entry);
+ assert(!set_contains(set, hash_str1, str1));
entry = set_search(set, hash_str1, str1);
assert(!entry);