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);
}
/*
* Sort and search.
*/
-
+template <typename ...Ts>
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)
}
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;
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.;