From e49575d4bf1bc6408952d6b469d9b80d53729263 Mon Sep 17 00:00:00 2001 From: Qinfan Wu Date: Sun, 28 May 2017 13:49:28 -0700 Subject: [PATCH] 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 --- folly/Conv.h | 2 +- folly/test/ConvTest.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) 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()); -- 2.34.1