[HB] Share Extension lookup code between GSUB and GPOS
diff --git a/src/hb-ot-layout-gsubgpos-private.h b/src/hb-ot-layout-gsubgpos-private.h
index 2f5a94b..6028351 100644
--- a/src/hb-ot-layout-gsubgpos-private.h
+++ b/src/hb-ot-layout-gsubgpos-private.h
@@ -686,6 +686,58 @@
 ASSERT_SIZE (ChainContext, 2);
 
 
+struct ExtensionFormat1
+{
+  friend struct Extension;
+
+  private:
+  inline unsigned int get_type (void) const { return extensionLookupType; }
+  inline unsigned int get_offset (void) const { return (extensionOffset[0] << 16) + extensionOffset[1]; }
+  inline const LookupSubTable& get_subtable (void) const
+  {
+    unsigned int offset = get_offset ();
+    if (HB_UNLIKELY (!offset)) return Null(LookupSubTable);
+    return (LookupSubTable&) *(((char *) this) + offset);
+  }
+
+  private:
+  USHORT	format;			/* Format identifier. Set to 1. */
+  USHORT	extensionLookupType;	/* Lookup type of subtable referenced
+					 * by ExtensionOffset (i.e. the
+					 * extension subtable). */
+  USHORT	extensionOffset[2];	/* Offset to the extension subtable,
+					 * of lookup type subtable.
+					 * Defined as two shorts to avoid
+					 * alignment requirements. */
+};
+ASSERT_SIZE (ExtensionFormat1, 8);
+
+struct Extension
+{
+  inline unsigned int get_type (void) const
+  {
+    switch (u.format) {
+    case 1: return u.format1->get_type ();
+    default:return 0;
+    }
+  }
+  inline const LookupSubTable& get_subtable (void) const
+  {
+    switch (u.format) {
+    case 1: return u.format1->get_subtable ();
+    default:return Null(LookupSubTable);
+    }
+  }
+
+  private:
+  union {
+  USHORT		format;		/* Format identifier */
+  ExtensionFormat1	format1[];
+  } u;
+};
+ASSERT_SIZE (Extension, 2);
+
+
 /*
  * GSUB/GPOS Common
  */