/*
- * Copyright 2015 Facebook, Inc.
+ * Copyright 2016 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
dynamic val_;
};
+inline void dynamic::array(EmptyArrayTag) {}
+
+template <class... Args>
+inline dynamic dynamic::array(Args&& ...args) {
+ return dynamic(std::initializer_list<dynamic>{std::forward<Args>(args)...},
+ PrivateTag());
+}
+
// This looks like a case for perfect forwarding, but our use of
// std::initializer_list for constructing dynamic arrays makes it less
// functional than doing this manually.
+
+// TODO(ott, 10300209): When the initializer_list constructor is gone,
+// simplify this.
inline dynamic::ObjectMaker dynamic::object() { return ObjectMaker(); }
inline dynamic::ObjectMaker dynamic::object(dynamic&& a, dynamic&& b) {
return ObjectMaker(std::move(a), std::move(b));
//////////////////////////////////////////////////////////////////////
+inline dynamic::dynamic(void (*)(EmptyArrayTag))
+ : type_(ARRAY)
+{
+ new (&u_.array) Array();
+}
+
inline dynamic::dynamic(ObjectMaker (*)())
: type_(OBJECT)
{
}
inline dynamic::dynamic(std::initializer_list<dynamic> il)
+ : dynamic(std::move(il), PrivateTag()) {
+}
+
+inline dynamic::dynamic(std::initializer_list<dynamic> il, PrivateTag)
: type_(ARRAY)
{
new (&u_.array) Array(il.begin(), il.end());
}
+inline dynamic& dynamic::operator=(std::initializer_list<dynamic> il) {
+ (*this) = dynamic(il, PrivateTag());
+ return *this;
+}
+
inline dynamic::dynamic(ObjectMaker&& maker)
: type_(OBJECT)
{
}
inline void dynamic::resize(std::size_t sz, dynamic const& c) {
- auto& array = get<Array>();
- array.resize(sz, c);
+ auto& arr = get<Array>();
+ arr.resize(sz, c);
}
inline void dynamic::push_back(dynamic const& v) {
- auto& array = get<Array>();
- array.push_back(v);
+ auto& arr = get<Array>();
+ arr.push_back(v);
}
inline void dynamic::push_back(dynamic&& v) {
- auto& array = get<Array>();
- array.push_back(std::move(v));
+ auto& arr = get<Array>();
+ arr.push_back(std::move(v));
}
inline void dynamic::pop_back() {
- auto& array = get<Array>();
- array.pop_back();
+ auto& arr = get<Array>();
+ arr.pop_back();
}
//////////////////////////////////////////////////////////////////////
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,