summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2024-05-24 16:56:53 -0300
committerEuAndreh <eu@euandre.org>2024-05-24 16:56:53 -0300
commit1617ac5092036651ae2291f00b267b79d307dc82 (patch)
treed647b4cd19b24fbe7f8da71783b0bacd70d588eb
parentsrc/vector.{c,h}: Improve code and tests (diff)
downloadpindaiba-1617ac5092036651ae2291f00b267b79d307dc82.tar.gz
pindaiba-1617ac5092036651ae2291f00b267b79d307dc82.tar.xz
src/vector.h: Add implementation and tests for vector_contains()
-rw-r--r--src/vector.c12
-rw-r--r--src/vector.h3
-rw-r--r--tests/vector.c69
3 files changed, 84 insertions, 0 deletions
diff --git a/src/vector.c b/src/vector.c
index 77a6a8a..9634630 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -3,6 +3,7 @@
#include <assert.h>
#include <errno.h>
#include <locale.h>
+#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
@@ -222,3 +223,14 @@ vector_pop_back(const struct Vector *const v, const void **const out) {
out:
return rc;
}
+
+bool
+vector_contains(const struct Vector *const v, const void *const value) {
+ for (size_t i = 0; i < vector_count(v); i++) {
+ if (memcmp(&v->values[i], value, v->value_size) == 0) {
+ return true;
+ }
+ }
+
+ return false;
+}
diff --git a/src/vector.h b/src/vector.h
index 7d83594..3103375 100644
--- a/src/vector.h
+++ b/src/vector.h
@@ -26,3 +26,6 @@ vector_push_back(const struct Vector *const v, const void *const value);
int
vector_pop_back(const struct Vector *const v, const void **const out);
+
+bool
+vector_contains(const struct Vector *const v, const void *const value);
diff --git a/tests/vector.c b/tests/vector.c
index 8f4a20c..4d27c7f 100644
--- a/tests/vector.c
+++ b/tests/vector.c
@@ -381,6 +381,70 @@ test_vector_pop_back(void) {
return 0;
}
+static int
+test_vector_contains(void) {
+ int rc = -1;
+
+ const struct Vector *v = NULL;
+
+ test_start("vector_contains()");
+ {
+ testing("empty vector");
+
+ if (vector_new(sizeof(int), &v)) {
+ logerr("vector_new()");
+ goto out;
+ }
+
+ const int value = 1;
+ for (size_t i = 0; i < 100; i++) {
+ assert(!vector_contains(v, &value));
+ }
+
+ vector_free(v);
+ v = NULL;
+
+ test_ok();
+ }
+ {
+ testing("small vectors");
+
+ if (vector_new(sizeof(size_t), &v)) {
+ logerr("vector_new()");
+ goto out;
+ }
+
+ for (size_t i = 0; i < 100U; i++) {
+ if (vector_push_back(v, &i)) {
+ logerr("vector_push_back()");
+ goto out;
+ }
+ }
+
+ const size_t value = 100U;
+ for (size_t i = 0; i < vector_count(v); i++) {
+ assert(!vector_contains(v, &value));
+ }
+
+ for (size_t i = 0; i < vector_count(v); i++) {
+ assert(vector_contains(v, &i));
+ }
+
+ vector_free(v);
+ v = NULL;
+
+ test_ok();
+ }
+
+ rc = 0;
+out:
+ if (v != NULL) {
+ vector_free(v);
+ v = NULL;
+ }
+ return rc;
+}
+
int
main(void) {
@@ -424,6 +488,11 @@ main(void) {
goto out;
}
+ if (test_vector_contains()) {
+ logerr("test_vector_contains()");
+ goto out;
+ }
+
rc = 0;
out:
return !!rc;