[reorg] Move sanitize/dispatch and size macros to top

This commit is contained in:
Behdad Esfahbod 2022-01-26 08:22:40 -07:00 committed by Garret Rieger
parent f577d02f4a
commit c180f93766
3 changed files with 34 additions and 37 deletions

View File

@ -11,6 +11,26 @@ namespace GSUB {
struct SingleSubst struct SingleSubst
{ {
protected:
union {
HBUINT16 format; /* Format identifier */
SingleSubstFormat1 format1;
SingleSubstFormat2 format2;
} u;
public:
template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) {
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
default:return_trace (c->default_return_value ());
}
}
template<typename Iterator, template<typename Iterator,
hb_requires (hb_is_sorted_source_of (Iterator, hb_requires (hb_is_sorted_source_of (Iterator,
@ -40,25 +60,6 @@ struct SingleSubst
default:return_trace (false); default:return_trace (false);
} }
} }
template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{
TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) {
case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
default:return_trace (c->default_return_value ());
}
}
protected:
union {
HBUINT16 format; /* Format identifier */
SingleSubstFormat1 format1;
SingleSubstFormat2 format2;
} u;
}; };
template<typename Iterator> template<typename Iterator>

View File

@ -19,6 +19,13 @@ struct SingleSubstFormat1
* substitute GlyphID, modulo 0x10000 */ * substitute GlyphID, modulo 0x10000 */
public: public:
DEFINE_SIZE_STATIC (6);
bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (coverage.sanitize (c, this) && deltaGlyphID.sanitize (c));
}
bool intersects (const hb_set_t *glyphs) const bool intersects (const hb_set_t *glyphs) const
{ return (this+coverage).intersects (glyphs); } { return (this+coverage).intersects (glyphs); }
@ -106,15 +113,6 @@ struct SingleSubstFormat1
SingleSubst_serialize (c->serializer, it); SingleSubst_serialize (c->serializer, it);
return_trace (ret); return_trace (ret);
} }
bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (coverage.sanitize (c, this) && deltaGlyphID.sanitize (c));
}
public:
DEFINE_SIZE_STATIC (6);
}; };
} }

View File

@ -20,6 +20,13 @@ struct SingleSubstFormat2
* GlyphIDs--ordered by Coverage Index */ * GlyphIDs--ordered by Coverage Index */
public: public:
DEFINE_SIZE_ARRAY (6, substitute);
bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (coverage.sanitize (c, this) && substitute.sanitize (c));
}
bool intersects (const hb_set_t *glyphs) const bool intersects (const hb_set_t *glyphs) const
{ return (this+coverage).intersects (glyphs); } { return (this+coverage).intersects (glyphs); }
@ -105,15 +112,6 @@ struct SingleSubstFormat2
SingleSubst_serialize (c->serializer, it); SingleSubst_serialize (c->serializer, it);
return_trace (ret); return_trace (ret);
} }
bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
return_trace (coverage.sanitize (c, this) && substitute.sanitize (c));
}
public:
DEFINE_SIZE_ARRAY (6, substitute);
}; };
} }