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.
{
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; }
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)...); }
};
{
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; }
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)
{
{
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; }
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)
{
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
{
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)
/* 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>);
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);
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;