[dispatch] Forward arguments in all dispatch multiplexers

This commit is contained in:
Behdad Esfahbod 2019-05-05 10:14:17 -07:00
parent c14efb8e68
commit 36bb24f7b4
7 changed files with 104 additions and 104 deletions

View File

@ -771,17 +771,17 @@ struct KerxSubTable
unsigned int get_size () const { return u.header.length; } unsigned int get_size () const { return u.header.length; }
unsigned int get_type () const { return u.header.coverage & u.header.SubtableType; } unsigned int get_type () const { return u.header.coverage & u.header.SubtableType; }
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
unsigned int subtable_type = get_type (); unsigned int subtable_type = get_type ();
TRACE_DISPATCH (this, subtable_type); TRACE_DISPATCH (this, subtable_type);
switch (subtable_type) { switch (subtable_type) {
case 0: return_trace (c->dispatch (u.format0)); case 0: return_trace (c->dispatch (u.format0, hb_forward<Ts> (ds)...));
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
case 2: return_trace (c->dispatch (u.format2)); case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
case 4: return_trace (c->dispatch (u.format4)); case 4: return_trace (c->dispatch (u.format4, hb_forward<Ts> (ds)...));
case 6: return_trace (c->dispatch (u.format6)); case 6: return_trace (c->dispatch (u.format6, hb_forward<Ts> (ds)...));
default: return_trace (c->default_return_value ()); default: return_trace (c->default_return_value ());
} }
} }

View File

@ -883,17 +883,17 @@ struct ChainSubtable
Insertion = 5 Insertion = 5
}; };
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
unsigned int subtable_type = get_type (); unsigned int subtable_type = get_type ();
TRACE_DISPATCH (this, subtable_type); TRACE_DISPATCH (this, subtable_type);
switch (subtable_type) { switch (subtable_type) {
case Rearrangement: return_trace (c->dispatch (u.rearrangement)); case Rearrangement: return_trace (c->dispatch (u.rearrangement, hb_forward<Ts> (ds)...));
case Contextual: return_trace (c->dispatch (u.contextual)); case Contextual: return_trace (c->dispatch (u.contextual, hb_forward<Ts> (ds)...));
case Ligature: return_trace (c->dispatch (u.ligature)); case Ligature: return_trace (c->dispatch (u.ligature, hb_forward<Ts> (ds)...));
case Noncontextual: return_trace (c->dispatch (u.noncontextual)); case Noncontextual: return_trace (c->dispatch (u.noncontextual, hb_forward<Ts> (ds)...));
case Insertion: return_trace (c->dispatch (u.insertion)); case Insertion: return_trace (c->dispatch (u.insertion, hb_forward<Ts> (ds)...));
default: return_trace (c->default_return_value ()); default: return_trace (c->default_return_value ());
} }
} }

View File

@ -121,16 +121,16 @@ struct KernSubTable
} }
} }
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
unsigned int subtable_type = get_type (); unsigned int subtable_type = get_type ();
TRACE_DISPATCH (this, subtable_type); TRACE_DISPATCH (this, subtable_type);
switch (subtable_type) { switch (subtable_type) {
case 0: return_trace (c->dispatch (u.format0)); case 0: return_trace (c->dispatch (u.format0));
case 1: return_trace (u.header.apple ? c->dispatch (u.format1) : c->default_return_value ()); case 1: return_trace (u.header.apple ? c->dispatch (u.format1, hb_forward<Ts> (ds)...) : c->default_return_value ());
case 2: return_trace (c->dispatch (u.format2)); case 2: return_trace (c->dispatch (u.format2));
case 3: return_trace (u.header.apple ? c->dispatch (u.format3) : c->default_return_value ()); case 3: return_trace (u.header.apple ? c->dispatch (u.format3, hb_forward<Ts> (ds)...) : c->default_return_value ());
default: return_trace (c->default_return_value ()); default: return_trace (c->default_return_value ());
} }
} }
@ -304,14 +304,14 @@ struct kern
bool apply (AAT::hb_aat_apply_context_t *c) const bool apply (AAT::hb_aat_apply_context_t *c) const
{ return dispatch (c); } { return dispatch (c); }
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
unsigned int subtable_type = get_type (); unsigned int subtable_type = get_type ();
TRACE_DISPATCH (this, subtable_type); TRACE_DISPATCH (this, subtable_type);
switch (subtable_type) { switch (subtable_type) {
case 0: return_trace (c->dispatch (u.ot)); case 0: return_trace (c->dispatch (u.ot, hb_forward<Ts> (ds)...));
case 1: return_trace (c->dispatch (u.aat)); case 1: return_trace (c->dispatch (u.aat, hb_forward<Ts> (ds)...));
default: return_trace (c->default_return_value ()); default: return_trace (c->default_return_value ());
} }
} }

