[iter] Make hb_sorted_array_t work as iter

Ugly, but does the job.
diff --git a/src/hb-array.hh b/src/hb-array.hh
index 52b775e..7dd02cd 100644
--- a/src/hb-array.hh
+++ b/src/hb-array.hh
@@ -194,9 +194,11 @@
 template <typename Type>
 struct hb_sorted_array_t :
 	hb_sorted_iter_t<hb_sorted_array_t<Type>, Type>,
-	hb_array_t<Type>,
-	hb_iter_mixin_t<hb_sorted_array_t<Type>, Type>
+	hb_array_t<Type>
 {
+  typedef hb_sorted_iter_t<hb_sorted_array_t<Type>, Type> iter_base_t;
+  HB_ITER_USING (iter_base_t);
+
   hb_sorted_array_t () : hb_array_t<Type> () {}
   hb_sorted_array_t (const hb_array_t<Type> &o) : hb_array_t<Type> (o) {}
   hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t<Type> (array_, length_) {}
diff --git a/src/hb-iter.hh b/src/hb-iter.hh
index db2ddc1..6d4adca 100644
--- a/src/hb-iter.hh
+++ b/src/hb-iter.hh
@@ -80,6 +80,24 @@
   void operator = (const hb_iter_t &o HB_UNUSED) {}
 };
 
+#define HB_ITER_USING(Name) \
+  using Name::iter; \
+  using Name::operator bool; \
+  using Name::len; \
+  using Name::operator ->; \
+  using Name::operator *; \
+  using Name::operator []; \
+  using Name::operator +=; \
+  using Name::operator ++; \
+  using Name::operator -=; \
+  using Name::operator --; \
+  using Name::operator +; \
+  using Name::operator -; \
+  using Name::is_random_access; \
+  static_assert (true, "")
+
+
+
 /* Base class for sorted iterators.  Does not enforce anything.
  * Just for class taxonomy and requirements. */
 template <typename Iter, typename Item = typename Iter::__item_type__>
diff --git a/src/test-iter.cc b/src/test-iter.cc
index 3fdf4df..2e8c408 100644
--- a/src/test-iter.cc
+++ b/src/test-iter.cc
@@ -109,6 +109,8 @@
   test_iterable (v);
   hb_set_t st;
   test_iterable (st);
+  hb_sorted_array_t<int> sa;
+  test_iterable (sa);
 
   return 0;
 }