From 661e9ae4a55c198eb9fdb2c104979dd55a0fa1f1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 29 May 2018 17:09:17 -0700 Subject: [PATCH] [map] Add clear(), is_empty(), and get_population() --- src/hb-map-private.hh | 22 ++++++++++++++++++---- src/hb-map.cc | 43 +++++++++++++++++++++++++++++++++++++++++++ src/hb-map.h | 17 +++++++++-------- 3 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/hb-map-private.hh b/src/hb-map-private.hh index 7611021a8..64bcffc2b 100644 --- a/src/hb-map-private.hh +++ b/src/hb-map-private.hh @@ -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); diff --git a/src/hb-map.cc b/src/hb-map.cc index a317d9c52..702a926e0 100644 --- a/src/hb-map.cc +++ b/src/hb-map.cc @@ -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 diff --git a/src/hb-map.h b/src/hb-map.h index e24bfc4fc..618228308 100644 --- a/src/hb-map.h +++ b/src/hb-map.h @@ -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,