diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc index 22cbd7338..35ba611a9 100644 --- a/src/hb-aat-layout.cc +++ b/src/hb-aat-layout.cc @@ -139,11 +139,11 @@ hb_aat_layout_find_feature_mapping (hb_tag_t tag) return nullptr; #endif - return (const hb_aat_feature_mapping_t *) bsearch (&tag, - feature_mappings, - ARRAY_LENGTH (feature_mappings), - sizeof (feature_mappings[0]), - hb_aat_feature_mapping_t::cmp); + return (const hb_aat_feature_mapping_t *) hb_bsearch (&tag, + feature_mappings, + ARRAY_LENGTH (feature_mappings), + sizeof (feature_mappings[0]), + hb_aat_feature_mapping_t::cmp); } diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 38104fdb8..cd0416d7c 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -603,40 +603,19 @@ hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3) /* * Sort and search. */ - +template static inline void * hb_bsearch (const void *key, const void *base, size_t nmemb, size_t size, - int (*compar)(const void *_key, const void *_item)) + int (*compar)(const void *_key, const void *_item, Ts... args), + Ts... args) { int min = 0, max = (int) nmemb - 1; while (min <= max) { int mid = (min + max) / 2; const void *p = (const void *) (((const char *) base) + (mid * size)); - int c = compar (key, p); - if (c < 0) - max = mid - 1; - else if (c > 0) - min = mid + 1; - else - return (void *) p; - } - return nullptr; -} - -static inline void * -hb_bsearch_r (const void *key, const void *base, - size_t nmemb, size_t size, - int (*compar)(const void *_key, const void *_item, void *_arg), - void *arg) -{ - int min = 0, max = (int) nmemb - 1; - while (min <= max) - { - int mid = ((unsigned int) min + (unsigned int) max) / 2; - const void *p = (const void *) (((const char *) base) + (mid * size)); - int c = compar (key, p, arg); + int c = compar (key, p, args...); if (c < 0) max = mid - 1; else if (c > 0) diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh index 12e08316a..970bbe68a 100644 --- a/src/hb-ot-post-table.hh +++ b/src/hb-ot-post-table.hh @@ -168,8 +168,8 @@ struct post } hb_bytes_t st (name, len); - const uint16_t *gid = (const uint16_t *) hb_bsearch_r (hb_addressof (st), gids, count, - sizeof (gids[0]), cmp_key, (void *) this); + const uint16_t *gid = (const uint16_t *) hb_bsearch (hb_addressof (st), gids, count, + sizeof (gids[0]), cmp_key, (void *) this); if (gid) { *glyph = *gid; diff --git a/src/hb-ot-var-mvar-table.hh b/src/hb-ot-var-mvar-table.hh index 0dd63e510..5a9d2afb7 100644 --- a/src/hb-ot-var-mvar-table.hh +++ b/src/hb-ot-var-mvar-table.hh @@ -77,9 +77,9 @@ struct MVAR const int *coords, unsigned int coord_count) const { const VariationValueRecord *record; - record = (VariationValueRecord *) bsearch (&tag, valuesZ.arrayZ, - valueRecordCount, valueRecordSize, - tag_compare); + record = (VariationValueRecord *) hb_bsearch (&tag, valuesZ.arrayZ, + valueRecordCount, valueRecordSize, + tag_compare); if (!record) return 0.;