-// non-map containers
-template <typename C>
-struct DynamicConverter<C,
- typename std::enable_if<
- dynamicconverter_detail::is_container<C>::value &&
- !dynamicconverter_detail::is_map_container<C>::value
- >::type
- > {
- static C convert(const dynamic& d) {
- if (LIKELY(d.isArray())) {
- return C(dynamicconverter_detail::conversionIterator<C>(d.begin()),
- dynamicconverter_detail::conversionIterator<C>(d.end()));
- } else {
- throw TypeError("array", d.type());
+///////////////////////////////////////////////////////////////////////////////
+// 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);
+ }
+};
+
+// maps
+template<typename C>
+struct DynamicConstructor<C,
+ typename std::enable_if<
+ dynamicconverter_detail::is_map<C>::value>::type> {
+ static dynamic construct(const C& x) {
+ dynamic d = dynamic::object;
+ for (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<
+ !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 = {};
+ for (auto& item : x) {
+ d.push_back(toDynamic(item));