From e16884248f80c52cd29e39a9b27b15422d76b0f1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Dec 2018 22:27:23 -0500 Subject: [PATCH] [iter] Port Coverage iterator to hb_iter_t --- src/hb-ot-layout-common.hh | 12 +++++++++--- src/hb-ot-layout-gpos-table.hh | 2 +- src/hb-ot-layout-gsub-table.hh | 26 +++++++++++++------------- src/hb-ot-layout-gsubgpos.hh | 8 ++++---- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index bc8d6616e..22d6079ba 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -1104,7 +1104,9 @@ struct Coverage } } - struct Iter + struct Iter : + hb_iter_t >, + hb_iter_mixin_t > { Iter (const Coverage &c_) { @@ -1117,7 +1119,7 @@ struct Coverage default: return; } } - bool more () const + bool __more__ () const { switch (format) { @@ -1126,7 +1128,7 @@ struct Coverage default:return false; } } - void next () + void __next__ () { switch (format) { @@ -1135,6 +1137,9 @@ struct Coverage default: break; } } + typedef hb_pair_t __item_type__; + __item_type__ __item__ () const { return hb_pair (get_coverage (), get_glyph ()); } + hb_codepoint_t get_glyph () const { switch (format) @@ -1161,6 +1166,7 @@ struct Coverage CoverageFormat1::Iter format1; } u; }; + Iter iter () const { return Iter (*this); } protected: union { diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 0b7b11088..5fca0b797 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -723,7 +723,7 @@ struct PairPosFormat1 bool intersects (const hb_set_t *glyphs) const { unsigned int count = pairSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 39b7cf225..74b4b7395 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -46,7 +46,7 @@ struct SingleSubstFormat1 void closure (hb_closure_context_t *c) const { - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { /* TODO Switch to range-based API to work around malicious fonts. * https://github.com/harfbuzz/harfbuzz/issues/363 */ @@ -59,7 +59,7 @@ struct SingleSubstFormat1 void collect_glyphs (hb_collect_glyphs_context_t *c) const { if (unlikely (!(this+coverage).add_coverage (c->input))) return; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { /* TODO Switch to range-based API to work around malicious fonts. * https://github.com/harfbuzz/harfbuzz/issues/363 */ @@ -110,7 +110,7 @@ struct SingleSubstFormat1 hb_vector_t from; hb_vector_t to; hb_codepoint_t delta = deltaGlyphID; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (!glyphset.has (iter.get_glyph ())) continue; from.push ()->set (glyph_map[iter.get_glyph ()]); @@ -146,7 +146,7 @@ struct SingleSubstFormat2 void closure (hb_closure_context_t *c) const { unsigned int count = substitute.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ @@ -159,7 +159,7 @@ struct SingleSubstFormat2 { if (unlikely (!(this+coverage).add_coverage (c->input))) return; unsigned int count = substitute.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ @@ -206,7 +206,7 @@ struct SingleSubstFormat2 const hb_map_t &glyph_map = *c->plan->glyph_map; hb_vector_t from; hb_vector_t to; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (!glyphset.has (iter.get_glyph ())) continue; from.push ()->set (glyph_map[iter.get_glyph ()]); @@ -362,7 +362,7 @@ struct MultipleSubstFormat1 void closure (hb_closure_context_t *c) const { unsigned int count = sequence.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ @@ -542,7 +542,7 @@ struct AlternateSubstFormat1 void closure (hb_closure_context_t *c) const { unsigned int count = alternateSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ @@ -555,7 +555,7 @@ struct AlternateSubstFormat1 { if (unlikely (!(this+coverage).add_coverage (c->input))) return; unsigned int count = alternateSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ @@ -858,7 +858,7 @@ struct LigatureSubstFormat1 bool intersects (const hb_set_t *glyphs) const { unsigned int count = ligatureSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ @@ -872,7 +872,7 @@ struct LigatureSubstFormat1 void closure (hb_closure_context_t *c) const { unsigned int count = ligatureSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ @@ -885,7 +885,7 @@ struct LigatureSubstFormat1 { if (unlikely (!(this+coverage).add_coverage (c->input))) return; unsigned int count = ligatureSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ @@ -1062,7 +1062,7 @@ struct ReverseChainSingleSubstFormat1 const ArrayOf &substitute = StructAfter > (lookahead); count = substitute.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 1afa61584..b1721d85b 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1438,7 +1438,7 @@ struct ContextFormat1 }; unsigned int count = ruleSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ @@ -1457,7 +1457,7 @@ struct ContextFormat1 }; unsigned int count = ruleSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ @@ -2091,7 +2091,7 @@ struct ChainContextFormat1 }; unsigned int count = ruleSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */ @@ -2110,7 +2110,7 @@ struct ChainContextFormat1 }; unsigned int count = ruleSet.len; - for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ()) + for (auto iter = (this+coverage).iter (); iter; iter++) { if (unlikely (iter.get_coverage () >= count)) break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */