|
|
|
@ -11,6 +11,26 @@ namespace GSUB { |
|
|
|
|
|
|
|
|
|
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, |
|
|
|
|
hb_requires (hb_is_sorted_source_of (Iterator, |
|
|
|
@ -40,25 +60,6 @@ struct SingleSubst |
|
|
|
|
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> |
|
|
|
|