[serialize] Make SortedArrayOf:;serialize() take sorted-iterator
authorBehdad Esfahbod <behdad@behdad.org>
Tue, 8 Jan 2019 03:00:45 +0000 (22:00 -0500)
committerBehdad Esfahbod <behdad@behdad.org>
Mon, 21 Jan 2019 01:12:12 +0000 (20:12 -0500)
src/hb-open-type.hh
src/hb-ot-cmap-table.hh

index 5f06b96..70c1654 100644 (file)
@@ -815,6 +815,23 @@ struct SortedArrayOf : ArrayOf<Type, LenType>
   hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */)
   { return as_array ().sub_array (start_offset, count);}
 
+  bool serialize (hb_serialize_context_t *c, unsigned int items_len)
+  {
+    TRACE_SERIALIZE (this);
+    bool ret = ArrayOf<Type, LenType>::serialize (c, items_len);
+    return_trace (ret);
+  }
+  template <typename Iterator>
+    hb_enable_if_t (hb_is_sorted_iterator (Iterator, const Type),
+  bool) serialize (hb_serialize_context_t *c,
+                  Iterator items)
+  {
+    TRACE_SERIALIZE (this);
+    bool ret = ArrayOf<Type, LenType>::serialize (c, items);
+    return_trace (ret);
+  }
+
+
   template <typename T>
   Type &bsearch (const T &x, Type &not_found = Crap (Type))
   { return *as_array ().bsearch (x, &not_found); }
index 802231a..0882dc8 100644 (file)
@@ -83,7 +83,7 @@ struct CmapSubtableFormat4
 
   bool serialize (hb_serialize_context_t *c,
                  const hb_subset_plan_t *plan,
-                 const hb_vector_t<segment_plan> &segments)
+                 const hb_sorted_vector_t<segment_plan> &segments)
   {
     TRACE_SERIALIZE (this);
 
@@ -154,7 +154,7 @@ struct CmapSubtableFormat4
     return_trace (true);
   }
 
-  static size_t get_sub_table_size (const hb_vector_t<segment_plan> &segments)
+  static size_t get_sub_table_size (const hb_sorted_vector_t<segment_plan> &segments)
   {
     size_t segment_size = 0;
     for (unsigned int i = 0; i < segments.length; i++)
@@ -177,7 +177,7 @@ struct CmapSubtableFormat4
   }
 
   static bool create_sub_table_plan (const hb_subset_plan_t *plan,
-                                    hb_vector_t<segment_plan> *segments)
+                                    hb_sorted_vector_t<segment_plan> *segments)
   {
     segment_plan *segment = nullptr;
     hb_codepoint_t last_gid = 0;
@@ -491,7 +491,7 @@ struct CmapSubtableLongSegmented
   }
 
   bool serialize (hb_serialize_context_t *c,
-                 const hb_vector_t<CmapSubtableLongGroup> &group_data)
+                 const hb_sorted_vector_t<CmapSubtableLongGroup> &group_data)
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (*this))) return_trace (false);
@@ -519,7 +519,7 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented<CmapSubtableFormat12>
 
 
   bool serialize (hb_serialize_context_t *c,
-                 const hb_vector_t<CmapSubtableLongGroup> &groups)
+                 const hb_sorted_vector_t<CmapSubtableLongGroup> &groups)
   {
     if (unlikely (!c->extend_min (*this))) return false;
 
@@ -530,13 +530,13 @@ struct CmapSubtableFormat12 : CmapSubtableLongSegmented<CmapSubtableFormat12>
     return CmapSubtableLongSegmented<CmapSubtableFormat12>::serialize (c, groups);
   }
 
-  static size_t get_sub_table_size (const hb_vector_t<CmapSubtableLongGroup> &groups)
+  static size_t get_sub_table_size (const hb_sorted_vector_t<CmapSubtableLongGroup> &groups)
   {
     return 16 + 12 * groups.length;
   }
 
   static bool create_sub_table_plan (const hb_subset_plan_t *plan,
-                                    hb_vector_t<CmapSubtableLongGroup> *groups)
+                                    hb_sorted_vector_t<CmapSubtableLongGroup> *groups)
   {
     CmapSubtableLongGroup *group = nullptr;
 
@@ -853,8 +853,8 @@ struct cmap
          +  CmapSubtableFormat12::get_sub_table_size (this->format12_groups);
     }
 
-    hb_vector_t<CmapSubtableFormat4::segment_plan> format4_segments;
-    hb_vector_t<CmapSubtableLongGroup> format12_groups;
+    hb_sorted_vector_t<CmapSubtableFormat4::segment_plan> format4_segments;
+    hb_sorted_vector_t<CmapSubtableLongGroup> format12_groups;
   };
 
   bool _create_plan (const hb_subset_plan_t *plan,