Add pointer magic operators to hb_atomic_ptr_t
diff --git a/src/hb-atomic.hh b/src/hb-atomic.hh
index 697de19..49c2809 100644
--- a/src/hb-atomic.hh
+++ b/src/hb-atomic.hh
@@ -290,6 +290,9 @@
   inline T *get (void) const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
   inline bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
 
+  inline T * operator -> (void) const { return get (); }
+  template <typename C> inline operator C * (void) const { return get (); }
+
   mutable T *v;
 };
 
diff --git a/src/hb-common.cc b/src/hb-common.cc
index d7c1921..37be8a3 100644
--- a/src/hb-common.cc
+++ b/src/hb-common.cc
@@ -281,7 +281,7 @@
 free_langs (void)
 {
 retry:
-  hb_language_item_t *first_lang = langs.get ();
+  hb_language_item_t *first_lang = langs;
   if (unlikely (!langs.cmpexch (first_lang, nullptr)))
     goto retry;
 
@@ -298,7 +298,7 @@
 lang_find_or_insert (const char *key)
 {
 retry:
-  hb_language_item_t *first_lang = langs.get ();
+  hb_language_item_t *first_lang = langs;
 
   for (hb_language_item_t *lang = first_lang; lang; lang = lang->next)
     if (*lang == key)
@@ -408,7 +408,7 @@
 {
   static hb_atomic_ptr_t <hb_language_t> default_language;
 
-  hb_language_t language = default_language.get ();
+  hb_language_t language = default_language;
   if (unlikely (language == HB_LANGUAGE_INVALID))
   {
     language = hb_language_from_string (setlocale (LC_CTYPE, nullptr), -1);
diff --git a/src/hb-face.cc b/src/hb-face.cc
index 50ab10e..a0f8047 100644
--- a/src/hb-face.cc
+++ b/src/hb-face.cc
@@ -263,7 +263,7 @@
 {
   if (!hb_object_destroy (face)) return;
 
-  for (hb_face_t::plan_node_t *node = face->shape_plans.get (); node; )
+  for (hb_face_t::plan_node_t *node = face->shape_plans; node; )
   {
     hb_face_t::plan_node_t *next = node->next;
     hb_shape_plan_destroy (node->shape_plan);
diff --git a/src/hb-graphite2.cc b/src/hb-graphite2.cc
index 971241f..24ee3d5 100644
--- a/src/hb-graphite2.cc
+++ b/src/hb-graphite2.cc
@@ -71,7 +71,7 @@
 static const void *hb_graphite2_get_table (const void *data, unsigned int tag, size_t *len)
 {
   hb_graphite2_face_data_t *face_data = (hb_graphite2_face_data_t *) data;
-  hb_graphite2_tablelist_t *tlist = face_data->tlist.get ();
+  hb_graphite2_tablelist_t *tlist = face_data->tlist;
 
   hb_blob_t *blob = nullptr;
 
@@ -94,7 +94,7 @@
     p->tag = tag;
 
 retry:
-    hb_graphite2_tablelist_t *tlist = face_data->tlist.get ();
+    hb_graphite2_tablelist_t *tlist = face_data->tlist;
     p->next = tlist;
 
     if (unlikely (!face_data->tlist.cmpexch (tlist, p)))
@@ -110,7 +110,7 @@
 static void hb_graphite2_release_table(const void *data, const void *table_buffer)
 {
   hb_graphite2_face_data_t *face_data = (hb_graphite2_face_data_t *) data;
-  hb_graphite2_tablelist_t *tlist = face_data->tlist.get();
+  hb_graphite2_tablelist_t *tlist = face_data->tlist;
 
   hb_graphite2_tablelist_t *prev = nullptr;
   hb_graphite2_tablelist_t *curr = tlist;
@@ -164,7 +164,7 @@
 void
 _hb_graphite2_shaper_face_data_destroy (hb_graphite2_face_data_t *data)
 {
-  hb_graphite2_tablelist_t *tlist = data->tlist.get ();
+  hb_graphite2_tablelist_t *tlist = data->tlist;
 
   while (tlist)
   {
diff --git a/src/hb-machinery.hh b/src/hb-machinery.hh
index 465bbb1..f58050d 100644
--- a/src/hb-machinery.hh
+++ b/src/hb-machinery.hh
@@ -795,6 +795,7 @@
 
   inline const Returned * operator -> (void) const { return get (); }
   inline const Returned & operator * (void) const { return *get (); }
+  template <typename C> inline operator const C * (void) const { return get (); }
 
   inline Data * get_data (void) const
   {
diff --git a/src/hb-ot-shape-complex-arabic.cc b/src/hb-ot-shape-complex-arabic.cc
index 8e56dde..50a5213 100644
--- a/src/hb-ot-shape-complex-arabic.cc
+++ b/src/hb-ot-shape-complex-arabic.cc
@@ -279,7 +279,7 @@
 {
   arabic_shape_plan_t *arabic_plan = (arabic_shape_plan_t *) data;
 
-  arabic_fallback_plan_destroy (arabic_plan->fallback_plan.get ());
+  arabic_fallback_plan_destroy (arabic_plan->fallback_plan);
 
   free (data);
 }
@@ -389,7 +389,7 @@
     return;
 
 retry:
-  arabic_fallback_plan_t *fallback_plan = arabic_plan->fallback_plan.get ();
+  arabic_fallback_plan_t *fallback_plan = arabic_plan->fallback_plan;
   if (unlikely (!fallback_plan))
   {
     /* This sucks.  We need a font to build the fallback plan... */
diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc
index 8d002f8..f2f2101 100644
--- a/src/hb-shape-plan.cc
+++ b/src/hb-shape-plan.cc
@@ -532,7 +532,7 @@
 
 
 retry:
-  hb_face_t::plan_node_t *cached_plan_nodes = face->shape_plans.get ();
+  hb_face_t::plan_node_t *cached_plan_nodes = face->shape_plans;
 
   /* Don't look for plan in the cache if there were variation coordinates XXX Fix me. */
   if (!hb_coords_present (coords, num_coords))