[dispatch] Try obj.dispatch(c) before trying c->dispatch(obj)
authorBehdad Esfahbod <behdad@behdad.org>
Sun, 5 May 2019 16:10:46 +0000 (09:10 -0700)
committerBehdad Esfahbod <behdad@behdad.org>
Sun, 5 May 2019 16:10:46 +0000 (09:10 -0700)
src/hb-aat-layout-common.hh
src/hb-dispatch.hh
src/hb-ot-layout-gsubgpos.hh
src/hb-sanitize.hh
src/hb-subset.hh

index 95ac271..a17da37 100644 (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; }
 
index c4347a6..e582074 100644 (file)
 template <typename Context, typename Return, unsigned int MaxDebugDepth>
 struct hb_dispatch_context_t
 {
+  private:
+  /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
+  const Context* thiz () const { return static_cast<const Context *> (this); }
+        Context* thiz ()       { return static_cast<      Context *> (this); }
+  public:
   static constexpr unsigned max_debug_depth = MaxDebugDepth;
   typedef Return return_t;
   template <typename T, typename F>
   bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; }
+  template <typename T>
+  return_t dispatch (const T &obj) { return _dispatch_impl (obj, hb_prioritize); }
   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>
+  auto _dispatch_impl (const T &obj, hb_priority<1>) HB_AUTO_RETURN (obj.dispatch (thiz ()))
+  template <typename T>
+  Return _dispatch_impl (const T &obj, hb_priority<0>) { return thiz()->_dispatch (obj); }
 };
 
 
index 6b0b7ad..9960b40 100644 (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>);
index e58202c..9cf17e5 100644 (file)
@@ -131,7 +131,7 @@ struct hb_sanitize_context_t :
   bool may_dispatch (const T *obj HB_UNUSED, const F *format)
   { return format->sanitize (this); }
   template <typename T>
-  return_t dispatch (const T &obj) { return obj.sanitize (this); }
+  return_t _dispatch (const T &obj) { return obj.sanitize (this); }
   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; }
index 45cb763..795859d 100644 (file)
@@ -41,8 +41,8 @@ struct hb_subset_context_t :
 {
   const char *get_name () { return "SUBSET"; }
   template <typename T>
-  bool dispatch (const T &obj) { return obj.subset (this); }
-  static bool default_return_value () { return true; }
+  return_t _dispatch (const T &obj) { return obj.subset (this); }
+  static return_t default_return_value () { return true; }
 
   hb_subset_plan_t *plan;
   hb_serialize_context_t *serializer;