From b0303c7493e6a7255a38d1786d8f790ddf4b6ec2 Mon Sep 17 00:00:00 2001 From: Asheem Mamoowala Date: Mon, 25 Jun 2018 15:06:41 -0700 Subject: Remove any_cast<>(unique_any) overloads that facilitate copying. This contradicts the unique_any contract --- include/mbgl/util/unique_any.hpp | 26 +------------------------- platform/darwin/src/MGLStyle.mm | 3 ++- test/util/unique_any.test.cpp | 11 +++++------ 3 files changed, 8 insertions(+), 32 deletions(-) diff --git a/include/mbgl/util/unique_any.hpp b/include/mbgl/util/unique_any.hpp index d488930a03..b84069c2e4 100644 --- a/include/mbgl/util/unique_any.hpp +++ b/include/mbgl/util/unique_any.hpp @@ -222,35 +222,11 @@ template inline ValueType* any_cast(unique_any* any) { if(any == nullptr || any->type() != typeid(ValueType)) - return nullptr; + throw bad_any_cast(); else return any->cast(); } -template > -inline ValueType any_cast(const unique_any& any) -{ - static_assert(std::is_constructible::value, - "any_cast type can't construct copy of contained object"); - auto temp = any_cast<_Vt>(&any); - if (temp == nullptr) { - throw bad_any_cast(); - } - return static_cast(*temp); -} - -template > -inline ValueType any_cast(unique_any& any) -{ - static_assert(std::is_constructible::value, - "any_cast type can't construct copy of contained object"); - auto temp = any_cast<_Vt>(&any); - if (temp == nullptr) { - throw bad_any_cast(); - } - return static_cast(*temp); -} - template > inline ValueType any_cast(unique_any&& any) { diff --git a/platform/darwin/src/MGLStyle.mm b/platform/darwin/src/MGLStyle.mm index 3f9bfbf8ca..ad47cb0155 100644 --- a/platform/darwin/src/MGLStyle.mm +++ b/platform/darwin/src/MGLStyle.mm @@ -177,7 +177,8 @@ static_assert(6 == mbgl::util::default_styles::numOrderedStyles, } - (MGLSource *)sourceFromMBGLSource:(mbgl::style::Source *)rawSource { - if (MGLSource *source = rawSource->peer.has_value() ? mbgl::util::any_cast(rawSource->peer).source : nil) { + if (rawSource->peer.has_value()) { + MGLSource* source = mbgl::util::any_cast(&(rawSource->peer))->source; return source; } diff --git a/test/util/unique_any.test.cpp b/test/util/unique_any.test.cpp index 9357b9c0ec..19763eb90d 100644 --- a/test/util/unique_any.test.cpp +++ b/test/util/unique_any.test.cpp @@ -42,7 +42,7 @@ TEST(UniqueAny, BasicTypes) { EXPECT_TRUE(i.type() == typeid(int)); EXPECT_TRUE(IsStackAllocated(i, any_cast(&i))); - auto iValue = any_cast(i); + auto iValue = *any_cast(&i); EXPECT_TRUE(iValue == 3); EXPECT_TRUE(unique_any(4).has_value()); @@ -53,7 +53,7 @@ TEST(UniqueAny, BasicTypes) { EXPECT_TRUE(f.type() == typeid(float)); EXPECT_TRUE(IsStackAllocated(f, any_cast(&f))); - const float fValue = any_cast(f); + const float fValue = *any_cast(&f); EXPECT_TRUE(fValue == 6.2f); EXPECT_TRUE(unique_any(1.0f).has_value()); @@ -64,7 +64,7 @@ TEST(UniqueAny, BasicTypes) { EXPECT_TRUE(c.type() == typeid(char)); EXPECT_TRUE(IsStackAllocated(c, any_cast(&c))); - EXPECT_THROW(any_cast(c), bad_any_cast); + EXPECT_THROW(any_cast(&c), bad_any_cast); EXPECT_TRUE(unique_any('4').has_value()); EXPECT_TRUE(unique_any('4').type() == typeid(char)); @@ -166,14 +166,13 @@ TEST(UniqueAny, SharedPtr) { std::weak_ptr weak = shared; unique_any u1 = 0; - EXPECT_THROW(any_cast(u1), bad_any_cast); + EXPECT_THROW(any_cast(&u1), bad_any_cast); EXPECT_EQ(weak.use_count(), 1); unique_any u2 = shared; EXPECT_EQ(weak.use_count(), 2); - EXPECT_EQ(any_cast>(&u1), nullptr); - EXPECT_FALSE(IsStackAllocated(u1, any_cast>(&u1))); + EXPECT_THROW(any_cast>(&u1), bad_any_cast); u1 = std::move(u2); EXPECT_EQ(weak.use_count(), 2); -- cgit v1.2.1