[HarfBuzz] harfbuzz: Branch 'master' - 4 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Tue Oct 30 05:36:28 UTC 2018


 src/hb-coretext.cc             |    8 ++++----
 src/hb-map.hh                  |    6 ++++++
 src/hb-ot-cmap-table.hh        |   14 ++++++++------
 src/hb-ot-layout-common.hh     |    4 +---
 src/hb-ot-layout-gpos-table.hh |    2 +-
 src/hb-ot-layout-gsub-table.hh |   34 +++++++++++++++++-----------------
 src/hb-ot-layout-gsubgpos.hh   |   10 +++++-----
 src/hb-ot-layout.cc            |   10 +++++-----
 src/hb-set.hh                  |    5 +++++
 src/hb-subset-plan.cc          |    2 +-
 src/hb-subset.cc               |    2 +-
 src/hb-uniscribe.cc            |   12 ++++++------
 src/hb-vector.hh               |   37 ++++++++++++++++++++-----------------
 src/hb.hh                      |   12 ++++++++++++
 14 files changed, 92 insertions(+), 66 deletions(-)

New commits:
commit 56e0fd345c4e68753123a05cd80291e933d71061
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Oct 29 22:35:44 2018 -0700

    Remove last use of hb_auto_t<>

diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh
index 86f9d2ca..a1c5a974 100644
--- a/src/hb-ot-cmap-table.hh
+++ b/src/hb-ot-cmap-table.hh
@@ -228,6 +228,10 @@ struct CmapSubtableFormat4
 
   struct accelerator_t
   {
+    inline accelerator_t (void) {}
+    inline accelerator_t (const CmapSubtableFormat4 *subtable) { init (subtable); }
+    inline ~accelerator_t (void) { fini (); }
+
     inline void init (const CmapSubtableFormat4 *subtable)
     {
       segCount = subtable->segCountX2 / 2;
@@ -327,12 +331,12 @@ struct CmapSubtableFormat4
 
   inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
   {
-    hb_auto_t<accelerator_t> accel (this);
+    accelerator_t accel (this);
     return accel.get_glyph_func (&accel, codepoint, glyph);
   }
   inline void collect_unicodes (hb_set_t *out) const
   {
-    hb_auto_t<accelerator_t> accel (this);
+    accelerator_t accel (this);
     accel.collect_unicodes (out);
   }
 
commit ca5e5a4979fa4aca873ba986e60b3010aaf0b1de
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Oct 29 22:30:21 2018 -0700

    Port Coverage::Iter off hb_auto_t<>

diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh
index 11297a57..47731053 100644
--- a/src/hb-ot-layout-common.hh
+++ b/src/hb-ot-layout-common.hh
@@ -1108,8 +1108,7 @@ struct Coverage
 
   struct Iter
   {
-    Iter (void) : format (0), u () {};
-    inline void init (const Coverage &c_)
+    inline Iter (const Coverage &c_)
     {
       format = c_.u.format;
       switch (format)
@@ -1119,7 +1118,6 @@ struct Coverage
       default:				     return;
       }
     }
-    inline void fini (void) {}
     inline bool more (void)
     {
       switch (format)
diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh
index 8a6c0278..399ede43 100644
--- a/src/hb-ot-layout-gpos-table.hh
+++ b/src/hb-ot-layout-gpos-table.hh
@@ -719,7 +719,7 @@ struct PairPosFormat1
   inline bool intersects (const hb_set_t *glyphs) const
   {
     unsigned int count = pairSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh
index 10f4ca24..d24ea59a 100644
--- a/src/hb-ot-layout-gsub-table.hh
+++ b/src/hb-ot-layout-gsub-table.hh
@@ -48,7 +48,7 @@ struct SingleSubstFormat1
   inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE (this);
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       /* TODO Switch to range-based API to work around malicious fonts.
        * https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -62,7 +62,7 @@ struct SingleSubstFormat1
   {
     TRACE_COLLECT_GLYPHS (this);
     if (unlikely (!(this+coverage).add_coverage (c->input))) return;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       /* TODO Switch to range-based API to work around malicious fonts.
        * https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -113,7 +113,7 @@ struct SingleSubstFormat1
     hb_vector_t<GlyphID> from;
     hb_vector_t<GlyphID> to;
     hb_codepoint_t delta = deltaGlyphID;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (!c->plan->glyphset->has (iter.get_glyph ()))
         continue;
@@ -157,7 +157,7 @@ struct SingleSubstFormat2
   {
     TRACE_CLOSURE (this);
     unsigned int count = substitute.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -171,7 +171,7 @@ struct SingleSubstFormat2
     TRACE_COLLECT_GLYPHS (this);
     if (unlikely (!(this+coverage).add_coverage (c->input))) return;
     unsigned int count = substitute.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -218,7 +218,7 @@ struct SingleSubstFormat2
     TRACE_SUBSET (this);
     hb_vector_t<GlyphID> from;
     hb_vector_t<GlyphID> to;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (!c->plan->glyphset->has (iter.get_glyph ()))
         continue;
@@ -395,7 +395,7 @@ struct MultipleSubstFormat1
   {
     TRACE_CLOSURE (this);
     unsigned int count = sequence.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -585,7 +585,7 @@ struct AlternateSubstFormat1
   {
     TRACE_CLOSURE (this);
     unsigned int count = alternateSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -599,7 +599,7 @@ struct AlternateSubstFormat1
     TRACE_COLLECT_GLYPHS (this);
     if (unlikely (!(this+coverage).add_coverage (c->input))) return;
     unsigned int count = alternateSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -906,7 +906,7 @@ struct LigatureSubstFormat1
   inline bool intersects (const hb_set_t *glyphs) const
   {
     unsigned int count = ligatureSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -921,7 +921,7 @@ struct LigatureSubstFormat1
   {
     TRACE_CLOSURE (this);
     unsigned int count = ligatureSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -935,7 +935,7 @@ struct LigatureSubstFormat1
     TRACE_COLLECT_GLYPHS (this);
     if (unlikely (!(this+coverage).add_coverage (c->input))) return;
     unsigned int count = ligatureSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -1114,7 +1114,7 @@ struct ReverseChainSingleSubstFormat1
 
     const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
     count = substitute.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh
index 09f64258..03fdac2a 100644
--- a/src/hb-ot-layout-gsubgpos.hh
+++ b/src/hb-ot-layout-gsubgpos.hh
@@ -1441,7 +1441,7 @@ struct ContextFormat1
     };
 
     unsigned int count = ruleSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -1462,7 +1462,7 @@ struct ContextFormat1
     };
 
     unsigned int count = ruleSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -2105,7 +2105,7 @@ struct ChainContextFormat1
     };
 
     unsigned int count = ruleSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -2126,7 +2126,7 @@ struct ChainContextFormat1
     };
 
     unsigned int count = ruleSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
commit 3a4e5dd425a2a37ff4c37db953943386c0b6e5d8
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Oct 29 18:05:25 2018 -0700

    Remove a few unnecessary hb_auto_t<>'s
    
    See a85641446c30247c4e948263f0f8c1147ed4efb9

diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc
index 8b4f7e6a..184db494 100644
--- a/src/hb-coretext.cc
+++ b/src/hb-coretext.cc
@@ -474,8 +474,8 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
 	buffer->merge_clusters (i - 1, i + 1);
   }
 
-  hb_auto_t<hb_vector_t<feature_record_t> > feature_records;
-  hb_auto_t<hb_vector_t<range_record_t> > range_records;
+  hb_vector_t<feature_record_t> feature_records;
+  hb_vector_t<range_record_t> range_records;
 
   /*
    * Set up features.
@@ -484,7 +484,7 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
   if (num_features)
   {
     /* Sort features by start/end events. */
-    hb_auto_t<hb_vector_t<feature_event_t> > feature_events;
+    hb_vector_t<feature_event_t> feature_events;
     for (unsigned int i = 0; i < num_features; i++)
     {
       const hb_aat_feature_mapping_t * mapping = hb_aat_layout_find_feature_mapping (features[i].tag);
@@ -523,7 +523,7 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
     }
 
     /* Scan events and save features for each range. */
-    hb_auto_t<hb_vector_t<active_feature_t> > active_features;
+    hb_vector_t<active_feature_t> active_features;
     unsigned int last_index = 0;
     for (unsigned int i = 0; i < feature_events.len; i++)
     {
diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh
index f0dbef69..86f9d2ca 100644
--- a/src/hb-ot-cmap-table.hh
+++ b/src/hb-ot-cmap-table.hh
@@ -859,10 +859,8 @@ struct cmap
           +  CmapSubtableFormat12::get_sub_table_size (this->format12_groups);
     }
 
-    // Format 4
-    hb_auto_t<hb_vector_t<CmapSubtableFormat4::segment_plan> > format4_segments;
-    // Format 12
-    hb_auto_t<hb_vector_t<CmapSubtableLongGroup> > format12_groups;
+    hb_vector_t<CmapSubtableFormat4::segment_plan> format4_segments;
+    hb_vector_t<CmapSubtableLongGroup> format12_groups;
   };
 
   inline bool sanitize (hb_sanitize_context_t *c) const
diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh
index 2ce52a1b..10f4ca24 100644
--- a/src/hb-ot-layout-gsub-table.hh
+++ b/src/hb-ot-layout-gsub-table.hh
@@ -110,8 +110,8 @@ struct SingleSubstFormat1
   inline bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    hb_auto_t<hb_vector_t<GlyphID> > from;
-    hb_auto_t<hb_vector_t<GlyphID> > to;
+    hb_vector_t<GlyphID> from;
+    hb_vector_t<GlyphID> to;
     hb_codepoint_t delta = deltaGlyphID;
     for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
     {
@@ -216,8 +216,8 @@ struct SingleSubstFormat2
   inline bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    hb_auto_t<hb_vector_t<GlyphID> > from;
-    hb_auto_t<hb_vector_t<GlyphID> > to;
+    hb_vector_t<GlyphID> from;
+    hb_vector_t<GlyphID> to;
     for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
     {
       if (!c->plan->glyphset->has (iter.get_glyph ()))
diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh
index a4066265..09f64258 100644
--- a/src/hb-ot-layout-gsubgpos.hh
+++ b/src/hb-ot-layout-gsubgpos.hh
@@ -93,7 +93,7 @@ struct hb_closure_context_t :
 
   hb_face_t *face;
   hb_set_t *glyphs;
-  hb_auto_t<hb_set_t> out[1];
+  hb_set_t out[1];
   recurse_func_t recurse_func;
   unsigned int nesting_level_left;
   unsigned int debug_depth;
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index 19f80040..ea59b835 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -708,8 +708,8 @@ struct hb_collect_features_context_t
   hb_set_t           *feature_indexes;
 
   private:
-  hb_auto_t<hb_set_t> visited_script;
-  hb_auto_t<hb_set_t> visited_langsys;
+  hb_set_t visited_script;
+  hb_set_t visited_langsys;
 };
 
 static void
@@ -836,7 +836,7 @@ hb_ot_layout_collect_lookups (hb_face_t      *face,
 {
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
 
-  hb_auto_t<hb_set_t> feature_indexes;
+  hb_set_t feature_indexes;
   hb_ot_layout_collect_features (face, table_tag, scripts, languages, features, &feature_indexes);
 
   for (hb_codepoint_t feature_index = HB_SET_VALUE_INVALID;
@@ -974,7 +974,7 @@ hb_ot_layout_lookup_substitute_closure (hb_face_t    *face,
 				        unsigned int  lookup_index,
 				        hb_set_t     *glyphs)
 {
-  hb_auto_t<hb_map_t> done_lookups;
+  hb_map_t done_lookups;
   OT::hb_closure_context_t c (face, glyphs, &done_lookups);
 
   const OT::SubstLookup& l = _get_gsub (face).get_lookup (lookup_index);
@@ -995,7 +995,7 @@ hb_ot_layout_lookups_substitute_closure (hb_face_t      *face,
                                          const hb_set_t *lookups,
                                          hb_set_t       *glyphs)
 {
-  hb_auto_t<hb_map_t> done_lookups;
+  hb_map_t done_lookups;
   OT::hb_closure_context_t c (face, glyphs, &done_lookups);
   const OT::GSUB& gsub = _get_gsub (face);
 
diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc
index 05700603..64c8ad79 100644
--- a/src/hb-subset-plan.cc
+++ b/src/hb-subset-plan.cc
@@ -55,7 +55,7 @@ _add_gid_and_children (const OT::glyf::accelerator_t &glyf,
 static void
 _gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain)
 {
-  hb_auto_t<hb_set_t> lookup_indices;
+  hb_set_t lookup_indices;
   hb_ot_layout_collect_lookups (face,
                                 HB_OT_TAG_GSUB,
                                 nullptr,
diff --git a/src/hb-subset.cc b/src/hb-subset.cc
index 294fd846..ed61c628 100644
--- a/src/hb-subset.cc
+++ b/src/hb-subset.cc
@@ -68,7 +68,7 @@ _subset2 (hb_subset_plan_t *plan)
   hb_bool_t result = false;
   if (source_blob->data)
   {
-    hb_auto_t<hb_vector_t<char> > buf;
+    hb_vector_t<char> buf;
     unsigned int buf_size = _plan_estimate_subset_table_size (plan, source_blob->length);
     DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c initial estimated table size: %u bytes.", HB_UNTAG(tag), buf_size);
     if (unlikely (!buf.alloc (buf_size)))
diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc
index b12a0539..26b99ed1 100644
--- a/src/hb-uniscribe.cc
+++ b/src/hb-uniscribe.cc
@@ -642,12 +642,12 @@ _hb_uniscribe_shape (hb_shape_plan_t    *shape_plan,
   /*
    * Set up features.
    */
-  hb_auto_t<hb_vector_t<OPENTYPE_FEATURE_RECORD> > feature_records;
-  hb_auto_t<hb_vector_t<range_record_t> > range_records;
+  hb_vector_t<OPENTYPE_FEATURE_RECORD> feature_records;
+  hb_vector_t<range_record_t> range_records;
   if (num_features)
   {
     /* Sort features by start/end events. */
-    hb_auto_t<hb_vector_t<feature_event_t> > feature_events;
+    hb_vector_t<feature_event_t> feature_events;
     for (unsigned int i = 0; i < num_features; i++)
     {
       active_feature_t feature;
@@ -682,7 +682,7 @@ _hb_uniscribe_shape (hb_shape_plan_t    *shape_plan,
     }
 
     /* Scan events and save features for each range. */
-    hb_auto_t<hb_vector_t<active_feature_t> > active_features;
+    hb_vector_t<active_feature_t> active_features;
     unsigned int last_index = 0;
     for (unsigned int i = 0; i < feature_events.len; i++)
     {
@@ -854,8 +854,8 @@ retry:
 #undef MAX_ITEMS
 
   OPENTYPE_TAG language_tag = hb_uint32_swap (hb_ot_tag_from_language (buffer->props.language));
-  hb_auto_t<hb_vector_t<TEXTRANGE_PROPERTIES*> > range_properties;
-  hb_auto_t<hb_vector_t<int> > range_char_counts;
+  hb_vector_t<TEXTRANGE_PROPERTIES*> range_properties;
+  hb_vector_t<int> range_char_counts;
 
   unsigned int glyphs_offset = 0;
   unsigned int glyphs_len;
commit 67a22f377dee0dbd89f301f0a1fec6f787867b5e
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Oct 29 17:37:41 2018 -0700

    [set/map/vector] Make constructable, but not copy or assignable
    
    Disable copy/assign on them, as they shouldn't.
    
    Make constructor / destructor call init_shallow/fini_shallow,
    and make those idempotent.  So, these three can be constructed
    on stack now and no init/fini call is needed.  As such,
    hb_auto_t<> is not needed anymore.  I'll remove that separately.

diff --git a/src/hb-map.hh b/src/hb-map.hh
index b55e3a95..e5ca3f51 100644
--- a/src/hb-map.hh
+++ b/src/hb-map.hh
@@ -44,6 +44,10 @@ inline uint32_t Hash (const T &v)
 
 struct hb_map_t
 {
+  HB_NO_COPY_ASSIGN (hb_map_t);
+  inline hb_map_t (void) { init_shallow (); }
+  inline ~hb_map_t (void) { fini_shallow (); }
+
   struct item_t
   {
     hb_codepoint_t key;
@@ -77,9 +81,11 @@ struct hb_map_t
   inline void fini_shallow (void)
   {
     free (items);
+    items = nullptr;
   }
   inline void fini (void)
   {
+    population = occupancy = 0;
     hb_object_fini (this);
     fini_shallow ();
   }
diff --git a/src/hb-set.hh b/src/hb-set.hh
index 2071196b..97ff291e 100644
--- a/src/hb-set.hh
+++ b/src/hb-set.hh
@@ -39,6 +39,10 @@
 
 struct hb_set_t
 {
+  HB_NO_COPY_ASSIGN (hb_set_t);
+  inline hb_set_t (void) { init_shallow (); }
+  inline ~hb_set_t (void) { fini_shallow (); }
+
   struct page_map_t
   {
     inline int cmp (const page_map_t *o) const { return (int) o->major - (int) major; }
@@ -199,6 +203,7 @@ struct hb_set_t
   }
   inline void fini_shallow (void)
   {
+    population = 0;
     page_map.fini ();
     pages.fini ();
   }
diff --git a/src/hb-vector.hh b/src/hb-vector.hh
index 8995ae10..fe06addf 100644
--- a/src/hb-vector.hh
+++ b/src/hb-vector.hh
@@ -34,6 +34,10 @@
 template <typename Type, unsigned int StaticSize=8>
 struct hb_vector_t
 {
+  HB_NO_COPY_ASSIGN_TEMPLATE2 (hb_vector_t, Type, StaticSize);
+  inline hb_vector_t (void) { init (); }
+  inline ~hb_vector_t (void) { fini (); }
+
   unsigned int len;
   private:
   unsigned int allocated; /* == 0 means allocation failed. */
@@ -48,6 +52,22 @@ struct hb_vector_t
     arrayZ_ = nullptr;
   }
 
+  inline void fini (void)
+  {
+    if (arrayZ_)
+      free (arrayZ_);
+    arrayZ_ = nullptr;
+    allocated = len = 0;
+  }
+  inline void fini_deep (void)
+  {
+    Type *array = arrayZ();
+    unsigned int count = len;
+    for (unsigned int i = 0; i < count; i++)
+      array[i].fini ();
+    fini ();
+  }
+
   inline Type * arrayZ (void)
   { return arrayZ_ ? arrayZ_ : static_array; }
   inline const Type * arrayZ (void) const
@@ -255,23 +275,6 @@ struct hb_vector_t
     *i = max;
     return false;
   }
-
-  inline void fini_deep (void)
-  {
-    Type *array = arrayZ();
-    unsigned int count = len;
-    for (unsigned int i = 0; i < count; i++)
-      array[i].fini ();
-    fini ();
-  }
-
-  inline void fini (void)
-  {
-    if (arrayZ_)
-      free (arrayZ_);
-    arrayZ_ = nullptr;
-    allocated = len = 0;
-  }
 };
 
 
diff --git a/src/hb.hh b/src/hb.hh
index 74dd8ace..6f5d6aab 100644
--- a/src/hb.hh
+++ b/src/hb.hh
@@ -339,6 +339,16 @@ static_assert ((sizeof (hb_var_int_t) == 4), "");
 
 #if __cplusplus >= 201103L
 
+/* We only enable these with C++11 or later, since earlier language
+ * does not allow structs with constructors in unions, and we need
+ * those. */
+
+#define HB_NO_COPY_ASSIGN(TypeName) \
+  TypeName(const TypeName&); \
+  void operator=(const TypeName&)
+#define HB_NO_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2) \
+  TypeName(const TypeName<T1, T2>&); \
+  void operator=(const TypeName<T1, T2>&)
 #define HB_NO_CREATE_COPY_ASSIGN(TypeName) \
   TypeName(void); \
   TypeName(const TypeName&); \
@@ -354,6 +364,8 @@ static_assert ((sizeof (hb_var_int_t) == 4), "");
 
 #else /* __cpluspplus >= 201103L */
 
+#define HB_NO_COPY_ASSIGN(TypeName)
+#define HB_NO_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2)
 #define HB_NO_CREATE_COPY_ASSIGN(TypeName)
 #define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE(TypeName, T)
 #define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2)


More information about the HarfBuzz mailing list