[map] Add clear(), is_empty(), and get_population()

This commit is contained in:
Behdad Esfahbod 2018-05-29 17:09:17 -07:00
parent b6959c33e2
commit 661e9ae4a5
3 changed files with 70 additions and 12 deletions

View File

@ -66,8 +66,7 @@ struct hb_map_t
inline void init_shallow (void)
{
in_error = false;
population = 0;
occupancy = 0;
population = occupancy = 0;
mask = 0;
prime = 0;
items = nullptr;
@ -105,8 +104,7 @@ struct hb_map_t
item_t *old_items = items;
/* Switch to new, empty, array. */
population = 0;
occupancy = 0;
population = occupancy = 0;
mask = new_size - 1;
prime = prime_for (power);
items = new_items;
@ -167,6 +165,22 @@ struct hb_map_t
static const hb_codepoint_t INVALID = HB_MAP_VALUE_INVALID;
inline void clear (void)
{
memset (items, 0xFF, ((size_t) mask + 1) * sizeof (item_t));
population = occupancy = 0;
}
inline bool is_empty (void) const
{
return population != 0;
}
inline unsigned int get_population () const
{
return population;
}
protected:
static HB_INTERNAL unsigned int prime_for (unsigned int shift);

View File

@ -228,6 +228,49 @@ hb_map_has (const hb_map_t *map,
}
/**
* hb_map_clear:
* @map: a map.
*
*
*
* Since: REPLACEME
**/
void
hb_map_clear (hb_map_t *map)
{
return map->clear ();
}
/**
* hb_map_is_empty:
* @map: a map.
*
*
*
* Since: REPLACEME
**/
hb_bool_t
hb_map_is_empty (const hb_map_t *map)
{
return map->is_empty ();
}
/**
* hb_map_get_population:
* @map: a map.
*
*
*
* Since: REPLACEME
**/
unsigned int
hb_map_get_population (const hb_map_t *map)
{
return map->get_population ();
}
/* Following comment and table copied from glib. */
/* Each table size has an associated prime modulo (the first prime
* lower than the table size) used to find the initial bucket. Probing

View File

@ -73,20 +73,21 @@ HB_EXTERN hb_bool_t
hb_map_allocation_successful (const hb_map_t *map);
/*
HB_EXTERN void
hb_map_clear (hb_map_t *map);
HB_EXTERN hb_bool_t
hb_map_is_empty (const hb_map_t *map);
HB_EXTERN unsigned int
hb_map_get_population (const hb_map_t *map);
HB_EXTERN hb_bool_t
hb_map_is_equal (const hb_map_t *map,
const hb_map_t *other);
*/
HB_EXTERN void
hb_map_clear (hb_map_t *map);
HB_EXTERN hb_bool_t
hb_map_is_empty (const hb_map_t *map);
HB_EXTERN unsigned int
hb_map_get_population (const hb_map_t *map);
HB_EXTERN void
hb_map_set (hb_map_t *map,
hb_codepoint_t key,