Use a unified bsearch (#1741)
authorEbrahim Byagowi <ebrahim@gnu.org>
Sat, 1 Jun 2019 19:49:57 +0000 (00:19 +0430)
committerGitHub <noreply@github.com>
Sat, 1 Jun 2019 19:49:57 +0000 (00:19 +0430)
A part of #593

src/hb-aat-layout.cc
src/hb-algs.hh
src/hb-ot-post-table.hh
src/hb-ot-var-mvar-table.hh

index 22cbd73..35ba611 100644 (file)
@@ -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);
 }
 
 
index 38104fd..cd0416d 100644 (file)
@@ -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 <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)
index 12e0831..970bbe6 100644 (file)
@@ -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;
index 0dd63e5..5a9d2af 100644 (file)
@@ -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.;