Make StructAtOffset take a pointer

Is safer.
diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index 00ad434..5b51fa7 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -65,23 +65,23 @@
 inline Type* CastP(TObject *X)
 { return reinterpret_cast<Type*> (X); }
 
-/* StructAtOffset<T>(X,Ofs) returns the struct T& that is placed at memory
- * location of X plus Ofs bytes. */
-template<typename Type, typename TObject>
-inline const Type& StructAtOffset(const TObject &X, unsigned int offset)
-{ return * reinterpret_cast<const Type*> (CharP(&X) + offset); }
-template<typename Type, typename TObject>
-inline Type& StructAtOffset(TObject &X, unsigned int offset)
-{ return * reinterpret_cast<Type*> (CharP(&X) + offset); }
+/* StructAtOffset<T>(P,Ofs) returns the struct T& that is placed at memory
+ * location pointed to by P plus Ofs bytes. */
+template<typename Type>
+inline const Type& StructAtOffset(const void *P, unsigned int offset)
+{ return * reinterpret_cast<const Type*> (CharP(P) + offset); }
+template<typename Type>
+inline Type& StructAtOffset(void *P, unsigned int offset)
+{ return * reinterpret_cast<Type*> (CharP(P) + offset); }
 
 /* StructAfter<T>(X) returns the struct T& that is placed after X.
  * Works with X of variable size also.  X must implement get_size() */
 template<typename Type, typename TObject>
 inline const Type& StructAfter(const TObject &X)
-{ return StructAtOffset<Type>(X, X.get_size()); }
+{ return StructAtOffset<Type>(&X, X.get_size()); }
 template<typename Type, typename TObject>
 inline Type& StructAfter(TObject &X)
-{ return StructAtOffset<Type>(X, X.get_size()); }
+{ return StructAtOffset<Type>(&X, X.get_size()); }
 
 
 
@@ -472,7 +472,7 @@
   {
     unsigned int offset = *this;
     if (unlikely (!offset)) return Null(Type);
-    return StructAtOffset<Type> (*CharP(base), offset);
+    return StructAtOffset<Type> (base, offset);
   }
 
   inline bool sanitize (hb_sanitize_context_t *context, void *base) {
@@ -480,7 +480,7 @@
     if (!context->check_struct (this)) return false;
     unsigned int offset = *this;
     if (unlikely (!offset)) return true;
-    Type &obj = StructAtOffset<Type> (*CharP(base), offset);
+    Type &obj = StructAtOffset<Type> (base, offset);
     return likely (obj.sanitize (context)) || neuter (context);
   }
   template <typename T>
@@ -489,7 +489,7 @@
     if (!context->check_struct (this)) return false;
     unsigned int offset = *this;
     if (unlikely (!offset)) return true;
-    Type &obj = StructAtOffset<Type> (*CharP(base), offset);
+    Type &obj = StructAtOffset<Type> (base, offset);
     return likely (obj.sanitize (context, user_data)) || neuter (context);
   }
 
diff --git a/src/hb-ot-layout-gpos-private.hh b/src/hb-ot-layout-gpos-private.hh
index a438116..b18264d 100644
--- a/src/hb-ot-layout-gpos-private.hh
+++ b/src/hb-ot-layout-gpos-private.hh
@@ -618,7 +618,7 @@
 	context->buffer->in_pos = j;
 	return true;
       }
-      record = &StructAtOffset<PairValueRecord> (*record, record_size);
+      record = &StructAtOffset<PairValueRecord> (record, record_size);
     }
 
     return false;
@@ -1409,7 +1409,7 @@
   {
     unsigned int offset = get_offset ();
     if (unlikely (!offset)) return Null(PosLookupSubTable);
-    return StructAtOffset<PosLookupSubTable> (*this, offset);
+    return StructAtOffset<PosLookupSubTable> (this, offset);
   }
 
   inline bool apply (hb_apply_context_t *context) const;
@@ -1608,7 +1608,7 @@
   if (unlikely (!Extension::sanitize (context))) return false;
   unsigned int offset = get_offset ();
   if (unlikely (!offset)) return true;
-  return StructAtOffset<PosLookupSubTable> (*this, offset).sanitize (context);
+  return StructAtOffset<PosLookupSubTable> (this, offset).sanitize (context);
 }
 
 static inline bool position_lookup (hb_apply_context_t *context, unsigned int lookup_index)
diff --git a/src/hb-ot-layout-gsub-private.hh b/src/hb-ot-layout-gsub-private.hh
index ba933de..ccc51e7 100644
--- a/src/hb-ot-layout-gsub-private.hh
+++ b/src/hb-ot-layout-gsub-private.hh
@@ -586,7 +586,7 @@
   {
     unsigned int offset = get_offset ();
     if (unlikely (!offset)) return Null(SubstLookupSubTable);
-    return StructAtOffset<SubstLookupSubTable> (*this, offset);
+    return StructAtOffset<SubstLookupSubTable> (this, offset);
   }
 
   inline bool apply (hb_apply_context_t *context) const;
@@ -916,7 +916,7 @@
   if (unlikely (!Extension::sanitize (context))) return false;
   unsigned int offset = get_offset ();
   if (unlikely (!offset)) return true;
-  return StructAtOffset<SubstLookupSubTable> (*this, offset).sanitize (context);
+  return StructAtOffset<SubstLookupSubTable> (this, offset).sanitize (context);
 }
 
 inline bool ExtensionSubst::is_reverse (void) const