From d176e9bb46c4ab539e6cc5f6c7d17bc68d95e205 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 18 Jun 2018 16:24:58 -0700 Subject: [core] Fix issues in unique_any * Eliminate unnecessary temporary in VTableStack::move, which also fixes calling the destructor on the incorrect instance * Make move consistent: it destructs the src, not the dest, which is always empty * delete doesn't need a null guard * Conversions to void* don't need a cast --- include/mbgl/util/unique_any.hpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) (limited to 'include') diff --git a/include/mbgl/util/unique_any.hpp b/include/mbgl/util/unique_any.hpp index d488930a03..c7dc8b38ea 100644 --- a/include/mbgl/util/unique_any.hpp +++ b/include/mbgl/util/unique_any.hpp @@ -135,15 +135,12 @@ private: template struct VTableHeap : public VTable { void move(Storage&& src, Storage& dest) override { - destroy(dest); dest.dynamic = src.dynamic; + src.dynamic = nullptr; } void destroy(Storage& s) override { - if (s.dynamic) { - delete reinterpret_cast(s.dynamic); - } - s.dynamic = nullptr; + delete reinterpret_cast(s.dynamic); } const std::type_info& type() override { @@ -154,9 +151,8 @@ private: template struct VTableStack : public VTable { void move(Storage&& src, Storage& dest) override { - auto srcValue = reinterpret_cast(src.stack); - new (static_cast(&dest.stack)) ValueType(std::move(srcValue)); - srcValue.~ValueType(); + new (&dest.stack) ValueType(std::move(reinterpret_cast(src.stack))); + destroy(src); } void destroy(Storage& s) override { @@ -178,13 +174,13 @@ private: template std::enable_if_t::value> createStorage(ValueType&& value) { - new (static_cast(&storage.stack)) _Vt(std::forward(value)); + new (&storage.stack) _Vt(std::forward(value)); } template std::enable_if_t::value> createStorage(ValueType&& value) { - storage.dynamic = static_cast(new _Vt(std::forward(value))); + storage.dynamic = new _Vt(std::forward(value)); } template -- cgit v1.2.1