diff options
author | EuAndreh <eu@euandre.org> | 2024-05-24 16:56:53 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2024-05-24 16:56:53 -0300 |
commit | 1617ac5092036651ae2291f00b267b79d307dc82 (patch) | |
tree | d647b4cd19b24fbe7f8da71783b0bacd70d588eb | |
parent | src/vector.{c,h}: Improve code and tests (diff) | |
download | pindaiba-1617ac5092036651ae2291f00b267b79d307dc82.tar.gz pindaiba-1617ac5092036651ae2291f00b267b79d307dc82.tar.xz |
src/vector.h: Add implementation and tests for vector_contains()
-rw-r--r-- | src/vector.c | 12 | ||||
-rw-r--r-- | src/vector.h | 3 | ||||
-rw-r--r-- | tests/vector.c | 69 |
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; |