+ throw TypeError("object or array", d.type());
+ }
+ return ret;
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// DynamicConstructor specializations
+
+/**
+ * Each specialization of DynamicConstructor has the function
+ * 'static dynamic construct(const C&);'
+ */
+
+// default
+template <typename C, typename Enable = void>
+struct DynamicConstructor {
+ static dynamic construct(const C& x) {
+ return dynamic(x);
+ }
+};
+
+// identity
+template <typename C>
+struct DynamicConstructor<
+ C,
+ typename std::enable_if<std::is_same<C, dynamic>::value>::type> {
+ static dynamic construct(const C& x) {
+ return x;
+ }
+};
+
+// maps
+template <typename C>
+struct DynamicConstructor<
+ C,
+ typename std::enable_if<
+ !std::is_same<C, dynamic>::value &&
+ dynamicconverter_detail::is_map<C>::value>::type> {
+ static dynamic construct(const C& x) {
+ dynamic d = dynamic::object;
+ for (const auto& pair : x) {
+ d.insert(toDynamic(pair.first), toDynamic(pair.second));
+ }
+ return d;
+ }
+};
+
+// other ranges
+template <typename C>
+struct DynamicConstructor<
+ C,
+ typename std::enable_if<
+ !std::is_same<C, dynamic>::value &&
+ !dynamicconverter_detail::is_map<C>::value &&
+ !std::is_constructible<StringPiece, const C&>::value &&
+ dynamicconverter_detail::is_range<C>::value>::type> {
+ static dynamic construct(const C& x) {
+ dynamic d = dynamic::array;
+ for (const auto& item : x) {
+ d.push_back(toDynamic(item));