Fix previous commit

Priority should be given to specific over dispatch.  Broke sanitize before.
This fixes it, by moving prioritization to the context implementation, since
the correct priority cannot be done in the dispatch implementation.  Done
for subset and sanitize only, which need it.
This commit is contained in:
Behdad Esfahbod 2019-05-05 09:54:58 -07:00
parent b10f65933a
commit c14efb8e68
5 changed files with 34 additions and 23 deletions

View File

@ -807,7 +807,7 @@ struct hb_aat_apply_context_t :
{
const char *get_name () { return "APPLY"; }
template <typename T>
return_t _dispatch (const T &obj) { return obj.apply (this); }
return_t dispatch (const T &obj) { return obj.apply (this); }
static return_t default_return_value () { return false; }
bool stop_sublookup_iteration (return_t r) const { return r; }

View File

@ -49,17 +49,9 @@ struct hb_dispatch_context_t
bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; }
template <typename T, typename ...Ts>
return_t dispatch (const T &obj, Ts &&...ds)
{ return _dispatch_impl (obj, hb_prioritize, hb_forward<Ts> (ds)...); }
{ return obj.dispatch (thiz (), hb_forward<Ts> (ds)...); }
static return_t no_dispatch_return_value () { return Context::default_return_value (); }
static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; }
private:
template <typename T, typename ...Ts>
auto _dispatch_impl (const T &obj, hb_priority<1>, Ts &&...ds) HB_AUTO_RETURN
(obj.dispatch (thiz (), hb_forward<Ts> (ds)...))
template <typename T, typename ...Ts>
Return _dispatch_impl (const T &obj, hb_priority<0>, Ts &&...ds)
{ return thiz()->_dispatch (obj, hb_forward<Ts> (ds)...); }
};

View File

@ -46,7 +46,7 @@ struct hb_intersects_context_t :
{
const char *get_name () { return "INTERSECTS"; }
template <typename T>
return_t _dispatch (const T &obj) { return obj.intersects (this->glyphs); }
return_t dispatch (const T &obj) { return obj.intersects (this->glyphs); }
static return_t default_return_value () { return false; }
bool stop_sublookup_iteration (return_t r) const { return r; }
@ -64,7 +64,7 @@ struct hb_closure_context_t :
const char *get_name () { return "CLOSURE"; }
typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
template <typename T>
return_t _dispatch (const T &obj) { obj.closure (this); return hb_void_t (); }
return_t dispatch (const T &obj) { obj.closure (this); return hb_void_t (); }
static return_t default_return_value () { return hb_void_t (); }
void recurse (unsigned int lookup_index)
{
@ -128,7 +128,7 @@ struct hb_would_apply_context_t :
{
const char *get_name () { return "WOULD_APPLY"; }
template <typename T>
return_t _dispatch (const T &obj) { return obj.would_apply (this); }
return_t dispatch (const T &obj) { return obj.would_apply (this); }
static return_t default_return_value () { return false; }
bool stop_sublookup_iteration (return_t r) const { return r; }
@ -156,7 +156,7 @@ struct hb_collect_glyphs_context_t :
const char *get_name () { return "COLLECT_GLYPHS"; }
typedef return_t (*recurse_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
template <typename T>
return_t _dispatch (const T &obj) { obj.collect_glyphs (this); return hb_void_t (); }
return_t dispatch (const T &obj) { obj.collect_glyphs (this); return hb_void_t (); }
static return_t default_return_value () { return hb_void_t (); }
void recurse (unsigned int lookup_index)
{
@ -235,7 +235,7 @@ struct hb_add_coverage_context_t :
const char *get_name () { return "GET_COVERAGE"; }
typedef const Coverage &return_t;
template <typename T>
return_t _dispatch (const T &obj) { return obj.get_coverage (); }
return_t dispatch (const T &obj) { return obj.get_coverage (); }
static return_t default_return_value () { return Null(Coverage); }
bool stop_sublookup_iteration (return_t r) const
{
@ -438,7 +438,7 @@ struct hb_ot_apply_context_t :
const char *get_name () { return "APPLY"; }
typedef return_t (*recurse_func_t) (hb_ot_apply_context_t *c, unsigned int lookup_index);
template <typename T>
return_t _dispatch (const T &obj) { return obj.apply (this); }
return_t dispatch (const T &obj) { return obj.apply (this); }
static return_t default_return_value () { return false; }
bool stop_sublookup_iteration (return_t r) const { return r; }
return_t recurse (unsigned int sub_lookup_index)
@ -648,7 +648,7 @@ struct hb_get_subtables_context_t :
/* Dispatch interface. */
const char *get_name () { return "GET_SUBTABLES"; }
template <typename T>
return_t _dispatch (const T &obj)
return_t dispatch (const T &obj)
{
hb_applicable_t *entry = array.push();
entry->init (obj, apply_to<T>);

View File

@ -130,13 +130,23 @@ struct hb_sanitize_context_t :
template <typename T, typename F>
bool may_dispatch (const T *obj HB_UNUSED, const F *format)
{ return format->sanitize (this); }
template <typename T, typename ...Ts>
return_t _dispatch (const T &obj, Ts &&...ds)
{ return obj.sanitize (this, hb_forward<Ts> (ds)...); }
static return_t default_return_value () { return true; }
static return_t no_dispatch_return_value () { return false; }
bool stop_sublookup_iteration (const return_t r) const { return !r; }
private:
template <typename T, typename ...Ts> auto
_dispatch (const T &obj, hb_priority<1>, Ts &&...ds) HB_AUTO_RETURN
( obj.sanitize (this, hb_forward<Ts> (ds)...) )
template <typename T, typename ...Ts> auto
_dispatch (const T &obj, hb_priority<0>, Ts &&...ds) HB_AUTO_RETURN
( obj.dispatch (this, hb_forward<Ts> (ds)...) )
public:
template <typename T, typename ...Ts> auto
dispatch (const T &obj, Ts &&...ds) HB_AUTO_RETURN
( _dispatch (obj, hb_prioritize, hb_forward<Ts> (ds)...) )
void init (hb_blob_t *b)
{
this->blob = hb_blob_reference (b);

View File

@ -40,11 +40,20 @@ struct hb_subset_context_t :
hb_dispatch_context_t<hb_subset_context_t, bool, HB_DEBUG_SUBSET>
{
const char *get_name () { return "SUBSET"; }
template <typename T, typename ...Ts>
return_t _dispatch (const T &obj, Ts &&...ds)
{ return obj.subset (this, hb_forward<Ts> (ds)...); }
static return_t default_return_value () { return true; }
private:
template <typename T, typename ...Ts> auto
_dispatch (const T &obj, hb_priority<1>, Ts &&...ds) HB_AUTO_RETURN
( obj.subset (this, hb_forward<Ts> (ds)...) )
template <typename T, typename ...Ts> auto
_dispatch (const T &obj, hb_priority<0>, Ts &&...ds) HB_AUTO_RETURN
( obj.dispatch (this, hb_forward<Ts> (ds)...) )
public:
template <typename T, typename ...Ts> auto
dispatch (const T &obj, Ts &&...ds) HB_AUTO_RETURN
( _dispatch (obj, hb_prioritize, hb_forward<Ts> (ds)...) )
hb_subset_plan_t *plan;
hb_serialize_context_t *serializer;
unsigned int debug_depth;