From: Qinfan Wu Date: Sun, 28 May 2017 20:49:28 +0000 (-0700) Subject: Fix tryTo to support conversion to enumerations X-Git-Tag: v2017.05.29.00^0 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=e49575d4bf1bc6408952d6b469d9b80d53729263;p=folly.git Fix tryTo to support conversion to enumerations Summary: [Folly] Fix `tryTo` to support conversion to enumerations. `tryTo` should return `Expected` instead of `Tgt`. Reviewed By: yfeldblum Differential Revision: D5144706 fbshipit-source-id: cd23f3cf75de7c5a26bc569f3cb47fff360f6e2a --- diff --git a/folly/Conv.h b/folly/Conv.h index 22cc8ac4..6cc32705 100644 --- a/folly/Conv.h +++ b/folly/Conv.h @@ -1536,7 +1536,7 @@ tryTo(const Src& value) { template typename std::enable_if< std::is_enum::value && !std::is_same::value, - Tgt>::type + Expected>::type tryTo(const Src& value) { using I = typename std::underlying_type::type; return tryTo(value).then([](I i) { return static_cast(i); }); diff --git a/folly/test/ConvTest.cpp b/folly/test/ConvTest.cpp index 5f33cf48..646f8a13 100644 --- a/folly/test/ConvTest.cpp +++ b/folly/test/ConvTest.cpp @@ -1061,6 +1061,18 @@ TEST(Conv, TryStringToInt) { EXPECT_EQ(rv2.value(), 4711); } +TEST(Conv, TryStringToEnum) { + enum class A { x = 42, y = 420, z = 65 }; + auto rv1 = folly::tryTo("1000000000000000000000000000000"); + EXPECT_FALSE(rv1.hasValue()); + auto rv2 = folly::tryTo("42"); + EXPECT_TRUE(rv2.hasValue()); + EXPECT_EQ(A::x, rv2.value()); + auto rv3 = folly::tryTo("50"); + EXPECT_TRUE(rv3.hasValue()); + EXPECT_EQ(static_cast(50), rv3.value()); +} + TEST(Conv, TryStringToFloat) { auto rv1 = folly::tryTo(""); EXPECT_FALSE(rv1.hasValue());