View File

@ -682,14 +682,14 @@ struct Lookup
return flag; return flag;
} }
template <typename TSubTable, typename context_t> template <typename TSubTable, typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
unsigned int lookup_type = get_type (); unsigned int lookup_type = get_type ();
TRACE_DISPATCH (this, lookup_type); TRACE_DISPATCH (this, lookup_type);
unsigned int count = get_subtable_count (); unsigned int count = get_subtable_count ();
for (unsigned int i = 0; i < count; i++) { for (unsigned int i = 0; i < count; i++) {
typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type); typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type, hb_forward<Ts> (ds)...);
if (c->stop_sublookup_iteration (r)) if (c->stop_sublookup_iteration (r))
return_trace (r); return_trace (r);
} }

View File

@ -576,14 +576,14 @@ struct SinglePosFormat2
struct SinglePos struct SinglePos
{ {
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
case 2: return_trace (c->dispatch (u.format2)); case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }
@ -907,14 +907,14 @@ struct PairPosFormat2
struct PairPos struct PairPos
{ {
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
case 2: return_trace (c->dispatch (u.format2)); case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }
@ -1092,13 +1092,13 @@ struct CursivePosFormat1
struct CursivePos struct CursivePos
{ {
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }
@ -1208,13 +1208,13 @@ struct MarkBasePosFormat1
struct MarkBasePos struct MarkBasePos
{ {
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }
@ -1333,13 +1333,13 @@ struct MarkLigPosFormat1
struct MarkLigPos struct MarkLigPos
{ {
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }
@ -1455,13 +1455,13 @@ struct MarkMarkPosFormat1
struct MarkMarkPos struct MarkMarkPos
{ {
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }
@ -1507,20 +1507,20 @@ struct PosLookupSubTable
Extension = 9 Extension = 9
}; };
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, lookup_type); TRACE_DISPATCH (this, lookup_type);
switch (lookup_type) { switch (lookup_type) {
case Single: return_trace (u.single.dispatch (c)); case Single: return_trace (u.single.dispatch (c, hb_forward<Ts> (ds)...));
case Pair: return_trace (u.pair.dispatch (c)); case Pair: return_trace (u.pair.dispatch (c, hb_forward<Ts> (ds)...));
case Cursive: return_trace (u.cursive.dispatch (c)); case Cursive: return_trace (u.cursive.dispatch (c, hb_forward<Ts> (ds)...));
case MarkBase: return_trace (u.markBase.dispatch (c)); case MarkBase: return_trace (u.markBase.dispatch (c, hb_forward<Ts> (ds)...));
case MarkLig: return_trace (u.markLig.dispatch (c)); case MarkLig: return_trace (u.markLig.dispatch (c, hb_forward<Ts> (ds)...));
case MarkMark: return_trace (u.markMark.dispatch (c)); case MarkMark: return_trace (u.markMark.dispatch (c, hb_forward<Ts> (ds)...));
case Context: return_trace (u.context.dispatch (c)); case Context: return_trace (u.context.dispatch (c, hb_forward<Ts> (ds)...));
case ChainContext: return_trace (u.chainContext.dispatch (c)); case ChainContext: return_trace (u.chainContext.dispatch (c, hb_forward<Ts> (ds)...));
case Extension: return_trace (u.extension.dispatch (c)); case Extension: return_trace (u.extension.dispatch (c, hb_forward<Ts> (ds)...));
default: return_trace (c->default_return_value ()); default: return_trace (c->default_return_value ());
} }
} }
@ -1581,9 +1581,9 @@ struct PosLookup : Lookup
template <typename context_t> template <typename context_t>
static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index); static typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ return Lookup::dispatch<SubTable> (c); } { return Lookup::dispatch<SubTable> (c, hb_forward<Ts> (ds)...); }
bool subset (hb_subset_context_t *c) const bool subset (hb_subset_context_t *c) const
{ return Lookup::subset<SubTable> (c); } { return Lookup::subset<SubTable> (c); }

View File

