From: Marcelo Juchem Date: Thu, 3 Mar 2016 21:48:36 +0000 (-0800) Subject: Adding DynamicConverter support for enums X-Git-Tag: deprecate-dynamic-initializer~14 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=863a22ada1d3e4603576c41578f4201300ec2c61;p=folly.git Adding DynamicConverter support for enums Summary:DynamicConverter doesn't currently support reading enums. This diff addresses that by adding an enum specialization that uses integers as its underlying implementation. A follow-up is to handle both integers and strings, but that would require a way to parse strings into enums like Thrift static reflection provides (see https://github.com/facebook/fbthrift/blob/d17b072daddbd318f9afaa5562100eaba0f890e3/thrift/lib/cpp2/fatal/folly_dynamic-inl.h#L88,L92. Reviewed By: yfeldblum Differential Revision: D3002569 fb-gh-sync-id: 27bf4a9d5a7844762f5311e2c777606a0e7753f0 shipit-source-id: 27bf4a9d5a7844762f5311e2c777606a0e7753f0 --- diff --git a/folly/DynamicConverter.h b/folly/DynamicConverter.h index 8d61048d..3775ccb3 100644 --- a/folly/DynamicConverter.h +++ b/folly/DynamicConverter.h @@ -211,6 +211,16 @@ struct DynamicConverter +struct DynamicConverter::value>::type> { + static T convert(const dynamic& d) { + using type = typename std::underlying_type::type; + return static_cast(DynamicConverter::convert(d)); + } +}; + // floating point template struct DynamicConverter(d1); + EXPECT_EQ(i1, foo); + + dynamic d2 = 2; + auto i2 = convertTo(d2); + EXPECT_EQ(i2, bar); + + enum class enum2 { FOO = 1, BAR = 2 }; + + dynamic d3 = 1; + auto i3 = convertTo(d3); + EXPECT_EQ(i3, enum2::FOO); + + dynamic d4 = 2; + auto i4 = convertTo(d4); + EXPECT_EQ(i4, enum2::BAR); +} + TEST(DynamicConverter, simple_builtins) { dynamic d1 = "Haskell"; auto i1 = convertTo(d1);