Add DynamicConverters for const strings.
authorAshoat Tevosyan <ashoat@fb.com>
Mon, 24 Sep 2012 13:07:29 +0000 (06:07 -0700)
committerJordan DeLong <jdelong@fb.com>
Fri, 12 Oct 2012 04:33:48 +0000 (21:33 -0700)
Summary: These are necessary for string-keyed maps, since maps const their keys.

Test Plan: I wrote a test.

Reviewed By: njormrod@fb.com

FB internal diff: D582283

folly/DynamicConverter.h
folly/test/DynamicConverterTest.cpp

index 275d6d936e60a46ab3d9cff51ecdb5b67d881395..2f0a1205888e9b15e1b1e98f61cca9abfb636add 100644 (file)
@@ -268,7 +268,7 @@ struct DynamicConverter<C,
 
 template <typename T>
 T convertTo(const dynamic& d) {
-  return DynamicConverter<T>::convert(d);
+  return DynamicConverter<typename std::remove_cv<T>::type>::convert(d);
 }
 
 } // namespace folly
index 5d414d4407e074e942f2d7301d3a9ef0af1bff95..0dd06671598e059a73783f4652f9a7ae2dfe1ec2 100644 (file)
@@ -141,6 +141,18 @@ TEST(DynamicConverter, simple_map) {
   EXPECT_EQ(i2, i2b);
 }
 
+TEST(DynamicConverter, map_keyed_by_string) {
+  dynamic d1 = dynamic::object("1", "one")("2", "two");
+  auto i1 = convertTo<std::map<std::string, std::string>>(d1);
+  decltype(i1) i1b = { { "1", "one" }, { "2", "two" } };
+  EXPECT_EQ(i1, i1b);
+
+  dynamic d2 = { { "3", "three" }, { "4", "four" } };
+  auto i2 = convertTo<std::unordered_map<std::string, std::string>>(d2);
+  decltype(i2) i2b = { { "3", "three" }, { "4", "four" } };
+  EXPECT_EQ(i2, i2b);
+}
+
 TEST(DynamicConverter, nested_containers) {
   dynamic d1 = { { 1 }, { }, { 2, 3 } };
   auto i1 = convertTo<folly::fbvector<std::vector<uint8_t>>>(d1);
@@ -227,6 +239,30 @@ TEST(DynamicConverter, crazy) {
   EXPECT_EQ(f1, i);
 }
 
+TEST(DynamicConverter, consts) {
+  dynamic d1 = 7.5;
+  auto i1 = convertTo<const double>(d1);
+  EXPECT_EQ(7.5, i1);
+
+  dynamic d2 = "Hello";
+  auto i2 = convertTo<const std::string>(d2);
+  decltype(i2) i2b = "Hello";
+  EXPECT_EQ(i2b, i2);
+
+  dynamic d3 = true;
+  auto i3 = convertTo<const bool>(d3);
+  EXPECT_EQ(true, i3);
+
+  dynamic d4 = "true";
+  auto i4 = convertTo<const bool>(d4);
+  EXPECT_EQ(true, i4);
+
+  dynamic d5 = { 1, 2 };
+  auto i5 = convertTo<const std::pair<const int, const int>>(d5);
+  decltype(i5) i5b = { 1, 2 };
+  EXPECT_EQ(i5b, i5);
+}
+
 struct Token {
   int kind_;
   fbstring lexeme_;