where the `key` variable represent a string used to index the `value`. The `state`, instead, indicates whether the entry is empty, occupied or deleted and is primarily used
by the garbage collector for internal memory management. An array of `map_element_t`,
with the variables indicating the *capacity*, the *current size* and
the *tombstone count* (that is, the number of delete entries), form a `map_t` data type.
The keys are **copied** by the hashmap; this means that it **owns** them and is therefore
responsible for managing their memory. Values, on the other hand,
**are stored as pointers**. This means that the hashmap **does NOT own them** and that
the caller is responsible for managing their memory; this includes: allocate
enough memory for them, ensure that the pointers remain valid for their whole lifecycle
on the map, delete old values when updating a key and, if the values were heap-allocated,
free them before removing the keys or destroying the map.
The `Map` data structure supports the following methods:
-`map_result_t map_new()`: initialize a new map;
-`map_result_t map_add(map, key, value)`: add a `(key, value)` pair to the map;
-`map_result_t map_get(map, key)`: retrieve a values indexed by `key` if it exists;
-`map_result_t map_remove(map, key)`: remove a key from the map if it exists;
-`map_result_t map_clear(map)`: reset the map state;
-`map_result_t map_destroy(map)`: delete the map;
-`size_t map_size(map)`: returns map size (i.e., the number of elements);
-`size_t map_capacity(map)`: returns map capacity (i.e., map total size).