From 65a22836f833c9ec0e5a3d11f3e5b9a2befaea54 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Jan 2022 12:55:48 -0700 Subject: [PATCH 1/7] [vector] Add XXX markers for remaining places that need work --- src/hb-vector.hh | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/hb-vector.hh b/src/hb-vector.hh index 963b44630..e3fd51373 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -82,6 +82,7 @@ struct hb_vector_t void fini () { + // XXX Destruct hb_free (arrayZ); init (); } @@ -272,8 +273,11 @@ struct hb_vector_t return false; if (size > length) - // XXX reconstruct objects?! / destruct objects... + // XXX construct objects. memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ)); + else if (size < length) + // XXX destroy objects. + {} length = size; return true; @@ -290,6 +294,7 @@ struct hb_vector_t { if (unlikely (i >= length)) return; + // XXX Swap / move / destruct. memmove (static_cast (&arrayZ[i]), static_cast (&arrayZ[i + 1]), (length - i - 1) * sizeof (Type)); @@ -299,8 +304,12 @@ struct hb_vector_t void shrink (int size_) { unsigned int size = size_ < 0 ? 0u : (unsigned int) size_; - if (size < length) - length = size; + if (size >= length) + return; + + // XXX Destruct. + + length = size; } template From 813eaba6ea23544eea6bc6efcedada817b9c0b10 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Jan 2022 13:09:21 -0700 Subject: [PATCH 2/7] [vector] Start adding destruction Now we need to remove manual destruction, ouch! --- src/hb-vector.hh | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/hb-vector.hh b/src/hb-vector.hh index e3fd51373..a474a7ba5 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -82,7 +82,7 @@ struct hb_vector_t void fini () { - // XXX Destruct + shrink_vector (0); hb_free (arrayZ); init (); } @@ -224,13 +224,34 @@ struct hb_vector_t new (std::addressof (new_array[i])) Type (); for (unsigned i = 0; i < (unsigned) length; i++) new_array[i] = std::move (arrayZ[i]); - for (unsigned i = 0; i < (unsigned) length; i++) - arrayZ[i].~Type (); + unsigned old_length = length; + shrink_vector (0); + length = old_length; hb_free (arrayZ); } return new_array; } + template ::value)> + void + shrink_vector (unsigned size) + { + length = size; + } + template ::value)> + void + shrink_vector (unsigned size) + { + while ((unsigned) length > size) + { + arrayZ[(unsigned) length - 1].~Type (); + length--; + } + } + + /* Allocate for size but don't adjust length. */ bool alloc (unsigned int size) { @@ -276,8 +297,7 @@ struct hb_vector_t // XXX construct objects. memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ)); else if (size < length) - // XXX destroy objects. - {} + shrink_vector (size); length = size; return true; @@ -307,9 +327,7 @@ struct hb_vector_t if (size >= length) return; - // XXX Destruct. - - length = size; + shrink_vector (size); } template From 7171917b52880728b513168d946196331b7707d1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 15 Jan 2022 17:16:40 -0700 Subject: [PATCH 3/7] [vector] Construct items when enlarging --- src/hb-vector.hh | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/hb-vector.hh b/src/hb-vector.hh index a474a7ba5..636e125c5 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -232,6 +232,26 @@ struct hb_vector_t return new_array; } + template ::value)> + void + grow_vector (unsigned size) + { + memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ)); + length = size; + } + template ::value)> + void + grow_vector (unsigned size) + { + while (length < size) + { + length++; + new (std::addressof (arrayZ[length - 1])) Type (); + } + } + template ::value)> void @@ -294,8 +314,7 @@ struct hb_vector_t return false; if (size > length) - // XXX construct objects. - memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ)); + grow_vector (size); else if (size < length) shrink_vector (size); From 5946e945d515bed8579caaac7fb79ee540fb22e8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 15 Jan 2022 18:00:18 -0700 Subject: [PATCH 4/7] [vector] Destruct in pop() --- src/hb-vector.hh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hb-vector.hh b/src/hb-vector.hh index 636e125c5..11a9f5a41 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -325,8 +325,10 @@ struct hb_vector_t Type pop () { if (!length) return Null (Type); - return std::move (arrayZ[--length]); /* Does this move actually work? */ - // XXX Destruct? + Type v = std::move (arrayZ[length - 1]); + arrayZ[length - 1].~Type (); + length--; + return v; } void remove (unsigned int i) From c58bfa35fb9d6d8bebad94c2c6e24eaf18d5d1d5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 15 Jan 2022 18:06:03 -0700 Subject: [PATCH 5/7] [vector] Move semantics in vector remove() --- src/hb-vector.hh | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/hb-vector.hh b/src/hb-vector.hh index 11a9f5a41..9fb477cb0 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -271,6 +271,23 @@ struct hb_vector_t } } + template ::value)> + void + shift_down_vector (unsigned i) + { + memmove (static_cast (&arrayZ[i - 1]), + static_cast (&arrayZ[i]), + (length - i) * sizeof (Type)); + } + template ::value)> + void + shift_down_vector (unsigned i) + { + for (; i < length; i++) + arrayZ[i - 1] = std::move (arrayZ[i]); + } /* Allocate for size but don't adjust length. */ bool alloc (unsigned int size) @@ -335,10 +352,8 @@ struct hb_vector_t { if (unlikely (i >= length)) return; - // XXX Swap / move / destruct. - memmove (static_cast (&arrayZ[i]), - static_cast (&arrayZ[i + 1]), - (length - i - 1) * sizeof (Type)); + arrayZ[i].~Type (); + shift_down_vector (i + 1); length--; } From 1198fb24686d1ea268f9923d3238fe6c2afb2d97 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 16 Jan 2022 06:29:35 -0700 Subject: [PATCH 6/7] [vector] Adjust construction criteria --- src/hb-vector.hh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/hb-vector.hh b/src/hb-vector.hh index 9fb477cb0..f5df8364f 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -233,7 +233,8 @@ struct hb_vector_t } template ::value)> + hb_enable_if (std::is_trivially_constructible::value || + !std::is_default_constructible::value)> void grow_vector (unsigned size) { @@ -241,7 +242,8 @@ struct hb_vector_t length = size; } template ::value)> + hb_enable_if (!std::is_trivially_constructible::value && + std::is_default_constructible::value)> void grow_vector (unsigned size) { @@ -253,14 +255,14 @@ struct hb_vector_t } template ::value)> + hb_enable_if (std::is_trivially_destructible::value)> void shrink_vector (unsigned size) { length = size; } template ::value)> + hb_enable_if (!std::is_trivially_destructible::value)> void shrink_vector (unsigned size) { From 15cceff3d779c0cfb6b4d613ec7b39e81c962c7d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jan 2022 15:53:01 -0700 Subject: [PATCH 7/7] [repacker] Replace fini_deep() with fini() Vector calls destructor now. --- src/hb-repacker.hh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-repacker.hh b/src/hb-repacker.hh index 53233cb89..4ae7603e1 100644 --- a/src/hb-repacker.hh +++ b/src/hb-repacker.hh @@ -186,7 +186,7 @@ struct graph_t ~graph_t () { - vertices_.fini_deep (); + vertices_.fini (); } bool in_error () const @@ -309,7 +309,7 @@ struct graph_t remap_all_obj_indices (id_map, &sorted_graph); hb_swap (vertices_, sorted_graph); - sorted_graph.fini_deep (); + sorted_graph.fini (); } /* @@ -369,7 +369,7 @@ struct graph_t remap_all_obj_indices (id_map, &sorted_graph); hb_swap (vertices_, sorted_graph); - sorted_graph.fini_deep (); + sorted_graph.fini (); } /*