[arrays] Merge ArrayOf's sub_array into hb_array_t's
authorBehdad Esfahbod <behdad@behdad.org>
Sun, 25 Nov 2018 02:32:00 +0000 (21:32 -0500)
committerBehdad Esfahbod <behdad@behdad.org>
Sun, 25 Nov 2018 02:32:00 +0000 (21:32 -0500)
src/hb-dsalgs.hh
src/hb-open-type.hh

index 1680bf9..5773596 100644 (file)
@@ -567,6 +567,7 @@ struct hb_array_t
 {
   static_assert ((bool) (unsigned) hb_static_size (Type), "");
 
+  inline hb_array_t (void) : arrayZ (nullptr), len (0) {}
   inline hb_array_t (const hb_array_t &o) : arrayZ (o.arrayZ), len (o.len) {}
   inline hb_array_t (Type *array_, unsigned int len_) : arrayZ (array_), len (len_) {}
 
@@ -582,6 +583,24 @@ struct hb_array_t
 
   inline unsigned int get_size (void) const { return len * sizeof (Type); }
 
+  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *seg_count /* IN/OUT */) const
+  {
+    if (!seg_count) return hb_array_t<Type> ();
+
+    unsigned int count = len;
+    if (unlikely (start_offset > count))
+      count = 0;
+    else
+      count -= start_offset;
+    count = *seg_count = MIN (count, *seg_count);
+    return hb_array_t<Type> (arrayZ + start_offset, count);
+  }
+  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const
+  { return sub_array (start_offset, &seg_count); }
+
+  inline hb_bytes_t as_bytes (void) const
+  { return hb_bytes_t (arrayZ, len * sizeof (Type)); }
+
   template <typename T>
   inline Type *lsearch (const T &x,
                        Type *not_found = nullptr)
@@ -620,23 +639,8 @@ struct hb_array_t
     ::qsort (arrayZ + start, end - start, sizeof (Type), Type::cmp);
   }
 
-  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const
-  {
-    unsigned int count = len;
-    if (unlikely (start_offset > count))
-      count = 0;
-    else
-      count -= start_offset;
-    count = MIN (count, seg_count);
-    return hb_array_t<Type> (arrayZ + start_offset, count);
-  }
-
-  inline hb_bytes_t as_bytes (void) const
-  {
-    return hb_bytes_t (arrayZ, len * sizeof (Type));
-  }
-
-  inline void free (void) { ::free ((void *) arrayZ); arrayZ = nullptr; len = 0; }
+  inline void free (void)
+  { ::free ((void *) arrayZ); arrayZ = nullptr; len = 0; }
 
   template <typename hb_sanitize_context_t>
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -660,9 +664,15 @@ enum hb_bfind_not_found_t
 template <typename Type>
 struct hb_sorted_array_t : hb_array_t<Type>
 {
+  inline hb_sorted_array_t (void) : hb_array_t<Type> () {}
   inline hb_sorted_array_t (const hb_array_t<Type> &o) : hb_array_t<Type> (o) {}
   inline hb_sorted_array_t (Type *array_, unsigned int len_) : hb_array_t<Type> (array_, len_) {}
 
+  inline hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int *seg_count /* IN/OUT */) const
+  { return hb_sorted_array_t<Type> (((const hb_array_t<Type> *) (this))->sub_array (start_offset, seg_count)); }
+  inline hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const
+  { return sub_array (start_offset, &seg_count); }
+
   template <typename T>
   inline Type *bsearch (const T &x, Type *not_found = nullptr)
   {
index 2e3db31..83edc77 100644 (file)
@@ -492,18 +492,6 @@ struct ArrayOf
 
   HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOf, Type, LenType);
 
-  inline const Type *sub_array (unsigned int start_offset, unsigned int *pcount /* IN/OUT */) const
-  {
-    unsigned int count = len;
-    if (unlikely (start_offset > count))
-      count = 0;
-    else
-      count -= start_offset;
-    count = MIN (count, *pcount);
-    *pcount = count;
-    return arrayZ + start_offset;
-  }
-
   inline const Type& operator [] (unsigned int i) const
   {
     if (unlikely (i >= len)) return Null (Type);
@@ -523,6 +511,15 @@ struct ArrayOf
   inline hb_array_t<const Type> as_array (void) const
   { return hb_array (arrayZ, len); }
 
+  inline hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
+  { return as_array ().sub_array (start_offset, count);}
+  inline hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count /* IN/OUT */) const
+  { return as_array ().sub_array (start_offset, count);}
+  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
+  { return as_array ().sub_array (start_offset, count);}
+  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count /* IN/OUT */)
+  { return as_array ().sub_array (start_offset, count);}
+
   inline bool serialize (hb_serialize_context_t *c,
                         unsigned int items_len)
   {
@@ -777,6 +774,15 @@ struct SortedArrayOf : ArrayOf<Type, LenType>
   inline hb_sorted_array_t<const Type> as_array (void) const
   { return hb_sorted_array (this->arrayZ, this->len); }
 
+  inline hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
+  { return as_array ().sub_array (start_offset, count);}
+  inline hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count /* IN/OUT */) const
+  { return as_array ().sub_array (start_offset, count);}
+  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
+  { return as_array ().sub_array (start_offset, count);}
+  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count /* IN/OUT */)
+  { return as_array ().sub_array (start_offset, count);}
+
   template <typename T>
   inline Type &bsearch (const T &x, Type &not_found = Crap (Type))
   { return *as_array ().bsearch (x, &not_found); }