From a09dd87ca373c1629c05803e3b8611274cb15a6c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 12 May 2022 12:58:07 -0600 Subject: [PATCH] [set] Fix set copy/move constructors to actually work Ouch! --- src/hb-set.hh | 16 ++++++++++------ src/test-set.cc | 19 ++++++++++++++----- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/hb-set.hh b/src/hb-set.hh index 5840a1a1c..c9725e80c 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -44,7 +44,7 @@ struct hb_sparseset_t hb_sparseset_t (const hb_sparseset_t& other) : hb_sparseset_t () { set (other); } hb_sparseset_t (hb_sparseset_t&& other) : hb_sparseset_t () { s = std::move (other.s); } hb_sparseset_t& operator= (const hb_sparseset_t& other) { set (other); return *this; } - hb_sparseset_t& operator= (hb_sparseset_t&& other) { s = std::move (other.s); return *this; } + hb_sparseset_t& operator= (hb_sparseset_t&& other) { s = std::move (other.s); return *this; } friend void swap (hb_sparseset_t& a, hb_sparseset_t& b) { hb_swap (a.s, b.s); } hb_sparseset_t (std::initializer_list lst) : hb_sparseset_t () @@ -158,15 +158,19 @@ struct hb_sparseset_t struct hb_set_t : hb_sparseset_t { - hb_set_t () = default; + using sparseset = hb_sparseset_t; + ~hb_set_t () = default; - hb_set_t (hb_set_t&) = default; + hb_set_t () : sparseset () {}; + hb_set_t (const hb_set_t &o) : sparseset ((sparseset &) o) {}; + hb_set_t (hb_set_t&& o) : sparseset (std::move ((sparseset &) o)) {} hb_set_t& operator= (const hb_set_t&) = default; hb_set_t& operator= (hb_set_t&&) = default; - hb_set_t (std::initializer_list lst) : hb_sparseset_t (lst) {} + hb_set_t (std::initializer_list lst) : sparseset (lst) {} template - hb_set_t (const Iterable &o) : hb_sparseset_t (o) {} + hb_requires (hb_is_iterable (Iterable) && + !hb_is_same (hb_decay, hb_set_t))> + hb_set_t (const Iterable &o) : sparseset (o) {} }; static_assert (hb_set_t::INVALID == HB_SET_VALUE_INVALID, ""); diff --git a/src/test-set.cc b/src/test-set.cc index 286f1a997..e28d7e65c 100644 --- a/src/test-set.cc +++ b/src/test-set.cc @@ -42,21 +42,24 @@ main (int argc, char **argv) /* Test copy assignment. */ { hb_set_t v1 {1, 2}; - hb_set_t v2 = v1; + hb_set_t v2; + v2 = v1; assert (v1.get_population () == 2); assert (v2.get_population () == 2); } /* Test move constructor. */ { - hb_set_t v {hb_set_t {1, 2}}; + hb_set_t v (hb_set_t {1, 2}); assert (v.get_population () == 2); } /* Test move assignment. */ { + hb_set_t s = hb_set_t {1, 2}; hb_set_t v; - v = hb_set_t {1, 2}; + v = std::move (s); + assert (s.get_population () == 0); assert (v.get_population () == 2); } @@ -67,9 +70,15 @@ main (int argc, char **argv) s.add (18); s.add (12); - hb_set_t v (s); + hb_vector_t v (s); + hb_set_t v0 (v); + hb_set_t v1 (s); + hb_set_t v2 (std::move (s)); - assert (v.get_population () == 2); + assert (s.get_population () == 0); + assert (v0.get_population () == 2); + assert (v1.get_population () == 2); + assert (v2.get_population () == 2); } /* Test initializing from iterator. */