mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-12-22 20:16:54 +03:00
utils: Add hashmap_count()
Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
This commit is contained in:
parent
3e02961ec8
commit
088917641f
@ -197,7 +197,7 @@ basic_fixture_teardown(void)
|
|||||||
|
|
||||||
START_TEST(empty_hashmap_create_destroy)
|
START_TEST(empty_hashmap_create_destroy)
|
||||||
{
|
{
|
||||||
/* Do nothing in here, all the checks are in the fixture */
|
ck_assert_int_eq(hashmap_count(test_hashmap), 0);
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
@ -213,6 +213,7 @@ START_TEST(insert_works)
|
|||||||
hashmap_test_value_t *value = hashmap_insert(test_hashmap, corestring_nsurl_about_blank);
|
hashmap_test_value_t *value = hashmap_insert(test_hashmap, corestring_nsurl_about_blank);
|
||||||
ck_assert(value != NULL);
|
ck_assert(value != NULL);
|
||||||
ck_assert(value->key == corestring_nsurl_about_blank);
|
ck_assert(value->key == corestring_nsurl_about_blank);
|
||||||
|
ck_assert_int_eq(hashmap_count(test_hashmap), 1);
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
@ -229,9 +230,11 @@ START_TEST(insert_then_remove)
|
|||||||
ck_assert(value->key == corestring_nsurl_about_blank);
|
ck_assert(value->key == corestring_nsurl_about_blank);
|
||||||
ck_assert_int_eq(keys, 1);
|
ck_assert_int_eq(keys, 1);
|
||||||
ck_assert_int_eq(values, 1);
|
ck_assert_int_eq(values, 1);
|
||||||
|
ck_assert_int_eq(hashmap_count(test_hashmap), 1);
|
||||||
ck_assert(hashmap_remove(test_hashmap, corestring_nsurl_about_blank) == true);
|
ck_assert(hashmap_remove(test_hashmap, corestring_nsurl_about_blank) == true);
|
||||||
ck_assert_int_eq(keys, 0);
|
ck_assert_int_eq(keys, 0);
|
||||||
ck_assert_int_eq(values, 0);
|
ck_assert_int_eq(values, 0);
|
||||||
|
ck_assert_int_eq(hashmap_count(test_hashmap), 0);
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
@ -450,6 +453,7 @@ START_TEST(chain_add_all_twice_remove_all_iterate)
|
|||||||
iteration_stop = 0;
|
iteration_stop = 0;
|
||||||
ck_assert(hashmap_iterate(test_hashmap, hashmap_test_iterator_cb, &iteration_ctx) == false);
|
ck_assert(hashmap_iterate(test_hashmap, hashmap_test_iterator_cb, &iteration_ctx) == false);
|
||||||
ck_assert_int_eq(iteration_counter, chain_count);
|
ck_assert_int_eq(iteration_counter, chain_count);
|
||||||
|
ck_assert_int_eq(hashmap_count(test_hashmap), chain_count);
|
||||||
|
|
||||||
iteration_counter = 0;
|
iteration_counter = 0;
|
||||||
iteration_stop = chain_count;
|
iteration_stop = chain_count;
|
||||||
@ -469,6 +473,7 @@ START_TEST(chain_add_all_twice_remove_all_iterate)
|
|||||||
|
|
||||||
ck_assert_int_eq(keys, 0);
|
ck_assert_int_eq(keys, 0);
|
||||||
ck_assert_int_eq(values, 0);
|
ck_assert_int_eq(values, 0);
|
||||||
|
ck_assert_int_eq(hashmap_count(test_hashmap), 0);
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
@ -55,6 +55,11 @@ struct hashmap_s {
|
|||||||
* The number of buckets in this map
|
* The number of buckets in this map
|
||||||
*/
|
*/
|
||||||
uint32_t bucket_count;
|
uint32_t bucket_count;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of entries in this map
|
||||||
|
*/
|
||||||
|
size_t entry_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Exported function, documented in hashmap.h */
|
/* Exported function, documented in hashmap.h */
|
||||||
@ -65,14 +70,16 @@ hashmap_create(hashmap_parameters_t *params)
|
|||||||
|
|
||||||
ret->params = params;
|
ret->params = params;
|
||||||
ret->bucket_count = DEFAULT_HASHMAP_BUCKETS;
|
ret->bucket_count = DEFAULT_HASHMAP_BUCKETS;
|
||||||
|
ret->entry_count = 0;
|
||||||
ret->buckets = malloc(ret->bucket_count * sizeof(hashmap_entry_t *));
|
ret->buckets = malloc(ret->bucket_count * sizeof(hashmap_entry_t *));
|
||||||
memset(ret->buckets, 0, ret->bucket_count * sizeof(hashmap_entry_t *));
|
|
||||||
|
|
||||||
if (ret->buckets == NULL) {
|
if (ret->buckets == NULL) {
|
||||||
free(ret);
|
free(ret);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(ret->buckets, 0, ret->bucket_count * sizeof(hashmap_entry_t *));
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,6 +184,8 @@ hashmap_insert(hashmap_t *hashmap, void *key)
|
|||||||
|
|
||||||
hashmap->buckets[bucket] = entry;
|
hashmap->buckets[bucket] = entry;
|
||||||
|
|
||||||
|
hashmap->entry_count++;
|
||||||
|
|
||||||
return entry->value;
|
return entry->value;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
@ -207,6 +216,7 @@ hashmap_remove(hashmap_t *hashmap, void *key)
|
|||||||
}
|
}
|
||||||
*entry->prevptr = entry->next;
|
*entry->prevptr = entry->next;
|
||||||
free(entry);
|
free(entry);
|
||||||
|
hashmap->entry_count--;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -233,3 +243,10 @@ hashmap_iterate(hashmap_t *hashmap, hashmap_iteration_cb_t cb, void *ctx)
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Exported function, documented in hashmap.h */
|
||||||
|
size_t
|
||||||
|
hashmap_count(hashmap_t *hashmap)
|
||||||
|
{
|
||||||
|
return hashmap->entry_count;
|
||||||
|
}
|
||||||
|
@ -186,4 +186,12 @@ bool hashmap_remove(hashmap_t *hashmap, void *key);
|
|||||||
*/
|
*/
|
||||||
bool hashmap_iterate(hashmap_t *hashmap, hashmap_iteration_cb_t cb, void *ctx);
|
bool hashmap_iterate(hashmap_t *hashmap, hashmap_iteration_cb_t cb, void *ctx);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the number of entries in this map
|
||||||
|
*
|
||||||
|
* \param hashmap The hashmap to retrieve the entry count from
|
||||||
|
* \return The number of entries in the hashmap
|
||||||
|
*/
|
||||||
|
size_t hashmap_count(hashmap_t *hashmap);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user