@ -251,14 +251,14 @@ struct SingleSubst
} }
} }
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
case 2: return_trace (c->dispatch (u.format2)); case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }
@ -440,13 +440,13 @@ struct MultipleSubst
} }
} }
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }
@ -614,13 +614,13 @@ struct AlternateSubst
} }
} }
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }
@ -945,13 +945,13 @@ struct LigatureSubst
} }
} }
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }
@ -1113,13 +1113,13 @@ struct ReverseChainSingleSubstFormat1
struct ReverseChainSingleSubst struct ReverseChainSingleSubst
{ {
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }
@ -1153,19 +1153,19 @@ struct SubstLookupSubTable
ReverseChainSingle = 8 ReverseChainSingle = 8
}; };
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type) const typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, lookup_type); TRACE_DISPATCH (this, lookup_type);
switch (lookup_type) { switch (lookup_type) {
case Single: return_trace (u.single.dispatch (c)); case Single: return_trace (u.single.dispatch (c, hb_forward<Ts> (ds)...));
case Multiple: return_trace (u.multiple.dispatch (c)); case Multiple: return_trace (u.multiple.dispatch (c, hb_forward<Ts> (ds)...));
case Alternate: return_trace (u.alternate.dispatch (c)); case Alternate: return_trace (u.alternate.dispatch (c, hb_forward<Ts> (ds)...));
case Ligature: return_trace (u.ligature.dispatch (c)); case Ligature: return_trace (u.ligature.dispatch (c, hb_forward<Ts> (ds)...));
case Context: return_trace (u.context.dispatch (c)); case Context: return_trace (u.context.dispatch (c, hb_forward<Ts> (ds)...));
case ChainContext: return_trace (u.chainContext.dispatch (c)); case ChainContext: return_trace (u.chainContext.dispatch (c, hb_forward<Ts> (ds)...));
case Extension: return_trace (u.extension.dispatch (c)); case Extension: return_trace (u.extension.dispatch (c, hb_forward<Ts> (ds)...));
case ReverseChainSingle: return_trace (u.reverseChainContextSingle.dispatch (c)); case ReverseChainSingle: return_trace (u.reverseChainContextSingle.dispatch (c, hb_forward<Ts> (ds)...));
default: return_trace (c->default_return_value ()); default: return_trace (c->default_return_value ());
} }
} }
@ -1331,9 +1331,9 @@ struct SubstLookup : Lookup
return ret; return ret;
} }
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ return Lookup::dispatch<SubTable> (c); } { return Lookup::dispatch<SubTable> (c, hb_forward<Ts> (ds)...); }
bool subset (hb_subset_context_t *c) const bool subset (hb_subset_context_t *c) const
{ return Lookup::subset<SubTable> (c); } { return Lookup::subset<SubTable> (c); }

View File

@ -1763,15 +1763,15 @@ struct ContextFormat3
struct Context struct Context
{ {
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
case 2: return_trace (c->dispatch (u.format2)); case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
case 3: return_trace (c->dispatch (u.format3)); case 3: return_trace (c->dispatch (u.format3, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }
@ -2474,15 +2474,15 @@ struct ChainContextFormat3
struct ChainContext struct ChainContext
{ {
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (c->dispatch (u.format1)); case 1: return_trace (c->dispatch (u.format1, hb_forward<Ts> (ds)...));
case 2: return_trace (c->dispatch (u.format2)); case 2: return_trace (c->dispatch (u.format2, hb_forward<Ts> (ds)...));
case 3: return_trace (c->dispatch (u.format3)); case 3: return_trace (c->dispatch (u.format3, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }
@ -2510,12 +2510,12 @@ struct ExtensionFormat1
return StructAtOffset<typename T::SubTable> (this, offset); return StructAtOffset<typename T::SubTable> (this, offset);
} }
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, format); TRACE_DISPATCH (this, format);
if (unlikely (!c->may_dispatch (this, this))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, this))) return_trace (c->no_dispatch_return_value ());
return_trace (get_subtable<typename T::SubTable> ().dispatch (c, get_type ())); return_trace (get_subtable<typename T::SubTable> ().dispatch (c, get_type (), hb_forward<Ts> (ds)...));
} }
/* This is called from may_dispatch() above with hb_sanitize_context_t. */ /* This is called from may_dispatch() above with hb_sanitize_context_t. */
@ -2557,13 +2557,13 @@ struct Extension
} }
} }
template <typename context_t> template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c) const typename context_t::return_t dispatch (context_t *c, Ts &&...ds) const
{ {
TRACE_DISPATCH (this, u.format); TRACE_DISPATCH (this, u.format);
if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ());
switch (u.format) { switch (u.format) {
case 1: return_trace (u.format1.dispatch (c)); case 1: return_trace (u.format1.dispatch (c, hb_forward<Ts> (ds)...));
default:return_trace (c->default_return_value ()); default:return_trace (c->default_return_value ());
} }
} }