Change ArrayOf.bsearch() return semantics
Towards consolidating all array bsearch/...
This commit is contained in:
parent
5cd9546ba7
commit
30cb45b3ea
@ -49,7 +49,7 @@ kerxTupleKern (int value,
|
|||||||
const void *base,
|
const void *base,
|
||||||
hb_aat_apply_context_t *c)
|
hb_aat_apply_context_t *c)
|
||||||
{
|
{
|
||||||
if (likely (!tupleCount)) return value;
|
if (likely (!tupleCount || !c)) return value;
|
||||||
|
|
||||||
unsigned int offset = value;
|
unsigned int offset = value;
|
||||||
const FWORD *pv = &StructAtOffset<FWORD> (base, offset);
|
const FWORD *pv = &StructAtOffset<FWORD> (base, offset);
|
||||||
@ -93,21 +93,11 @@ struct KernPair
|
|||||||
template <typename KernSubTableHeader>
|
template <typename KernSubTableHeader>
|
||||||
struct KerxSubTableFormat0
|
struct KerxSubTableFormat0
|
||||||
{
|
{
|
||||||
inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
|
|
||||||
{
|
|
||||||
hb_glyph_pair_t pair = {left, right};
|
|
||||||
int i = pairs.bsearch (pair);
|
|
||||||
if (i == -1) return 0;
|
|
||||||
return pairs[i].get_kerning ();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right,
|
inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right,
|
||||||
hb_aat_apply_context_t *c) const
|
hb_aat_apply_context_t *c = nullptr) const
|
||||||
{
|
{
|
||||||
hb_glyph_pair_t pair = {left, right};
|
hb_glyph_pair_t pair = {left, right};
|
||||||
int i = pairs.bsearch (pair);
|
int v = pairs.bsearch (pair).get_kerning ();
|
||||||
if (i == -1) return 0;
|
|
||||||
int v = pairs[i].get_kerning ();
|
|
||||||
return kerxTupleKern (v, header.tuple_count (), this, c);
|
return kerxTupleKern (v, header.tuple_count (), this, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,10 +111,14 @@ typedef struct OffsetTable
|
|||||||
{
|
{
|
||||||
Tag t;
|
Tag t;
|
||||||
t.set (tag);
|
t.set (tag);
|
||||||
int i = tables.bsearch (t);
|
unsigned int i;
|
||||||
if (table_index)
|
if (tables.bfind (t, &i))
|
||||||
*table_index = i == -1 ? (unsigned) Index::NOT_FOUND_INDEX : (unsigned) i;
|
{
|
||||||
return i != -1;
|
if (table_index) *table_index = i;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (table_index) *table_index = (unsigned) Index::NOT_FOUND_INDEX;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
inline const TableRecord& get_table_by_tag (hb_tag_t tag) const
|
inline const TableRecord& get_table_by_tag (hb_tag_t tag) const
|
||||||
{
|
{
|
||||||
|
@ -740,21 +740,45 @@ struct ArrayOfM1
|
|||||||
template <typename Type, typename LenType=HBUINT16>
|
template <typename Type, typename LenType=HBUINT16>
|
||||||
struct SortedArrayOf : ArrayOf<Type, LenType>
|
struct SortedArrayOf : ArrayOf<Type, LenType>
|
||||||
{
|
{
|
||||||
template <typename SearchType>
|
template <typename T>
|
||||||
inline int bsearch (const SearchType &x) const
|
inline Type &bsearch (const T &x)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
return bfind (x, &i) ? this->arrayZ[i] : Crap(Type);
|
||||||
|
}
|
||||||
|
template <typename T>
|
||||||
|
inline const Type &bsearch (const T &x) const
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
return bfind (x, &i) ? this->arrayZ[i] : Null(Type);
|
||||||
|
}
|
||||||
|
template <typename T>
|
||||||
|
inline bool bfind (const T &x, unsigned int *i = nullptr) const
|
||||||
{
|
{
|
||||||
/* Hand-coded bsearch here since this is in the hot inner loop. */
|
|
||||||
const Type *arr = this->arrayZ;
|
|
||||||
int min = 0, max = (int) this->len - 1;
|
int min = 0, max = (int) this->len - 1;
|
||||||
|
const Type *array = this->arrayZ;
|
||||||
while (min <= max)
|
while (min <= max)
|
||||||
{
|
{
|
||||||
int mid = ((unsigned int) min + (unsigned int) max) / 2;
|
int mid = ((unsigned int) min + (unsigned int) max) / 2;
|
||||||
int c = arr[mid].cmp (x);
|
int c = array[mid].cmp (x);
|
||||||
if (c < 0) max = mid - 1;
|
if (c < 0)
|
||||||
else if (c > 0) min = mid + 1;
|
max = mid - 1;
|
||||||
else return mid;
|
else if (c > 0)
|
||||||
|
min = mid + 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (i)
|
||||||
|
*i = mid;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return -1;
|
}
|
||||||
|
if (i)
|
||||||
|
{
|
||||||
|
if (max < 0 || (max < (int) this->len && array[max].cmp (x) > 0))
|
||||||
|
max++;
|
||||||
|
*i = max;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -468,10 +468,7 @@ struct CmapSubtableLongSegmented
|
|||||||
|
|
||||||
inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
|
inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
|
||||||
{
|
{
|
||||||
int i = groups.bsearch (codepoint);
|
hb_codepoint_t gid = T::group_get_glyph (groups.bsearch (codepoint), codepoint);
|
||||||
if (i == -1)
|
|
||||||
return false;
|
|
||||||
hb_codepoint_t gid = T::group_get_glyph (groups[i], codepoint);
|
|
||||||
if (!gid)
|
if (!gid)
|
||||||
return false;
|
return false;
|
||||||
*glyph = gid;
|
*glyph = gid;
|
||||||
@ -518,7 +515,8 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented<CmapSubtableFormat12>
|
|||||||
{
|
{
|
||||||
static inline hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group,
|
static inline hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group,
|
||||||
hb_codepoint_t u)
|
hb_codepoint_t u)
|
||||||
{ return group.glyphID + (u - group.startCharCode); }
|
{ return likely (group.startCharCode <= group.endCharCode) ?
|
||||||
|
group.glyphID + (u - group.startCharCode) : 0; }
|
||||||
|
|
||||||
|
|
||||||
bool serialize (hb_serialize_context_t *c,
|
bool serialize (hb_serialize_context_t *c,
|
||||||
@ -674,16 +672,12 @@ struct VariationSelectorRecord
|
|||||||
hb_codepoint_t *glyph,
|
hb_codepoint_t *glyph,
|
||||||
const void *base) const
|
const void *base) const
|
||||||
{
|
{
|
||||||
int i;
|
if ((base+defaultUVS).bfind (codepoint))
|
||||||
const DefaultUVS &defaults = base+defaultUVS;
|
|
||||||
i = defaults.bsearch (codepoint);
|
|
||||||
if (i != -1)
|
|
||||||
return GLYPH_VARIANT_USE_DEFAULT;
|
return GLYPH_VARIANT_USE_DEFAULT;
|
||||||
const NonDefaultUVS &nonDefaults = base+nonDefaultUVS;
|
const UVSMapping &nonDefault = (base+nonDefaultUVS).bsearch (codepoint);
|
||||||
i = nonDefaults.bsearch (codepoint);
|
if (nonDefault.glyphID)
|
||||||
if (i != -1 && nonDefaults[i].glyphID)
|
|
||||||
{
|
{
|
||||||
*glyph = nonDefaults[i].glyphID;
|
*glyph = nonDefault.glyphID;
|
||||||
return GLYPH_VARIANT_FOUND;
|
return GLYPH_VARIANT_FOUND;
|
||||||
}
|
}
|
||||||
return GLYPH_VARIANT_NOT_FOUND;
|
return GLYPH_VARIANT_NOT_FOUND;
|
||||||
@ -723,7 +717,7 @@ struct CmapSubtableFormat14
|
|||||||
hb_codepoint_t variation_selector,
|
hb_codepoint_t variation_selector,
|
||||||
hb_codepoint_t *glyph) const
|
hb_codepoint_t *glyph) const
|
||||||
{
|
{
|
||||||
return record[record.bsearch (variation_selector)].get_glyph (codepoint, glyph, this);
|
return record.bsearch (variation_selector).get_glyph (codepoint, glyph, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void collect_variation_selectors (hb_set_t *out) const
|
inline void collect_variation_selectors (hb_set_t *out) const
|
||||||
@ -735,7 +729,7 @@ struct CmapSubtableFormat14
|
|||||||
inline void collect_variation_unicodes (hb_codepoint_t variation_selector,
|
inline void collect_variation_unicodes (hb_codepoint_t variation_selector,
|
||||||
hb_set_t *out) const
|
hb_set_t *out) const
|
||||||
{
|
{
|
||||||
record[record.bsearch (variation_selector)].collect_unicodes (out, this);
|
record.bsearch (variation_selector).collect_unicodes (out, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
@ -1157,11 +1151,11 @@ struct cmap
|
|||||||
key.platformID.set (platform_id);
|
key.platformID.set (platform_id);
|
||||||
key.encodingID.set (encoding_id);
|
key.encodingID.set (encoding_id);
|
||||||
|
|
||||||
int result = encodingRecord.bsearch (key);
|
const EncodingRecord &result = encodingRecord.bsearch (key);
|
||||||
if (result == -1 || !encodingRecord[result].subtable)
|
if (!result.subtable)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return &(this+encodingRecord[result].subtable);
|
return &(this+result.subtable);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -103,8 +103,7 @@ struct SVG
|
|||||||
|
|
||||||
inline const SVGDocumentIndexEntry &get_glyph_entry (hb_codepoint_t glyph_id) const
|
inline const SVGDocumentIndexEntry &get_glyph_entry (hb_codepoint_t glyph_id) const
|
||||||
{
|
{
|
||||||
const SortedArrayOf<SVGDocumentIndexEntry> &docs = this+svgDocEntries;
|
return (this+svgDocEntries).bsearch (glyph_id);
|
||||||
return docs[docs.bsearch (glyph_id)];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
|
@ -128,15 +128,12 @@ struct RecordArrayOf : SortedArrayOf<Record<Type> >
|
|||||||
}
|
}
|
||||||
inline bool find_index (hb_tag_t tag, unsigned int *index) const
|
inline bool find_index (hb_tag_t tag, unsigned int *index) const
|
||||||
{
|
{
|
||||||
/* If we want to allow non-sorted data, we can lsearch(). */
|
if (!this->bfind (tag, index))
|
||||||
int i = this->/*lsearch*/bsearch (tag);
|
{
|
||||||
if (i != -1) {
|
|
||||||
if (index) *index = i;
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
if (index) *index = Index::NOT_FOUND_INDEX;
|
if (index) *index = Index::NOT_FOUND_INDEX;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -823,8 +820,9 @@ struct CoverageFormat1
|
|||||||
private:
|
private:
|
||||||
inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
|
inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
|
||||||
{
|
{
|
||||||
int i = glyphArray.bsearch (glyph_id);
|
unsigned int i;
|
||||||
static_assert ((((unsigned int) -1) == NOT_COVERED), "");
|
if (!glyphArray.bfind (glyph_id, &i))
|
||||||
|
return NOT_COVERED;
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -896,12 +894,10 @@ struct CoverageFormat2
|
|||||||
private:
|
private:
|
||||||
inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
|
inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
|
||||||
{
|
{
|
||||||
int i = rangeRecord.bsearch (glyph_id);
|
const RangeRecord &range = rangeRecord.bsearch (glyph_id);
|
||||||
if (i != -1) {
|
return likely (range.start <= range.end) ?
|
||||||
const RangeRecord &range = rangeRecord[i];
|
(unsigned int) range.value + (glyph_id - range.start) :
|
||||||
return (unsigned int) range.value + (glyph_id - range.start);
|
NOT_COVERED;
|
||||||
}
|
|
||||||
return NOT_COVERED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool serialize (hb_serialize_context_t *c,
|
inline bool serialize (hb_serialize_context_t *c,
|
||||||
@ -1277,10 +1273,7 @@ struct ClassDefFormat2
|
|||||||
private:
|
private:
|
||||||
inline unsigned int get_class (hb_codepoint_t glyph_id) const
|
inline unsigned int get_class (hb_codepoint_t glyph_id) const
|
||||||
{
|
{
|
||||||
int i = rangeRecord.bsearch (glyph_id);
|
return rangeRecord.bsearch (glyph_id).value;
|
||||||
if (unlikely (i != -1))
|
|
||||||
return rangeRecord[i].value;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
|
@ -63,11 +63,10 @@ struct VORG
|
|||||||
|
|
||||||
inline int get_y_origin (hb_codepoint_t glyph) const
|
inline int get_y_origin (hb_codepoint_t glyph) const
|
||||||
{
|
{
|
||||||
int i = vertYOrigins.bsearch (glyph);
|
unsigned int i;
|
||||||
if (i != -1)
|
if (!vertYOrigins.bfind (glyph, &i))
|
||||||
return vertYOrigins[i].vertOriginY;
|
|
||||||
|
|
||||||
return defaultVertOriginY;
|
return defaultVertOriginY;
|
||||||
|
return vertYOrigins[i].vertOriginY;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool _subset (const hb_subset_plan_t *plan HB_UNUSED,
|
inline bool _subset (const hb_subset_plan_t *plan HB_UNUSED,
|
||||||
|
@ -260,7 +260,7 @@ struct hb_vector_t
|
|||||||
return bfind (x, &i) ? &arrayZ()[i] : nullptr;
|
return bfind (x, &i) ? &arrayZ()[i] : nullptr;
|
||||||
}
|
}
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline bool bfind (const T &x, unsigned int *i) const
|
inline bool bfind (const T &x, unsigned int *i = nullptr) const
|
||||||
{
|
{
|
||||||
int min = 0, max = (int) this->len - 1;
|
int min = 0, max = (int) this->len - 1;
|
||||||
const Type *array = this->arrayZ();
|
const Type *array = this->arrayZ();
|
||||||
@ -274,13 +274,17 @@ struct hb_vector_t
|
|||||||
min = mid + 1;
|
min = mid + 1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (i)
|
||||||
*i = mid;
|
*i = mid;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (i)
|
||||||
|
{
|
||||||
if (max < 0 || (max < (int) this->len && array[max].cmp (&x) > 0))
|
if (max < 0 || (max < (int) this->len && array[max].cmp (&x) > 0))
|
||||||
max++;
|
max++;
|
||||||
*i = max;
|
*i = max;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user