Huge changes to bidimap and added callbacks to it

Callbacks lost their 'on_' prefix
Bidimap was simply not working properly. Many of its functions have been reworked:
- _update_key_by_val is now _update_key
- _update_val_by_key is now _update_val
- Removed _update_key and _update_val because they just weren't what a bidimap really is about
This commit is contained in:
Leonardo committed 2020-03-18 16:36:05 -03:00
1 parent 0089abc84a
commit 4e96d3aba0
6 files changed
+484 -443

No files matched your search

+81 -50
View File
@@ -41,8 +41,8 @@ CMC_CREATE_UNIT(bidimap_test, true, {
for (size_t i = 0; i < map->capacity; i++)
{
cmc_assert_equals(ptr, NULL, map->key_buffer[i]);
cmc_assert_equals(ptr, NULL, map->val_buffer[i]);
cmc_assert_equals(ptr, NULL, map->buffer[i][0]);
cmc_assert_equals(ptr, NULL, map->buffer[i][1]);
}
bm_free(map);
@@ -62,6 +62,23 @@ CMC_CREATE_UNIT(bidimap_test, true, {
bm_free(map);
});
CMC_CREATE_TEST(insert[references], {
struct bidimap *map = bm_new(500, 0.7, bm_ftab_key, bm_ftab_val);
cmc_assert_not_equals(ptr, NULL, map);
for (size_t i = 0; i < 500; i++)
cmc_assert(bm_insert(map, i, i));
for (size_t i = 0; i < map->capacity; i++)
{
struct bidimap_entry *kentry = map->buffer[i][0];
struct bidimap_entry *ventry = map->buffer[i][1];
}
bm_free(map);
});
CMC_CREATE_TEST(new_custom[insert remove], {
struct bidimap *map =
bm_new_custom(500, 0.6, bm_ftab_key, bm_ftab_val,
@@ -124,9 +141,9 @@ CMC_CREATE_UNIT(bidimap_test, true, {
for (size_t i = 0; i < bm_capacity(map); i++)
{
if (map->key_buffer[i] && map->key_buffer[i] != CMC_ENTRY_DELETED)
if (map->buffer[i][0] && map->buffer[i][0] != CMC_ENTRY_DELETED)
{
sum += map->key_buffer[i]->key;
sum += map->buffer[i][0]->key;
}
}
@@ -254,8 +271,8 @@ CMC_CREATE_UNIT(bidimap_test, true, {
for (size_t i = 0; i < map->capacity; i++)
{
struct bidimap_entry *k = map->key_buffer[i];
struct bidimap_entry *v = map->val_buffer[i];
struct bidimap_entry *k = map->buffer[i][0];
struct bidimap_entry *v = map->buffer[i][1];
cmc_assert((k == NULL || k == CMC_ENTRY_DELETED) &&
(v == NULL || v == CMC_ENTRY_DELETED));
@@ -287,8 +304,8 @@ CMC_CREATE_UNIT(bidimap_test, true, {
for (size_t i = 0; i < map->capacity; i++)
{
struct bidimap_entry *k = map->key_buffer[i];
struct bidimap_entry *v = map->val_buffer[i];
struct bidimap_entry *k = map->buffer[i][0];
struct bidimap_entry *v = map->buffer[i][1];
cmc_assert((k == NULL || k == CMC_ENTRY_DELETED) &&
(v == NULL || v == CMC_ENTRY_DELETED));
@@ -383,7 +400,7 @@ CMC_CREATE_UNIT(bidimap_test, true, {
bm_clear(map);
cmc_assert_equals(int32_t, cmc_flags.OK, bm_flag(map));
// update_key
// bm_update_key
cmc_assert(!bm_update_key(map, 1, 1));
cmc_assert_equals(int32_t, cmc_flags.EMPTY, bm_flag(map));
@@ -392,36 +409,17 @@ CMC_CREATE_UNIT(bidimap_test, true, {
cmc_assert_equals(int32_t, cmc_flags.NOT_FOUND, bm_flag(map));
cmc_assert(bm_insert(map, 2, 2));
cmc_assert(!bm_update_key(map, 1, 2));
cmc_assert_equals(int32_t, cmc_flags.DUPLICATE, bm_flag(map));
map->flag = cmc_flags.ERROR;
cmc_assert(!bm_update_key(map, 2, 1));
cmc_assert_equals(int32_t, cmc_flags.DUPLICATE, bm_flag(map));
// clear
bm_clear(map);
cmc_assert_equals(int32_t, cmc_flags.OK, bm_flag(map));
// update_key_by_val
cmc_assert(!bm_update_key_by_val(map, 1, 1));
cmc_assert_equals(int32_t, cmc_flags.EMPTY, bm_flag(map));
cmc_assert(bm_insert(map, 1, 1));
cmc_assert(!bm_update_key_by_val(map, 2, 1));
cmc_assert_equals(int32_t, cmc_flags.NOT_FOUND, bm_flag(map));
cmc_assert(bm_insert(map, 2, 2));
cmc_assert(!bm_update_key_by_val(map, 2, 1));
cmc_assert_equals(int32_t, cmc_flags.DUPLICATE, bm_flag(map));
map->flag = cmc_flags.ERROR;
cmc_assert(!bm_update_key_by_val(map, 1, 2));
cmc_assert(!bm_update_key(map, 1, 2));
cmc_assert_equals(int32_t, cmc_flags.DUPLICATE, bm_flag(map));
// clear
bm_clear(map);
cmc_assert_equals(int32_t, cmc_flags.OK, bm_flag(map));
// update_val
// bm_update_val
cmc_assert(!bm_update_val(map, 1, 1));
cmc_assert_equals(int32_t, cmc_flags.EMPTY, bm_flag(map));
@@ -430,29 +428,10 @@ CMC_CREATE_UNIT(bidimap_test, true, {
cmc_assert_equals(int32_t, cmc_flags.NOT_FOUND, bm_flag(map));
cmc_assert(bm_insert(map, 2, 2));
cmc_assert(!bm_update_val(map, 1, 2));
cmc_assert_equals(int32_t, cmc_flags.DUPLICATE, bm_flag(map));
map->flag = cmc_flags.ERROR;
cmc_assert(!bm_update_val(map, 2, 1));
cmc_assert_equals(int32_t, cmc_flags.DUPLICATE, bm_flag(map));
// clear
bm_clear(map);
cmc_assert_equals(int32_t, cmc_flags.OK, bm_flag(map));
// update_val_by_key
cmc_assert(!bm_update_val_by_key(map, 1, 1));
cmc_assert_equals(int32_t, cmc_flags.EMPTY, bm_flag(map));
cmc_assert(bm_insert(map, 1, 1));
cmc_assert(!bm_update_val_by_key(map, 2, 1));
cmc_assert_equals(int32_t, cmc_flags.NOT_FOUND, bm_flag(map));
cmc_assert(bm_insert(map, 2, 2));
cmc_assert(!bm_update_val_by_key(map, 2, 1));
cmc_assert_equals(int32_t, cmc_flags.DUPLICATE, bm_flag(map));
map->flag = cmc_flags.ERROR;
cmc_assert(!bm_update_val_by_key(map, 1, 2));
cmc_assert(!bm_update_val(map, 1, 2));
cmc_assert_equals(int32_t, cmc_flags.DUPLICATE, bm_flag(map));
// remove_by_key
@@ -530,4 +509,56 @@ CMC_CREATE_UNIT(bidimap_test, true, {
bm_free(map);
bm_free(map2);
});
CMC_CREATE_TEST(callbacks, {
struct bidimap *map = bm_new_custom(100, 0.7, bm_ftab_key, bm_ftab_val, NULL, callbacks);
cmc_assert_not_equals(ptr, NULL, map);
cmc_assert_equals(ptr, callbacks, map->callbacks);
total_create = 0;
total_read = 0;
total_update = 0;
total_delete = 0;
total_resize = 0;
cmc_assert(bm_insert(map, 10, 10));
cmc_assert_equals(int32_t, 1, total_create);
cmc_assert(bm_update_key(map, 10, 5));
cmc_assert_equals(int32_t, 1, total_update);
cmc_assert(bm_update_val(map, 5, 5));
cmc_assert_equals(int32_t, 2, total_update);
cmc_assert(bm_insert(map, 10, 10));
cmc_assert_equals(int32_t, 2, total_create);
cmc_assert(bm_remove_by_key(map, 5, NULL, NULL));
cmc_assert_equals(int32_t, 1, total_delete);
cmc_assert(bm_remove_by_val(map, 10, NULL, NULL));
cmc_assert_equals(int32_t, 2, total_delete);
cmc_assert(bm_insert(map, 1, 2));
cmc_assert_equals(size_t, 1, bm_get_key(map, 2));
cmc_assert_equals(int32_t, 1, total_read);
cmc_assert_equals(size_t, 2, bm_get_val(map, 1));
cmc_assert_equals(int32_t, 2, total_read);
cmc_assert(bm_resize(map, 1000));
cmc_assert_equals(int32_t, 1, total_resize);
cmc_assert(bm_resize(map, 200));
cmc_assert_equals(int32_t, 2, total_resize);
cmc_assert(bm_contains_key(map, 1));
cmc_assert_equals(int32_t, 3, total_read);
cmc_assert(bm_contains_val(map, 2));
cmc_assert_equals(int32_t, 4, total_read);
bm_free(map);
});
});
+41
View File
@@ -65,4 +65,45 @@ size_t hash0(size_t a)
return 0;
}
// callbacks
int total_create = 0;
int total_read = 0;
int total_update = 0;
int total_delete = 0;
int total_resize = 0;
void callback_create(void)
{
total_create++;
}
void callback_read(void)
{
total_read++;
}
void callback_update(void)
{
total_update++;
}
void callback_delete(void)
{
total_delete++;
}
void callback_resize(void)
{
total_resize++;
}
struct cmc_callbacks *callbacks = &(struct cmc_callbacks) {
.create = callback_create,
.read = callback_read,
.update = callback_update,
.delete = callback_delete,
.resize = callback_resize
};
#endif /* CMC_UNIT_TEST_UTL__ */