diff --git a/src/hb-ot-map-private.hh b/src/hb-ot-map-private.hh index 22690de57..105909a1f 100644 --- a/src/hb-ot-map-private.hh +++ b/src/hb-ot-map-private.hh @@ -53,8 +53,8 @@ struct hb_ot_map_t unsigned int auto_zwnj : 1; unsigned int auto_zwj : 1; - static int cmp (const feature_map_t *a, const feature_map_t *b) - { return a->tag < b->tag ? -1 : a->tag > b->tag ? 1 : 0; } + inline int cmp (const hb_tag_t *tag_) const + { return *tag_ < tag ? -1 : *tag_ > tag ? 1 : 0; } }; struct lookup_map_t { diff --git a/src/hb-private.hh b/src/hb-private.hh index 7f5cd697b..f2290448c 100644 --- a/src/hb-private.hh +++ b/src/hb-private.hh @@ -488,14 +488,38 @@ struct hb_prealloced_array_t } template - inline Type *bsearch (T *key) + inline Type *bsearch (T *x) { - return (Type *) ::bsearch (key, array, len, sizeof (Type), (hb_compare_func_t) Type::cmp); + int min = 0, max = (int) this->len - 1; + while (min <= max) + { + int mid = (min + max) / 2; + int c = this->array[mid].cmp (x); + if (c < 0) + max = mid - 1; + else if (c > 0) + min = mid + 1; + else + return &this->array[mid]; + } + return nullptr; } template - inline const Type *bsearch (T *key) const + inline const Type *bsearch (T *x) const { - return (const Type *) ::bsearch (key, array, len, sizeof (Type), (hb_compare_func_t) Type::cmp); + int min = 0, max = (int) this->len - 1; + while (min <= max) + { + int mid = (min + max) / 2; + int c = this->array[mid].cmp (x); + if (c < 0) + max = mid - 1; + else if (c > 0) + min = mid + 1; + else + return &this->array[mid]; + } + return nullptr; } inline void finish (void)