template <typename SearchType>
inline int search (const SearchType &x) const {
class Cmp {
- public: static int cmp (const void *p1, const void *p2) {
- const SearchType *a = reinterpret_cast<const SearchType *>(p1);
- const Type *b = reinterpret_cast<const Type *>(p2);
- return b->cmp (*a);
- }
+ public: static int cmp (const SearchType *a, const Type *b) { return b->cmp (*a); }
};
- const Type *p = (const Type *) bsearch (&x, this->array, this->len, sizeof (this->array[0]), Cmp::cmp);
+ const Type *p = (const Type *) bsearch (&x, this->array, this->len, sizeof (this->array[0]), (hb_compare_func_t) Cmp::cmp);
return p ? p - this->array : -1;
}
};
struct hb_mask_allocator_t {
+ private:
+
struct feature_info_t {
hb_tag_t tag;
unsigned int value;
unsigned int seq;
bool global;
- static int
- cmp (const void *p1, const void *p2)
- {
- const feature_info_t *a = reinterpret_cast<const feature_info_t *>(p1);
- const feature_info_t *b = reinterpret_cast<const feature_info_t *>(p2);
-
- if (a->tag != b->tag)
- return a->tag < b->tag ? -1 : 1;
-
- return a->seq < b->seq ? -1 : 1;
- }
+ static int cmp (const feature_info_t *a, const feature_info_t *b)
+ { return (a->tag != b->tag) ? (a->tag < b->tag ? -1 : 1) : (a->seq < b->seq ? -1 : 1); }
};
struct feature_map_t {
unsigned int shift;
hb_mask_t mask;
- static int
- cmp (const void *p1, const void *p2)
- {
- const feature_map_t *a = reinterpret_cast<const feature_map_t *>(p1);
- const feature_map_t *b = reinterpret_cast<const feature_map_t *>(p2);
-
- return a->tag < b->tag ? -1 : a->tag > b->tag ? 1 : 0;
- }
+ 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; }
};
struct lookup_map_t {
unsigned int index;
hb_mask_t mask;
- static int
- cmp (const void *p1, const void *p2)
- {
- const lookup_map_t *a = reinterpret_cast<const lookup_map_t *>(p1);
- const lookup_map_t *b = reinterpret_cast<const lookup_map_t *>(p2);
-
- return a->index < b->index ? -1 : a->index > b->index ? 1 : 0;
- }
+ static int cmp (const lookup_map_t *a, const lookup_map_t *b)
+ { return a->index < b->index ? -1 : a->index > b->index ? 1 : 0; }
};
+ public:
hb_mask_allocator_t (void) : feature_count (0) {}
}
- /* Sort the features so we can bsearch later */
- qsort (feature_infos, feature_count, sizeof (feature_infos[0]), feature_info_t::cmp);
-
- /* Remove dups, let later-occurring features override earlier ones. */
+ /* Sort features and merge duplicates */
+ qsort (feature_infos, feature_count, sizeof (feature_infos[0]), (hb_compare_func_t) feature_info_t::cmp);
unsigned int j = 0;
for (unsigned int i = 1; i < feature_count; i++)
if (feature_infos[i].tag != feature_infos[j].tag)
add_lookups (c, table_index, feature_maps[i].index[table_index], feature_maps[i].mask);
/* Sort lookups and merge duplicates */
-
- qsort (lookup_maps[table_index], lookup_count[table_index], sizeof (lookup_maps[table_index][0]), lookup_map_t::cmp);
-
+ qsort (lookup_maps[table_index], lookup_count[table_index], sizeof (lookup_maps[table_index][0]), (hb_compare_func_t) lookup_map_t::cmp);
if (lookup_count[table_index])
{
unsigned int j = 0;
hb_mask_t get_global_mask (void) { return global_mask; }
hb_mask_t get_mask (hb_tag_t tag, unsigned int *shift) const {
- const feature_map_t *map = (const feature_map_t *) bsearch (&tag, feature_maps, feature_count, sizeof (feature_maps[0]), feature_map_t::cmp);
- if (likely (map)) {
- if (shift) *shift = map->shift;
- return map->mask;
- } else {
- if (shift) *shift = 0;
- return 0;
- }
+ const feature_map_t *map = (const feature_map_t *) bsearch (&tag, feature_maps, feature_count, sizeof (feature_maps[0]), (hb_compare_func_t) feature_map_t::cmp);
+ if (shift) *shift = map ? map->shift : 0;
+ return map ? map->mask : 0;
}
- void substitute (hb_ot_shape_context_t *c) const {
+ inline void substitute (hb_ot_shape_context_t *c) const {
for (unsigned int i = 0; i < lookup_count[0]; i++)
hb_ot_layout_substitute_lookup (c->face, c->buffer, lookup_maps[0][i].index, lookup_maps[0][i].mask);
}
- void position (hb_ot_shape_context_t *c) const {
+ inline void position (hb_ot_shape_context_t *c) const {
for (unsigned int i = 0; i < lookup_count[1]; i++)
hb_ot_layout_position_lookup (c->font, c->face, c->buffer, lookup_maps[1][i].index, lookup_maps[1][i].mask);
}
};
static int
-lang_compare_first_component (const void *pa,
- const void *pb)
+lang_compare_first_component (const char *a,
+ const char *b)
{
- const char *a = pa, *b = pb;
unsigned int da, db;
const char *p;
/* find a language matching in the first component */
lang_tag = bsearch (lang_str, ot_languages,
ARRAY_LENGTH (ot_languages), sizeof (LangTag),
- lang_compare_first_component);
+ (hb_compare_func_t) lang_compare_first_component);
/* we now need to find the best language matching */
if (lang_tag)
/* go to the final one matching in the first component */
while (lang_tag + 1 < ot_languages + ARRAY_LENGTH (ot_languages) &&
- lang_compare_first_component (lang_str, lang_tag + 1) == 0)
+ lang_compare_first_component (lang_str, (lang_tag + 1)->language) == 0)
lang_tag++;
/* go back, find which one matches completely */
while (lang_tag >= ot_languages &&
- lang_compare_first_component (lang_str, lang_tag) == 0)
+ lang_compare_first_component (lang_str, lang_tag->language) == 0)
{
if (lang_matches (lang_str, lang_tag->language)) {
found = TRUE;