Adding functions table to hashmap and some fixes in bidimap and queue

This commit is contained in:
Leonardo committed 2020-02-06 01:04:25 -03:00
1 parent 13f63cea23
commit 7dd6218017
4 files changed
+971 -881

No files matched your search

+4 -1
View File
@@ -412,7 +412,7 @@ struct cmc_callbacks_bidimap
if (capacity >= UINTMAX_MAX * load) \
return NULL; \
\
if (!f_val) \
if (!f_key || !f_val) \
return NULL; \
\
size_t real_capacity = PFX##_impl_calculate_size(capacity / load); \
@@ -461,6 +461,9 @@ struct cmc_callbacks_bidimap
if (capacity >= UINTMAX_MAX * load) \
return NULL; \
\
if (!f_key || !f_val) \
return NULL; \
\
size_t real_capacity = PFX##_impl_calculate_size(capacity / load); \
\
if (!alloc) \
+864 -815
View File
File diff suppressed because it is too large. Load diff
+2
View File
@@ -504,6 +504,8 @@ struct cmc_callbacks_queue
} \
\
result->count = _queue_->count; \
result->front = 0; \
result->back = _queue_->count; \
\
return result; \
} \
+101 -65
View File
@@ -7,32 +7,48 @@
CMC_GENERATE_HASHMAP(hm, hashmap, size_t, size_t)
struct hashmap_ftab_key *hm_ftab_key =
&(struct hashmap_ftab_key){ .cmp = cmp,
.cpy = copy,
.str = str,
.free = custom_free,
.hash = hash,
.pri = pri };
struct hashmap_ftab_val *hm_ftab_val =
&(struct hashmap_ftab_val){ .cmp = cmp,
.cpy = copy,
.str = str,
.free = custom_free,
.hash = hash,
.pri = pri };
CMC_CREATE_UNIT(hashmap_test, true, {
CMC_CREATE_TEST(new, {
struct hashmap *map = hm_new(943722, 0.6, cmp, hash);
struct hashmap *map = hm_new(943722, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
cmc_assert_not_equals(ptr, NULL, map->buffer);
cmc_assert_equals(size_t, 0, hm_count(map));
cmc_assert_greater_equals(size_t, (943722 / 0.6), hm_capacity(map));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(new[capacity = 0], {
struct hashmap *map = hm_new(0, 0.6, cmp, hash);
struct hashmap *map = hm_new(0, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_equals(ptr, NULL, map);
});
CMC_CREATE_TEST(new[capacity = UINT64_MAX], {
struct hashmap *map = hm_new(UINT64_MAX, 0.99, cmp, hash);
struct hashmap *map = hm_new(UINT64_MAX, 0.99, hm_ftab_key, hm_ftab_val);
cmc_assert_equals(ptr, NULL, map);
});
CMC_CREATE_TEST(clear[count capacity], {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -41,38 +57,41 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert_equals(size_t, 50, hm_count(map));
hm_clear(map, NULL);
hm_clear(map);
cmc_assert_equals(size_t, 0, hm_count(map));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(insert, {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
cmc_assert(hm_insert(map, 1, 1));
cmc_assert_equals(size_t, 1, hm_count(map));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(insert[smallest capacity], {
struct hashmap *map = hm_new(1, 0.99, cmp, hash);
struct hashmap *map = hm_new(1, 0.99, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
cmc_assert_equals(size_t, cmc_hashtable_primes[0], hm_capacity(map));
cmc_assert(hm_insert(map, 1, 1));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(insert[element position], {
struct hashmap *map = hm_new(1, 0.99, hm_ftab_key, hm_ftab_val);
// Temporary change
// Using the numhash the key is the hash itself
struct hashmap *map = hm_new(1, 0.99, cmp, numhash);
hm_ftab_key->hash = numhash;
cmc_assert_not_equals(ptr, NULL, map);
@@ -86,11 +105,16 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert_equals(size_t, capacity - 1, map->buffer[capacity - 1].key);
cmc_assert_equals(size_t, capacity, map->buffer[0].key);
hm_free(map, NULL);
hm_ftab_key->hash = hash;
hm_free(map);
});
CMC_CREATE_TEST(insert[distance], {
struct hashmap *map = hm_new(500, 0.6, cmp, hash0);
struct hashmap *map = hm_new(500, 0.6, hm_ftab_key, hm_ftab_val);
// Temporary change
hm_ftab_key->hash = hash0;
cmc_assert_not_equals(ptr, NULL, map);
@@ -102,11 +126,16 @@ CMC_CREATE_UNIT(hashmap_test, true, {
for (size_t i = 0; i < 200; i++)
cmc_assert_equals(size_t, i, map->buffer[i].dist);
hm_free(map, NULL);
hm_ftab_key->hash = hash;
hm_free(map);
});
CMC_CREATE_TEST(insert[distance wrap], {
struct hashmap *map = hm_new(1, 0.99, cmp, hashcapminus1);
struct hashmap *map = hm_new(1, 0.99, hm_ftab_key, hm_ftab_val);
// Temporary change
hm_ftab_key->hash = hashcapminus1;
cmc_assert_not_equals(ptr, NULL, map);
@@ -123,11 +152,16 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert_equals(size_t, 0, map->buffer[capacity - 1].dist);
cmc_assert_equals(size_t, 1, map->buffer[0].dist);
hm_free(map, NULL);
hm_ftab_key->hash = hash;
hm_free(map);
});
CMC_CREATE_TEST(insert[distances], {
struct hashmap *map = hm_new(1, 0.99, cmp, hashcapminus4);
struct hashmap *map = hm_new(1, 0.99, hm_ftab_key, hm_ftab_val);
// Temporary change
hm_ftab_key->hash = hashcapminus4;
cmc_assert_not_equals(ptr, NULL, map);
@@ -139,11 +173,13 @@ CMC_CREATE_UNIT(hashmap_test, true, {
for (size_t i = 0; i < 6; i++)
cmc_assert_equals(size_t, i, hm_impl_get_entry(map, i)->dist);
hm_free(map, NULL);
hm_ftab_key->hash = hash;
hm_free(map);
});
CMC_CREATE_TEST(insert[buffer growth and item preservation], {
struct hashmap *map = hm_new(1, 0.99, cmp, hash);
struct hashmap *map = hm_new(1, 0.99, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -163,11 +199,11 @@ CMC_CREATE_UNIT(hashmap_test, true, {
for (size_t i = 0; i < 100000; i++)
cmc_assert(hm_contains(map, i));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(update, {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -178,11 +214,11 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert_equals(size_t, 1, old);
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(update[key not found], {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -191,11 +227,11 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert(!hm_update(map, 120, 120, NULL));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(remove, {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -205,22 +241,22 @@ CMC_CREATE_UNIT(hashmap_test, true, {
for (size_t i = 0; i < 100; i++)
cmc_assert(hm_remove(map, i, NULL));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(remove[count = 0], {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
for (size_t i = 100; i < 200; i++)
cmc_assert(!hm_remove(map, i, NULL));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(remove[key not found], {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -230,11 +266,11 @@ CMC_CREATE_UNIT(hashmap_test, true, {
for (size_t i = 100; i < 200; i++)
cmc_assert(!hm_remove(map, i, NULL));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(max, {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -248,21 +284,21 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert_equals(size_t, 100, key);
cmc_assert_equals(size_t, 100, val);
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(max[count = 0], {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
cmc_assert(!hm_min(map, NULL, NULL));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(min, {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -276,21 +312,21 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert_equals(size_t, 1, key);
cmc_assert_equals(size_t, 1, val);
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(min[count = 0], {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
cmc_assert(!hm_min(map, NULL, NULL));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(get, {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -298,21 +334,21 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert_equals(size_t, 1234, hm_get(map, 4321));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(get[count = 0], {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
cmc_assert_equals(size_t, (size_t){ 0 }, hm_get(map, 4321));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(get_ref, {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -323,21 +359,21 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert_not_equals(ptr, NULL, result);
cmc_assert_equals(size_t, 1234, *result);
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(get_ref[count = 0], {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
cmc_assert_equals(ptr, NULL, hm_get_ref(map, 4321));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(contains, {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -345,21 +381,21 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert(hm_contains(map, 987654321));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(contains[count = 0], {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
cmc_assert(!hm_contains(map, 987654321));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(contains[sum], {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -373,11 +409,11 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert_equals(size_t, 15050, sum);
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(empty, {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -387,12 +423,12 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert(!hm_empty(map));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(full, {
struct hashmap *map =
hm_new(cmc_hashtable_primes[0], 0.99999, cmp, hash);
hm_new(cmc_hashtable_primes[0], 0.99999, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -409,11 +445,11 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert(!hm_full(map));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(count, {
struct hashmap *map = hm_new(100, 0.6, cmp, hash);
struct hashmap *map = hm_new(100, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
@@ -423,37 +459,37 @@ CMC_CREATE_UNIT(hashmap_test, true, {
cmc_assert_equals(size_t, i, hm_count(map));
}
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(capacity, {
struct hashmap *map = hm_new(2500, 0.6, cmp, hash);
struct hashmap *map = hm_new(2500, 0.6, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
cmc_assert_greater_equals(size_t, (size_t)(2500 / 0.6),
hm_capacity(map));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(capacity[small], {
struct hashmap *map = hm_new(1, 0.99, cmp, hash);
struct hashmap *map = hm_new(1, 0.99, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
cmc_assert_equals(size_t, cmc_hashtable_primes[0], hm_capacity(map));
hm_free(map, NULL);
hm_free(map);
});
CMC_CREATE_TEST(load, {
struct hashmap *map = hm_new(1, 0.99, cmp, hash);
struct hashmap *map = hm_new(1, 0.99, hm_ftab_key, hm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
cmc_assert_in_range(double, 0.99 - 0.0001, 0.99 + 0.0001, hm_load(map));
hm_free(map, NULL);
hm_free(map);
});
});