[OTLayout] Port closure() to process() template
authorBehdad Esfahbod <behdad@behdad.org>
Thu, 22 Nov 2012 04:33:13 +0000 (23:33 -0500)
committerBehdad Esfahbod <behdad@behdad.org>
Thu, 22 Nov 2012 21:33:46 +0000 (16:33 -0500)
src/hb-ot-layout-gsub-table.hh
src/hb-ot-layout-gsubgpos-private.hh
src/hb-ot-layout.cc

index 4acd67b..389e3d0 100644 (file)
@@ -37,10 +37,6 @@ namespace OT {
 
 struct SingleSubstFormat1
 {
-  friend struct SingleSubst;
-
-  private:
-
   inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
@@ -112,10 +108,6 @@ struct SingleSubstFormat1
 
 struct SingleSubstFormat2
 {
-  friend struct SingleSubst;
-
-  private:
-
   inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
@@ -186,28 +178,13 @@ struct SingleSubstFormat2
 
 struct SingleSubst
 {
-  friend struct SubstLookupSubTable;
-  friend struct SubstLookup;
-
-  private:
-
-  inline void closure (hb_closure_context_t *c) const
+  template <typename context_t>
+  inline typename context_t::return_t process (context_t *c) const
   {
-    TRACE_CLOSURE ();
     switch (u.format) {
-    case 1: u.format1.closure (c); break;
-    case 2: u.format2.closure (c); break;
-    default:                       break;
-    }
-  }
-
-  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-  {
-    TRACE_CLOSURE ();
-    switch (u.format) {
-    case 1: u.format1.collect_glyphs (c); break;
-    case 2: u.format2.collect_glyphs (c); break;
-    default:                              break;
+    case 1: return c->process (u.format1);
+    case 2: return c->process (u.format2);
+    default:return c->default_return_value;
     }
   }
 
@@ -278,10 +255,6 @@ struct SingleSubst
 
 struct Sequence
 {
-  friend struct MultipleSubstFormat1;
-
-  private:
-
   inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
@@ -323,7 +296,6 @@ struct Sequence
     return TRACE_RETURN (true);
   }
 
-  public:
   inline bool sanitize (hb_sanitize_context_t *c) {
     TRACE_SANITIZE ();
     return TRACE_RETURN (substitute.sanitize (c));
@@ -338,10 +310,6 @@ struct Sequence
 
 struct MultipleSubstFormat1
 {
-  friend struct MultipleSubst;
-
-  private:
-
   inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
@@ -412,25 +380,12 @@ struct MultipleSubstFormat1
 
 struct MultipleSubst
 {
-  friend struct SubstLookupSubTable;
-  friend struct SubstLookup;
-
-  private:
-
-  inline void closure (hb_closure_context_t *c) const
-  {
-    TRACE_CLOSURE ();
-    switch (u.format) {
-    case 1: u.format1.closure (c); break;
-    default:                       break;
-    }
-  }
-
-  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  template <typename context_t>
+  inline typename context_t::return_t process (context_t *c) const
   {
     switch (u.format) {
-    case 1: u.format1.collect_glyphs (c); break;
-    default:                              break;
+    case 1: return c->process (u.format1);
+    default:return c->default_return_value;
     }
   }
 
@@ -489,10 +444,6 @@ typedef ArrayOf<GlyphID> AlternateSet;     /* Array of alternate GlyphIDs--in
 
 struct AlternateSubstFormat1
 {
-  friend struct AlternateSubst;
-
-  private:
-
   inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
@@ -589,25 +540,12 @@ struct AlternateSubstFormat1
 
 struct AlternateSubst
 {
-  friend struct SubstLookupSubTable;
-  friend struct SubstLookup;
-
-  private:
-
-  inline void closure (hb_closure_context_t *c) const
+  template <typename context_t>
+  inline typename context_t::return_t process (context_t *c) const
   {
-    TRACE_CLOSURE ();
     switch (u.format) {
-    case 1: u.format1.closure (c); break;
-    default:                       break;
-    }
-  }
-
-  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-  {
-    switch (u.format) {
-    case 1: u.format1.collect_glyphs (c); break;
-    default:                              break;
+    case 1: return c->process (u.format1);
+    default:return c->default_return_value;
     }
   }
 
@@ -663,10 +601,6 @@ struct AlternateSubst
 
 struct Ligature
 {
-  friend struct LigatureSet;
-
-  private:
-
   inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
@@ -761,10 +695,6 @@ struct Ligature
 
 struct LigatureSet
 {
-  friend struct LigatureSubstFormat1;
-
-  private:
-
   inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
@@ -824,7 +754,6 @@ struct LigatureSet
     return TRACE_RETURN (true);
   }
 
-  public:
   inline bool sanitize (hb_sanitize_context_t *c) {
     TRACE_SANITIZE ();
     return TRACE_RETURN (ligature.sanitize (c, this));
@@ -840,10 +769,6 @@ struct LigatureSet
 
 struct LigatureSubstFormat1
 {
-  friend struct LigatureSubst;
-
-  private:
-
   inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
@@ -926,25 +851,12 @@ struct LigatureSubstFormat1
 
 struct LigatureSubst
 {
-  friend struct SubstLookupSubTable;
-  friend struct SubstLookup;
-
-  private:
-
-  inline void closure (hb_closure_context_t *c) const
-  {
-    TRACE_CLOSURE ();
-    switch (u.format) {
-    case 1: u.format1.closure (c); break;
-    default:                       break;
-    }
-  }
-
-  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  template <typename context_t>
+  inline typename context_t::return_t process (context_t *c) const
   {
     switch (u.format) {
-    case 1: u.format1.collect_glyphs (c); break;
-    default:                              break;
+    case 1: return c->process (u.format1);
+    default:return c->default_return_value;
     }
   }
 
@@ -1010,24 +922,13 @@ struct LigatureSubst
 
 
 static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index);
-static inline void closure_lookup (hb_closure_context_t *c, unsigned int lookup_index);
-static inline void collect_glyphs_lookup (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
 
 struct ContextSubst : Context
 {
-  friend struct SubstLookupSubTable;
-
-  private:
-
-  inline void closure (hb_closure_context_t *c) const
+  template <typename context_t>
+  inline typename context_t::return_t process (context_t *c) const
   {
-    TRACE_CLOSURE ();
-    return Context::closure (c, closure_lookup);
-  }
-
-  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-  {
-    return Context::collect_glyphs (c, collect_glyphs_lookup);
+    return Context::process (c);
   }
 
   inline bool apply (hb_apply_context_t *c) const
@@ -1039,19 +940,10 @@ struct ContextSubst : Context
 
 struct ChainContextSubst : ChainContext
 {
-  friend struct SubstLookupSubTable;
-
-  private:
-
-  inline void closure (hb_closure_context_t *c) const
+  template <typename context_t>
+  inline typename context_t::return_t process (context_t *c) const
   {
-    TRACE_CLOSURE ();
-    return ChainContext::closure (c, closure_lookup);
-  }
-
-  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-  {
-    return ChainContext::collect_glyphs (c, collect_glyphs_lookup);
+    return ChainContext::process (c);
   }
 
   inline bool apply (hb_apply_context_t *c) const
@@ -1064,10 +956,6 @@ struct ChainContextSubst : ChainContext
 
 struct ExtensionSubst : Extension
 {
-  friend struct SubstLookupSubTable;
-  friend struct SubstLookup;
-
-  private:
   inline const struct SubstLookupSubTable& get_subtable (void) const
   {
     unsigned int offset = get_offset ();
@@ -1075,9 +963,8 @@ struct ExtensionSubst : Extension
     return StructAtOffset<SubstLookupSubTable> (this, offset);
   }
 
-  inline void closure (hb_closure_context_t *c) const;
-
-  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const;
+  template <typename context_t>
+  inline typename context_t::return_t process (context_t *c) const;
 
   inline const Coverage &get_coverage (void) const;
 
@@ -1093,10 +980,6 @@ struct ExtensionSubst : Extension
 
 struct ReverseChainSingleSubstFormat1
 {
-  friend struct ReverseChainSingleSubst;
-
-  private:
-
   inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
@@ -1210,24 +1093,12 @@ struct ReverseChainSingleSubstFormat1
 
 struct ReverseChainSingleSubst
 {
-  friend struct SubstLookupSubTable;
-
-  private:
-
-  inline void closure (hb_closure_context_t *c) const
-  {
-    TRACE_CLOSURE ();
-    switch (u.format) {
-    case 1: u.format1.closure (c); break;
-    default:                       break;
-    }
-  }
-
-  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  template <typename context_t>
+  inline typename context_t::return_t process (context_t *c) const
   {
     switch (u.format) {
-    case 1: u.format1.collect_glyphs (c); break;
-    default:                              break;
+    case 1: return c->process (u.format1);
+    default:return c->default_return_value;
     }
   }
 
@@ -1285,36 +1156,19 @@ struct SubstLookupSubTable
     ReverseChainSingle = 8
   };
 
-  inline void closure (hb_closure_context_t *c,
-                      unsigned int    lookup_type) const
+  template <typename context_t>
+  inline typename context_t::return_t process (context_t *c, unsigned int lookup_type) const
   {
-    TRACE_CLOSURE ();
     switch (lookup_type) {
-    case Single:               u.single.closure (c); break;
-    case Multiple:             u.multiple.closure (c); break;
-    case Alternate:            u.alternate.closure (c); break;
-    case Ligature:             u.ligature.closure (c); break;
-    case Context:              u.context.closure (c); break;
-    case ChainContext:         u.chainContext.closure (c); break;
-    case Extension:            u.extension.closure (c); break;
-    case ReverseChainSingle:   u.reverseChainContextSingle.closure (c); break;
-    default:                    break;
-    }
-  }
-
-  inline void collect_glyphs (hb_collect_glyphs_context_t *c,
-                             unsigned int lookup_type) const
-  {
-    switch (lookup_type) {
-    case Single:               u.single.collect_glyphs (c); break;
-    case Multiple:             u.multiple.collect_glyphs (c); break;
-    case Alternate:            u.alternate.collect_glyphs (c); break;
-    case Ligature:             u.ligature.collect_glyphs (c); break;
-    case Context:              u.context.collect_glyphs (c); break;
-    case ChainContext:         u.chainContext.collect_glyphs (c); break;
-    case Extension:            u.extension.collect_glyphs (c); break;
-    case ReverseChainSingle:   u.reverseChainContextSingle.collect_glyphs (c); break;
-    default:                    break;
+    case Single:               return u.single.process (c);
+    case Multiple:             return u.multiple.process (c);
+    case Alternate:            return u.alternate.process (c);
+    case Ligature:             return u.ligature.process (c);
+    case Context:              return u.context.process (c);
+    case ChainContext:         return u.chainContext.process (c);
+    case Extension:            return u.extension.process (c);
+    case ReverseChainSingle:   return u.reverseChainContextSingle.process (c);
+    default:                   return c->default_return_value;
     }
   }
 
@@ -1427,12 +1281,15 @@ struct SubstLookup : Lookup
     return lookup_type_is_reverse (type);
   }
 
-  inline void closure (hb_closure_context_t *c) const
+  template <typename context_t>
+  inline typename context_t::return_t process (context_t *c) const
   {
     unsigned int lookup_type = get_type ();
     unsigned int count = get_subtable_count ();
     for (unsigned int i = 0; i < count; i++)
-      get_subtable (i).closure (c, lookup_type);
+      if (c->stop_sublookup_iteration (get_subtable (i).process (c, lookup_type)))
+        return c->default_return_value;
+    return c->default_return_value;
   }
 
   template <typename set_t>
@@ -1449,14 +1306,6 @@ struct SubstLookup : Lookup
     }
   }
 
-  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
-  {
-    unsigned int lookup_type = get_type ();
-    unsigned int count = get_subtable_count ();
-    for (unsigned int i = 0; i < count; i++)
-      get_subtable (i).collect_glyphs (c, lookup_type);
-  }
-
   inline bool would_apply (hb_would_apply_context_t *c, const hb_set_digest_t *digest) const
   {
     if (unlikely (!c->len)) return false;
@@ -1532,11 +1381,9 @@ struct SubstLookup : Lookup
     return ret;
   }
 
-  private:
   inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c,
                                                  unsigned int i)
   { return CastR<OffsetArrayOf<SubstLookupSubTable> > (subTable)[i].serialize (c, this); }
-  public:
 
   inline bool serialize_single (hb_serialize_context_t *c,
                                uint32_t lookup_props,
@@ -1634,9 +1481,25 @@ struct GSUB : GSUBGPOS
   static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer);
   static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer);
 
-  inline void closure_lookup (hb_closure_context_t *c,
-                             unsigned int          lookup_index) const
-  { return get_lookup (lookup_index).closure (c); }
+  static void_t closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index)
+  {
+    const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
+    const SubstLookup &l = gsub.get_lookup (lookup_index);
+    return l.process (c);
+  }
+  inline hb_closure_context_t::return_t closure_lookup (hb_face_t *face,
+                                                       hb_set_t *glyphs,
+                                                       unsigned int lookup_index) const
+  {
+    OT::hb_closure_context_t c (face, glyphs, closure_recurse_func);
+    return get_lookup (lookup_index).process (&c);
+  }
+
+#if 0
+  inline hb_collect_glyphs_context_t::return_t collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
+                                                                     unsigned int lookup_index) const
+  { return get_lookup (lookup_index).process (c); }
+#endif
 
   inline bool sanitize (hb_sanitize_context_t *c) {
     TRACE_SANITIZE ();
@@ -1672,14 +1535,10 @@ GSUB::substitute_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSE
 
 /* Out-of-class implementation for methods recursing */
 
-inline void ExtensionSubst::closure (hb_closure_context_t *c) const
-{
-  get_subtable ().closure (c, get_type ());
-}
-
-inline void ExtensionSubst::collect_glyphs (hb_collect_glyphs_context_t *c) const
+template <typename context_t>
+inline typename context_t::return_t ExtensionSubst::process (context_t *c) const
 {
-  get_subtable ().collect_glyphs (c, get_type ());
+  return get_subtable ().process (c, get_type ());
 }
 
 inline const Coverage & ExtensionSubst::get_coverage (void) const
@@ -1715,28 +1574,6 @@ inline bool ExtensionSubst::is_reverse (void) const
   return SubstLookup::lookup_type_is_reverse (type);
 }
 
-static inline void closure_lookup (hb_closure_context_t *c, unsigned int lookup_index)
-{
-  const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
-  const SubstLookup &l = gsub.get_lookup (lookup_index);
-
-  if (unlikely (c->nesting_level_left == 0))
-    return;
-
-  c->nesting_level_left--;
-  l.closure (c);
-  c->nesting_level_left++;
-}
-
-static inline void collect_glyphs_lookup (hb_collect_glyphs_context_t *c, unsigned int lookup_index)
-{
-  const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
-  const SubstLookup &l = gsub.get_lookup (lookup_index);
-
-  /* XXX TODO */
-  l.collect_glyphs (c);
-}
-
 static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index)
 {
   const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
index 4272681..b214fbf 100644 (file)
@@ -37,6 +37,9 @@
 namespace OT {
 
 
+typedef struct {} void_t; /* To be used as return value when void is meant. */
+
+
 #ifndef HB_DEBUG_CLOSURE
 #define HB_DEBUG_CLOSURE (HB_DEBUG+0)
 #endif
@@ -44,20 +47,38 @@ namespace OT {
 #define TRACE_CLOSURE() \
        hb_auto_trace_t<HB_DEBUG_CLOSURE> trace (&c->debug_depth, "CLOSURE", this, HB_FUNC, "");
 
-
 struct hb_closure_context_t
 {
+  typedef void_t return_t;
+  typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
+  template <typename T>
+  inline return_t process (const T &obj) { obj.closure (this); return void_t (); }
+  static const return_t default_return_value;
+  bool stop_sublookup_iteration (const return_t r) const { return false; }
+  return_t recurse (unsigned int lookup_index)
+  {
+    if (unlikely (nesting_level_left == 0))
+      return default_return_value;
+
+    nesting_level_left--;
+    recurse_func (this, lookup_index);
+    nesting_level_left++;
+    return default_return_value;
+  }
+
   hb_face_t *face;
   hb_set_t *glyphs;
+  recurse_func_t recurse_func;
   unsigned int nesting_level_left;
   unsigned int debug_depth;
 
-
   hb_closure_context_t (hb_face_t *face_,
                        hb_set_t *glyphs_,
+                       recurse_func_t recurse_func_,
                        unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
                          face (face_),
                          glyphs (glyphs_),
+                         recurse_func (recurse_func_),
                          nesting_level_left (nesting_level_left_),
                          debug_depth (0) {}
 };
@@ -123,6 +144,19 @@ struct hb_collect_glyphs_context_t
                              after  (glyphs_after  ? *glyphs_after  : *hb_set_get_empty ()),
                              output (glyphs_output ? *glyphs_output : *hb_set_get_empty ()),
                              debug_depth (0) {};
+
+  typedef void_t return_t;
+  template <typename T>
+  inline return_t process (const T &obj) { obj.collect_glyphs (this); return void_t (); }
+  static const return_t default_return_value;
+  bool stop_iteration (const return_t r) const { return false; }
+  return_t recurse (unsigned int lookup_index)
+  {
+#if 0
+    /* XXX */
+#endif
+    return default_return_value;
+  }
 };
 
 
@@ -374,14 +408,11 @@ struct hb_apply_context_t
 
 typedef bool (*intersects_func_t) (hb_set_t *glyphs, const USHORT &value, const void *data);
 typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const USHORT &value, const void *data);
-typedef void (*closure_lookup_func_t) (hb_closure_context_t *c, unsigned int lookup_index);
-typedef void (*collect_glyphs_lookup_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index);
 typedef bool (*apply_lookup_func_t) (hb_apply_context_t *c, unsigned int lookup_index);
 
 struct ContextClosureFuncs
 {
   intersects_func_t intersects;
-  closure_lookup_func_t closure;
 };
 struct ContextApplyFuncs
 {
@@ -677,11 +708,10 @@ struct LookupRecord
 
 static inline void closure_lookup (hb_closure_context_t *c,
                                   unsigned int lookupCount,
-                                  const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
-                                  closure_lookup_func_t closure_func)
+                                  const LookupRecord lookupRecord[] /* Array of LookupRecords--in design order */)
 {
   for (unsigned int i = 0; i < lookupCount; i++)
-    closure_func (c, lookupRecord->lookupListIndex);
+    c->recurse (lookupRecord->lookupListIndex);
 }
 
 static inline bool apply_lookup (hb_apply_context_t *c,
@@ -770,8 +800,7 @@ static inline void context_closure_lookup (hb_closure_context_t *c,
                        inputCount ? inputCount - 1 : 0, input,
                        lookup_context.funcs.intersects, lookup_context.intersects_data))
     closure_lookup (c,
-                   lookupCount, lookupRecord,
-                   lookup_context.funcs.closure);
+                   lookupCount, lookupRecord);
 }
 
 
@@ -804,10 +833,6 @@ static inline bool context_apply_lookup (hb_apply_context_t *c,
 
 struct Rule
 {
-  friend struct RuleSet;
-
-  private:
-
   inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const
   {
     TRACE_CLOSURE ();
@@ -905,18 +930,14 @@ struct RuleSet
 
 struct ContextFormat1
 {
-  friend struct Context;
-
-  private:
-
-  inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
+  inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
 
     const Coverage &cov = (this+coverage);
 
     struct ContextClosureLookupContext lookup_context = {
-      {intersects_glyph, closure_func},
+      {intersects_glyph},
       NULL
     };
 
@@ -940,6 +961,11 @@ struct ContextFormat1
     return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
   }
 
+  inline const Coverage &get_coverage (void) const
+  {
+    return this+coverage;
+  }
+
   inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
   {
     TRACE_APPLY ();
@@ -975,11 +1001,7 @@ struct ContextFormat1
 
 struct ContextFormat2
 {
-  friend struct Context;
-
-  private:
-
-  inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
+  inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
     if (!(this+coverage).intersects (c->glyphs))
@@ -988,7 +1010,7 @@ struct ContextFormat2
     const ClassDef &class_def = this+classDef;
 
     struct ContextClosureLookupContext lookup_context = {
-      {intersects_class, closure_func},
+      {intersects_class},
       NULL
     };
 
@@ -1014,6 +1036,11 @@ struct ContextFormat2
     return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
   }
 
+  inline const Coverage &get_coverage (void) const
+  {
+    return this+coverage;
+  }
+
   inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
   {
     TRACE_APPLY ();
@@ -1053,11 +1080,7 @@ struct ContextFormat2
 
 struct ContextFormat3
 {
-  friend struct Context;
-
-  private:
-
-  inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
+  inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
     if (!(this+coverage[0]).intersects (c->glyphs))
@@ -1065,7 +1088,7 @@ struct ContextFormat3
 
     const LookupRecord *lookupRecord = &StructAtOffset<LookupRecord> (coverage, coverage[0].static_size * glyphCount);
     struct ContextClosureLookupContext lookup_context = {
-      {intersects_coverage, closure_func},
+      {intersects_coverage},
       this
     };
     context_closure_lookup (c,
@@ -1086,6 +1109,11 @@ struct ContextFormat3
     return TRACE_RETURN (context_would_apply_lookup (c, glyphCount, (const USHORT *) (coverage + 1), lookupCount, lookupRecord, lookup_context));
   }
 
+  inline const Coverage &get_coverage (void) const
+  {
+    return this+coverage[0];
+  }
+
   inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
   {
     TRACE_APPLY ();
@@ -1127,36 +1155,23 @@ struct ContextFormat3
 
 struct Context
 {
-  protected:
-
-  inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
-  {
-    TRACE_CLOSURE ();
-    switch (u.format) {
-    case 1: u.format1.closure (c, closure_func); break;
-    case 2: u.format2.closure (c, closure_func); break;
-    case 3: u.format3.closure (c, closure_func); break;
-    default:                                     break;
-    }
-  }
-
-  inline void collect_glyphs (hb_collect_glyphs_context_t *c, collect_glyphs_lookup_func_t closure_func) const
+  template <typename context_t>
+  inline typename context_t::return_t process (context_t *c) const
   {
-    TRACE_CLOSURE ();
     switch (u.format) {
-//    case 1: u.format1.collect_glyphs (c); break;
-//    case 2: u.format2.collect_glyphs (c); break;
-//    case 3: u.format2.collect_glyphs (c); break;
-    default:                              break;
+    case 1: return c->process (u.format1);
+    case 2: return c->process (u.format2);
+    case 3: return c->process (u.format3);
+    default:return c->default_return_value;
     }
   }
 
   inline const Coverage &get_coverage (void) const
   {
     switch (u.format) {
-    case 1: return this + u.format1.coverage;
-    case 2: return this + u.format2.coverage;
-    case 3: return this + u.format3.coverage[0];
+    case 1: return u.format1.get_coverage ();
+    case 2: return u.format2.get_coverage ();
+    case 3: return u.format3.get_coverage ();
     default:return Null(Coverage);
     }
   }
@@ -1238,8 +1253,7 @@ static inline void chain_context_closure_lookup (hb_closure_context_t *c,
                       lookaheadCount, lookahead,
                       lookup_context.funcs.intersects, lookup_context.intersects_data[2]))
     closure_lookup (c,
-                   lookupCount, lookupRecord,
-                   lookup_context.funcs.closure);
+                   lookupCount, lookupRecord);
 }
 
 static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c,
@@ -1290,10 +1304,6 @@ static inline bool chain_context_apply_lookup (hb_apply_context_t *c,
 
 struct ChainRule
 {
-  friend struct ChainRuleSet;
-
-  private:
-
   inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const
   {
     TRACE_CLOSURE ();
@@ -1334,7 +1344,6 @@ struct ChainRule
                                                     lookup.array, lookup_context));
   }
 
-  public:
   inline bool sanitize (hb_sanitize_context_t *c) {
     TRACE_SANITIZE ();
     if (!backtrack.sanitize (c)) return TRACE_RETURN (false);
@@ -1411,17 +1420,13 @@ struct ChainRuleSet
 
 struct ChainContextFormat1
 {
-  friend struct ChainContext;
-
-  private:
-
-  inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
+  inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
     const Coverage &cov = (this+coverage);
 
     struct ChainContextClosureLookupContext lookup_context = {
-      {intersects_glyph, closure_func},
+      {intersects_glyph},
       {NULL, NULL, NULL}
     };
 
@@ -1445,6 +1450,11 @@ struct ChainContextFormat1
     return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
   }
 
+  inline const Coverage &get_coverage (void) const
+  {
+    return this+coverage;
+  }
+
   inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
   {
     TRACE_APPLY ();
@@ -1478,11 +1488,7 @@ struct ChainContextFormat1
 
 struct ChainContextFormat2
 {
-  friend struct ChainContext;
-
-  private:
-
-  inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
+  inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
     if (!(this+coverage).intersects (c->glyphs))
@@ -1493,7 +1499,7 @@ struct ChainContextFormat2
     const ClassDef &lookahead_class_def = this+lookaheadClassDef;
 
     struct ChainContextClosureLookupContext lookup_context = {
-      {intersects_class, closure_func},
+      {intersects_class},
       {&backtrack_class_def,
        &input_class_def,
        &lookahead_class_def}
@@ -1522,6 +1528,11 @@ struct ChainContextFormat2
     return TRACE_RETURN (rule_set.would_apply (c, lookup_context));
   }
 
+  inline const Coverage &get_coverage (void) const
+  {
+    return this+coverage;
+  }
+
   inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
   {
     TRACE_APPLY ();
@@ -1576,11 +1587,7 @@ struct ChainContextFormat2
 
 struct ChainContextFormat3
 {
-  friend struct ChainContext;
-
-  private:
-
-  inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
+  inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE ();
     const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
@@ -1591,7 +1598,7 @@ struct ChainContextFormat3
     const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage> > (input);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord> > (lookahead);
     struct ChainContextClosureLookupContext lookup_context = {
-      {intersects_coverage, closure_func},
+      {intersects_coverage},
       {this, this, this}
     };
     chain_context_closure_lookup (c,
@@ -1602,12 +1609,6 @@ struct ChainContextFormat3
                                  lookup_context);
   }
 
-  inline const Coverage &get_coverage (void) const
-  {
-    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
-    return this+input[0];
-  }
-
   inline bool would_apply (hb_would_apply_context_t *c) const
   {
     TRACE_WOULD_APPLY ();
@@ -1626,6 +1627,12 @@ struct ChainContextFormat3
                                                           lookup.len, lookup.array, lookup_context));
   }
 
+  inline const Coverage &get_coverage (void) const
+  {
+    const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage> > (backtrack);
+    return this+input[0];
+  }
+
   inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const
   {
     TRACE_APPLY ();
@@ -1681,35 +1688,22 @@ struct ChainContextFormat3
 
 struct ChainContext
 {
-  protected:
-
-  inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const
-  {
-    TRACE_CLOSURE ();
-    switch (u.format) {
-    case 1: u.format1.closure (c, closure_func); break;
-    case 2: u.format2.closure (c, closure_func); break;
-    case 3: u.format3.closure (c, closure_func); break;
-    default:                                     break;
-    }
-  }
-
-  inline void collect_glyphs (hb_collect_glyphs_context_t *c, collect_glyphs_lookup_func_t closure_func) const
+  template <typename context_t>
+  inline typename context_t::return_t process (context_t *c) const
   {
-    TRACE_CLOSURE ();
     switch (u.format) {
-//    case 1: u.format1.collect_glyphs (c); break;
-//    case 2: u.format2.collect_glyphs (c); break;
-//    case 3: u.format2.collect_glyphs (c); break;
-    default:                              break;
+    case 1: return c->process (u.format1);
+    case 2: return c->process (u.format2);
+    case 3: return c->process (u.format3);
+    default:return c->default_return_value;
     }
   }
 
   inline const Coverage &get_coverage (void) const
   {
     switch (u.format) {
-    case 1: return this + u.format1.coverage;
-    case 2: return this + u.format2.coverage;
+    case 1: return u.format1.get_coverage ();
+    case 2: return u.format2.get_coverage ();
     case 3: return u.format3.get_coverage ();
     default:return Null(Coverage);
     }
@@ -1759,9 +1753,6 @@ struct ChainContext
 
 struct ExtensionFormat1
 {
-  friend struct Extension;
-
-  protected:
   inline unsigned int get_type (void) const { return extensionLookupType; }
   inline unsigned int get_offset (void) const { return extensionOffset; }
 
index 580f95d..9185584 100644 (file)
@@ -417,14 +417,13 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t    *face,
   switch (table_tag) {
     case HB_OT_TAG_GSUB:
     {
-      const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
-      l.collect_glyphs (&c);
+//      hb_ot_layout_from_face (face)->gsub->collect_glyphs_lookup (&c, lookup_index);
       return;
     }
     case HB_OT_TAG_GPOS:
     {
-      const OT::PosLookup& l = hb_ot_layout_from_face (face)->gpos->get_lookup (lookup_index);
-//      l.collect_glyphs (&c);
+//      hb_ot_layout_from_face (face)->gpos->collect_glyphs_lookup (&c, lookup_index);
+//      l.collect_glyphs_lookup (&c);
       return;
     }
   }
@@ -499,8 +498,7 @@ hb_ot_layout_lookup_substitute_closure (hb_face_t    *face,
                                        unsigned int  lookup_index,
                                        hb_set_t     *glyphs)
 {
-  OT::hb_closure_context_t c (face, glyphs);
-  _get_gsub (face).closure_lookup (&c, lookup_index);
+  _get_gsub (face).closure_lookup (face, glyphs, lookup_index);
 }
 
 /*