aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-02-17 05:03:15 +0100
committerCharles <sircharlesaze@gmail.com>2020-02-17 05:03:15 +0100
commit0362f55a094b5ec813d940b66f397abfa13fbe49 (patch)
tree98283bdff3d1a0bb876fc55fa535d60d4aa2a6a9
parenteb0678367c5cb09b43423f77d6f1c3063fae9a91 (diff)
downloadlibft-0362f55a094b5ec813d940b66f397abfa13fbe49.tar.gz
libft-0362f55a094b5ec813d940b66f397abfa13fbe49.tar.bz2
libft-0362f55a094b5ec813d940b66f397abfa13fbe49.zip
amend me
-rw-r--r--README.md4
-rw-r--r--include/libft_ht.h4
-rw-r--r--src/ht/ft_htcontent_new.c2
-rw-r--r--src/ht/ft_htset.c15
-rw-r--r--test/src/ht/test_ft_htcontent_new.c43
-rw-r--r--test/src/ht/test_ft_htnew.c10
-rw-r--r--test/src/ht/test_ft_htset.c72
-rw-r--r--test/src/main.c1
-rw-r--r--test/src/runner/test_runner_ht.c8
9 files changed, 129 insertions, 30 deletions
diff --git a/README.md b/README.md
index 5e3aeca..aff6c03 100644
--- a/README.md
+++ b/README.md
@@ -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);
}