new (&u_.string) fbstring(std::move(s));
}
+inline dynamic& dynamic::operator=(std::initializer_list<dynamic> il) {
+ (*this) = dynamic(il);
+ return *this;
+}
+
inline dynamic::dynamic(std::initializer_list<dynamic> il)
: type_(ARRAY)
{
//////////////////////////////////////////////////////////////////////
-template<class T> struct dynamic::TypeInfo {
- static char const name[];
- static Type const type;
-};
-
-#define FB_DEC_TYPE(T) \
- template<> char const dynamic::TypeInfo<T>::name[]; \
- template<> dynamic::Type const dynamic::TypeInfo<T>::type
+#define FOLLY_DYNAMIC_DEC_TYPEINFO(T, str, val) \
+ template <> struct dynamic::TypeInfo<T> { \
+ static constexpr const char* name = str; \
+ static constexpr dynamic::Type type = val; \
+ }; \
+ //
-FB_DEC_TYPE(void*);
-FB_DEC_TYPE(bool);
-FB_DEC_TYPE(fbstring);
-FB_DEC_TYPE(dynamic::Array);
-FB_DEC_TYPE(double);
-FB_DEC_TYPE(int64_t);
-FB_DEC_TYPE(dynamic::ObjectImpl);
+FOLLY_DYNAMIC_DEC_TYPEINFO(void*, "null", dynamic::NULLT)
+FOLLY_DYNAMIC_DEC_TYPEINFO(bool, "boolean", dynamic::BOOL)
+FOLLY_DYNAMIC_DEC_TYPEINFO(fbstring, "string", dynamic::STRING)
+FOLLY_DYNAMIC_DEC_TYPEINFO(dynamic::Array, "array", dynamic::ARRAY)
+FOLLY_DYNAMIC_DEC_TYPEINFO(double, "double", dynamic::DOUBLE)
+FOLLY_DYNAMIC_DEC_TYPEINFO(int64_t, "int64", dynamic::INT64)
+FOLLY_DYNAMIC_DEC_TYPEINFO(dynamic::ObjectImpl, "object", dynamic::OBJECT)
-#undef FB_DEC_TYPE
+#undef FOLLY_DYNAMIC_DEC_TYPEINFO
template<class T>
T dynamic::asImpl() const {
out << t;
}
};
+// Otherwise, null, being (void*)0, would print as 0.
+template <>
+struct dynamic::PrintImpl<void*> {
+ static void print(dynamic const& d, std::ostream& out, void* const& nul) {
+ DCHECK_EQ((void*)0, nul);
+ out << "null";
+ }
+};
template<>
struct dynamic::PrintImpl<dynamic::ObjectImpl> {
static void print(dynamic const& d,