Handle conversion from float in toDynamic()
authorMarcus Holland-Moritz <mhx@fb.com>
Thu, 7 Jul 2016 08:27:05 +0000 (01:27 -0700)
committerFacebook Github Bot <facebook-github-bot-bot@fb.com>
Thu, 7 Jul 2016 08:38:41 +0000 (01:38 -0700)
Summary:
This adds the necessary ConversionHelper to enable float-to-double
conversion when using `toDynamic` on any type that contains `float`.

Fixes the added test case, which previously failed to compile.

Reviewed By: yfeldblum

Differential Revision: D3525942

fbshipit-source-id: d904dde5585316ea9a15e21430e91ac4e33116b9

folly/dynamic-inl.h
folly/test/DynamicConverterTest.cpp

index 920f627c084e2661bbf94693d8d4a6d4b4632287..08374f7bc161883e4a43380dbec748ebfe0f8492 100644 (file)
@@ -107,14 +107,17 @@ namespace detail {
   > {
     typedef int64_t type;
   };
-  template<class T>
+  template <>
+  struct ConversionHelper<float> {
+    typedef double type;
+  };
+  template <class T>
   struct ConversionHelper<
-    T,
-    typename std::enable_if<
-      (!std::is_integral<T>::value || std::is_same<T,bool>::value) &&
-      !std::is_same<T,std::nullptr_t>::value
-    >::type
-  > {
+      T,
+      typename std::enable_if<
+          (!std::is_integral<T>::value || std::is_same<T, bool>::value) &&
+          !std::is_same<T, float>::value &&
+          !std::is_same<T, std::nullptr_t>::value>::type> {
     typedef T type;
   };
   template<class T>
index 039ce198424d4760cc537405f292e087951adc2c..1d45e67d787ad2ec9a5525c21599e47bb28a62c8 100644 (file)
@@ -343,6 +343,12 @@ TEST(DynamicConverter, construct) {
     EXPECT_EQ(d, toDynamic(c));
   }
 
+  {
+    vector<float> c{1.0f, 2.0f, 4.0f};
+    dynamic d = dynamic::array(1.0, 2.0, 4.0);
+    EXPECT_EQ(d, toDynamic(c));
+  }
+
   {
     map<int, int> c { { 2, 4 }, { 3, 9 } };
     dynamic d = dynamic::object(2, 4)(3, 9);