diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-02-17 05:03:15 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-02-17 05:03:15 +0100 |
| commit | 0362f55a094b5ec813d940b66f397abfa13fbe49 (patch) | |
| tree | 98283bdff3d1a0bb876fc55fa535d60d4aa2a6a9 | |
| parent | eb0678367c5cb09b43423f77d6f1c3063fae9a91 (diff) | |
| download | libft-0362f55a094b5ec813d940b66f397abfa13fbe49.tar.gz libft-0362f55a094b5ec813d940b66f397abfa13fbe49.tar.bz2 libft-0362f55a094b5ec813d940b66f397abfa13fbe49.zip | |
amend me
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | include/libft_ht.h | 4 | ||||
| -rw-r--r-- | src/ht/ft_htcontent_new.c | 2 | ||||
| -rw-r--r-- | src/ht/ft_htset.c | 15 | ||||
| -rw-r--r-- | test/src/ht/test_ft_htcontent_new.c | 43 | ||||
| -rw-r--r-- | test/src/ht/test_ft_htnew.c | 10 | ||||
| -rw-r--r-- | test/src/ht/test_ft_htset.c | 72 | ||||
| -rw-r--r-- | test/src/main.c | 1 | ||||
| -rw-r--r-- | test/src/runner/test_runner_ht.c | 8 |
9 files changed, 129 insertions, 30 deletions
@@ -84,14 +84,14 @@ Much like the `.gitignore` file, you can put the files/directory to ignore when | Name | Prototype | Description | Tested | |------------------|-------------------------------------------------------------------------|-----------------------------------------------------------|--------| -| ft_htcontent_new | `t_ftht_content *ft_htcontent_new(char *key, void *value)` | create a new key/value pair | [ ] | +| ft_htcontent_new | `t_ftht_content *ft_htcontent_new(char *key, void *value)` | create a new key/value pair | [x] | | ft_htdelone | `void ft_htdelone(t_ftht *ht, char *key, void (*del)(t_ftht_content*))` | delete element at `key` | [ ] | | ft_htdelone_key | `void ft_htdelone_key(t_ftht *ht, char *key)` | delete element at `key` and free `key` | [ ] | | ft_htdestroy | `void ft_htdestroy(t_ftht *ht, void (*del)(t_ftht_content*))` | destroy `ht` with the `del` functions applied on values | [ ] | | ft_htdestroy_all | `void ft_htdestroy_all(t_ftht *ht)` | destroy `ht`, free keys and values | [ ] | | ft_htdestroy_key | `void ft_htdestroy_key(t_ftht *ht)` | destroy `ht`, free keys | [ ] | | ft_htget | `void *ft_htget(t_ftht *ht, char *key)` | return value at `key` | [ ] | -| ft_htnew | `t_ftht *ft_htnew(t_ftsize size)` | create a new hash table with a underlying array of `size` | [ ] | +| ft_htnew | `t_ftht *ft_htnew(t_ftsize size)` | create a new hash table with a underlying array of `size` | [x] | | ft_htset | `t_ftht_content *ft_htset(t_ftht *ht, char *key, void *value)` | set `key` to value, if element doesn't exist, create it | [ ] | ### io diff --git a/include/libft_ht.h b/include/libft_ht.h index ba1b3bb..3c5ef6f 100644 --- a/include/libft_ht.h +++ b/include/libft_ht.h @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/31 10:36:09 by cacharle #+# #+# */ -/* Updated: 2020/02/17 03:06:32 by cacharle ### ########.fr */ +/* Updated: 2020/02/17 04:54:05 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,7 +39,7 @@ void ft_htdestroy(t_ftht *ht, void (*del)(t_ftht_content*)); void ft_htdestroy_all(t_ftht *ht); void ft_htdestroy_key(t_ftht *ht); void *ft_htget(t_ftht *ht, char *key); -t_ftht_content *ft_htset(t_ftht *ht, char *key, void *value); +t_ftht_content *ft_htset(t_ftht *ht, char *key, void *value, void (*del)(void*)); void ft_htdelone(t_ftht *ht, char *key, void (*del)(t_ftht_content*)); void ft_htdelone_key(t_ftht *ht, char *key); diff --git a/src/ht/ft_htcontent_new.c b/src/ht/ft_htcontent_new.c index 4ffa9bf..214e125 100644 --- a/src/ht/ft_htcontent_new.c +++ b/src/ht/ft_htcontent_new.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/30 08:45:36 by cacharle #+# #+# */ -/* Updated: 2020/01/30 09:52:28 by cacharle ### ########.fr */ +/* Updated: 2020/02/17 04:09:50 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/ht/ft_htset.c b/src/ht/ft_htset.c index 5ace788..4157134 100644 --- a/src/ht/ft_htset.c +++ b/src/ht/ft_htset.c @@ -6,21 +6,31 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/30 08:41:52 by cacharle #+# #+# */ -/* Updated: 2020/01/31 10:33:39 by cacharle ### ########.fr */ +/* Updated: 2020/02/17 05:02:15 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft.h" #include "libft_ht.h" -t_ftht_content *ft_htset(t_ftht *ht, char *key, void *value) +t_ftht_content *ft_htset(t_ftht *ht, char *key, void *value, void (*del)(void*)) { t_ftht_digest digest; t_ftht_content *content; t_ftht_entry entry; + t_ftlst *tmp; if (ht == NULL || key == NULL) return (NULL); + digest = ft_hthash(ht, key); + tmp = ft_lstlfind(ht->entries[digest], ft_inter_htkey_cmp, entry); + if (tmp != NULL) + { + if (del != NULL) + del(((t_ftht_content*)tmp->content)->value); + ((t_ftht_content*)tmp->content)->value = value; + return ((t_ftht_content*)tmp->content); + } if ((content = ft_htcontent_new(key, value)) == NULL) return (NULL); if ((entry = ft_lstnew(content)) == NULL) @@ -28,7 +38,6 @@ t_ftht_content *ft_htset(t_ftht *ht, char *key, void *value) free(content); return (NULL); } - digest = ft_hthash(ht, key); ft_lstadd_front(ht->entries + digest, entry); return (content); } diff --git a/test/src/ht/test_ft_htcontent_new.c b/test/src/ht/test_ft_htcontent_new.c index e69de29..6993581 100644 --- a/test/src/ht/test_ft_htcontent_new.c +++ b/test/src/ht/test_ft_htcontent_new.c @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_htcontent_new.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/17 04:07:04 by cacharle #+# #+# */ +/* Updated: 2020/02/17 04:15:39 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_htcontent_new); + +TEST_SETUP(ft_htcontent_new) +{} + +TEST_TEAR_DOWN(ft_htcontent_new) +{} + +TEST(ft_htcontent_new, basic) +{ + t_ftht_content *c = NULL; + + char *k = "bonjour"; + c = ft_htcontent_new(k, NULL); + TEST_ASSERT_NOT_NULL(c); + TEST_ASSERT(k != c->key); + TEST_ASSERT_EQUAL_STRING(k, c->key); + TEST_ASSERT_NULL(c->value); + + c = ft_htcontent_new(k, k); + TEST_ASSERT_NOT_NULL(c); + TEST_ASSERT(k != c->key); + TEST_ASSERT_EQUAL_STRING(k, c->key); + TEST_ASSERT_EQUAL_PTR(k, c->value); + TEST_ASSERT_EQUAL_STRING(k, (char*)c->value); + + /* free(c->key); */ + /* free(c); */ +} diff --git a/test/src/ht/test_ft_htnew.c b/test/src/ht/test_ft_htnew.c index b8729bd..6b90f03 100644 --- a/test/src/ht/test_ft_htnew.c +++ b/test/src/ht/test_ft_htnew.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/12 22:30:06 by cacharle #+# #+# */ -/* Updated: 2020/02/12 22:30:09 by cacharle ### ########.fr */ +/* Updated: 2020/02/17 04:18:20 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,7 +24,6 @@ int helper_segfault_pid; TEST(ft_htnew, segfault) { - TEST_IGNORE(); TEST_ASSERT_SEGFAULT(ft_htnew(10)); TEST_ASSERT_SEGFAULT(ft_htnew(0)); TEST_ASSERT_SEGFAULT(ft_htnew((1 << 14) + 1)); @@ -32,20 +31,17 @@ TEST(ft_htnew, segfault) TEST(ft_htnew, error_null) { - TEST_IGNORE(); - TEST_ASSERT_NOT_NULL(ft_htnew(10)); // leak + TEST_ASSERT_NOT_NULL(ft_htnew(10)); TEST_ASSERT_NULL(ft_htnew(0)); - TEST_ASSERT_NULL(ft_htnew((1 << 14) + 1)); } TEST(ft_htnew, happy_path) { - TEST_IGNORE(); t_ftht *ht; ht = ft_htnew(10); TEST_ASSERT_NOT_NULL(ht); - TEST_ASSERT_EQUAL(ht->size, 10); + TEST_ASSERT_EQUAL(10, ht->size); TEST_ASSERT_NOT_NULL(ht->entries); for (t_ftsize i = 0; i < ht->size; i++) TEST_ASSERT_NULL(ht->entries[i]); diff --git a/test/src/ht/test_ft_htset.c b/test/src/ht/test_ft_htset.c index aa6bfc5..c4b53b9 100644 --- a/test/src/ht/test_ft_htset.c +++ b/test/src/ht/test_ft_htset.c @@ -16,28 +16,28 @@ TEST_TEAR_DOWN(ft_htset) TEST(ft_htset, segfault) { - TEST_ASSERT_SEGFAULT(ft_htset(NULL, "", strdup(""))); - TEST_ASSERT_SEGFAULT(ft_htset(ft_htnew(1), NULL, strdup(""))); - TEST_ASSERT_SEGFAULT(ft_htset(ft_htnew(1), "", NULL)); - TEST_ASSERT_SEGFAULT(ft_htset(ft_htnew(1), "", strdup(""))); - TEST_ASSERT_SEGFAULT(ft_htset(ft_htnew(1), "hi", strdup(""))); - TEST_ASSERT_SEGFAULT(ft_htset(ft_htnew(1), "asdfasdfasdc", strdup(""))); + TEST_ASSERT_SEGFAULT(ft_htset(NULL, "", strdup(""), NULL)); + TEST_ASSERT_SEGFAULT(ft_htset(ft_htnew(1), NULL, strdup(""), NULL)); + TEST_ASSERT_SEGFAULT(ft_htset(ft_htnew(1), "", NULL, NULL)); + TEST_ASSERT_SEGFAULT(ft_htset(ft_htnew(1), "", strdup(""), NULL)); + TEST_ASSERT_SEGFAULT(ft_htset(ft_htnew(1), "hi", strdup(""), NULL)); + TEST_ASSERT_SEGFAULT(ft_htset(ft_htnew(1), "asdfasdfasdc", strdup(""), NULL)); } TEST(ft_htset, error_null) { - TEST_ASSERT_NULL(ft_htset(NULL, "", strdup("1"))); - TEST_ASSERT_NULL(ft_htset(ht, NULL, strdup("2"))); - TEST_ASSERT_NOT_NULL(ft_htset(ht, "", strdup("3"))); - TEST_ASSERT_NOT_NULL(ft_htset(ht, "a", strdup("4"))); - TEST_ASSERT_NOT_NULL(ft_htset(ht, "b", strdup("5"))); - TEST_ASSERT_NOT_NULL(ft_htset(ht, "c", strdup("6"))); - TEST_ASSERT_NOT_NULL(ft_htset(ht, "d", strdup("7"))); + TEST_ASSERT_NULL(ft_htset(NULL, "", strdup("1"), NULL)); + TEST_ASSERT_NULL(ft_htset(ht, NULL, strdup("2"), NULL)); + TEST_ASSERT_NOT_NULL(ft_htset(ht, "", strdup("3"), NULL)); + TEST_ASSERT_NOT_NULL(ft_htset(ht, "a", strdup("4"), NULL)); + TEST_ASSERT_NOT_NULL(ft_htset(ht, "b", strdup("5"), NULL)); + TEST_ASSERT_NOT_NULL(ft_htset(ht, "c", strdup("6"), NULL)); + TEST_ASSERT_NOT_NULL(ft_htset(ht, "d", strdup("7"), NULL)); } TEST(ft_htset, happy_path) { - t_ftht_content *content = ft_htset(ht, "bonjour", strdup("content")); + t_ftht_content *content = ft_htset(ht, "bonjour", strdup("content"), NULL); TEST_ASSERT_NOT_NULL(content); TEST_ASSERT_NOT_NULL(content->key); TEST_ASSERT_NOT_NULL(content->value); @@ -45,7 +45,51 @@ TEST(ft_htset, happy_path) TEST_ASSERT_EQUAL_STRING(content->value, "content"); } +TEST(ft_htset, reset) +{ + t_ftht *small = NULL; + + small = ft_htnew(3); + + t_ftht_content *content = ft_htset(ht, "bonjour", strdup("content"), free); + TEST_ASSERT_NOT_NULL(content); + TEST_ASSERT_NOT_NULL(content->key); + TEST_ASSERT_NOT_NULL(content->value); + TEST_ASSERT_EQUAL_STRING(content->key, "bonjour"); + TEST_ASSERT_EQUAL_STRING(content->value, "content"); + + t_ftht_content *content_re = ft_htset(ht, "bonjour", strdup("yo"), free); + TEST_ASSERT_NOT_NULL(content_re); + TEST_ASSERT_EQUAL_PTR(content, content_re); + TEST_ASSERT_NOT_NULL(content_re->key); + TEST_ASSERT_NOT_NULL(content_re->value); + TEST_ASSERT_EQUAL_STRING(content_re->key, "bonjour"); + TEST_ASSERT_EQUAL_STRING(content_re->value, "yo"); +} + TEST(ft_htset, collision) { + t_ftht *small = NULL; + small = ft_htnew(1); + + t_ftht_content *content1 = ft_htset(ht, "bonjour", strdup("content1"), free); + TEST_ASSERT_NOT_NULL(content1); + TEST_ASSERT_NOT_NULL(content1->key); + TEST_ASSERT_NOT_NULL(content1->value); + TEST_ASSERT_EQUAL_STRING(content1->key, "bonjour"); + TEST_ASSERT_EQUAL_STRING(content1->value, "content1"); + + t_ftht_content *content2 = ft_htset(ht, "aurevoir", strdup("content2"), free); + TEST_ASSERT_NOT_NULL(content2); + TEST_ASSERT_NOT_NULL(content2->key); + TEST_ASSERT_NOT_NULL(content2->value); + TEST_ASSERT_EQUAL_STRING(content2->key, "aurevoir"); + TEST_ASSERT_EQUAL_STRING(content2->value, "content2"); + t_ftht_content *content3 = ft_htset(ht, "aloa", strdup("content3"), free); + TEST_ASSERT_NOT_NULL(content3); + TEST_ASSERT_NOT_NULL(content3->key); + TEST_ASSERT_NOT_NULL(content3->value); + TEST_ASSERT_EQUAL_STRING(content3->key, "aloa"); + TEST_ASSERT_EQUAL_STRING(content3->value, "content3"); } diff --git a/test/src/main.c b/test/src/main.c index 0a6d2ee..c015945 100644 --- a/test/src/main.c +++ b/test/src/main.c @@ -31,6 +31,7 @@ static void run_all_test(void) RUN_TEST_GROUP(ft_strlen); // ht + RUN_TEST_GROUP(ft_htcontent_new); RUN_TEST_GROUP(ft_htnew); RUN_TEST_GROUP(ft_htget); RUN_TEST_GROUP(ft_htset); diff --git a/test/src/runner/test_runner_ht.c b/test/src/runner/test_runner_ht.c index de20c5b..f25a61a 100644 --- a/test/src/runner/test_runner_ht.c +++ b/test/src/runner/test_runner_ht.c @@ -6,12 +6,17 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/12 22:44:39 by cacharle #+# #+# */ -/* Updated: 2020/02/12 22:47:11 by cacharle ### ########.fr */ +/* Updated: 2020/02/17 05:02:25 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft_test.h" +TEST_GROUP_RUNNER(ft_htcontent_new) +{ + RUN_TEST_CASE(ft_htcontent_new, basic); +} + TEST_GROUP_RUNNER(ft_htnew) { RUN_TEST_CASE(ft_htnew, segfault); @@ -30,5 +35,6 @@ TEST_GROUP_RUNNER(ft_htset) RUN_TEST_CASE(ft_htset, segfault); RUN_TEST_CASE(ft_htset, error_null); RUN_TEST_CASE(ft_htset, happy_path); + RUN_TEST_CASE(ft_htset, reset); RUN_TEST_CASE(ft_htset, collision); } |
