Commit c1e51516 authored by Jordan DeLong's avatar Jordan DeLong

Make dynamic::object callable with initializer lists

Summary:
Using perfect forwarding here prevents the ability to create
dynamic arrays.

Test Plan: Added unit test case that compiles now with this.

Reviewed By: tudorb@fb.com

FB internal diff: D660662
parent 3692ff51
...@@ -197,9 +197,22 @@ private: ...@@ -197,9 +197,22 @@ private:
dynamic val_; dynamic val_;
}; };
template<class... Args> // This looks like a case for perfect forwarding, but our use of
inline dynamic::ObjectMaker dynamic::object(Args&&... args) { // std::initializer_list for constructing dynamic arrays makes it less
return dynamic::ObjectMaker(std::forward<Args>(args)...); // functional than doing this manually.
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::ObjectMaker dynamic::object(dynamic const& a, dynamic&& b) {
return ObjectMaker(a, std::move(b));
}
inline dynamic::ObjectMaker dynamic::object(dynamic&& a, dynamic const& b) {
return ObjectMaker(std::move(a), b);
}
inline dynamic::ObjectMaker
dynamic::object(dynamic const& a, dynamic const& b) {
return ObjectMaker(a, b);
} }
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
......
...@@ -133,7 +133,11 @@ private: ...@@ -133,7 +133,11 @@ private:
struct ObjectMaker; struct ObjectMaker;
public: public:
template<class... Args> static ObjectMaker object(Args&&...); static ObjectMaker object();
static ObjectMaker object(dynamic&&, dynamic&&);
static ObjectMaker object(dynamic const&, dynamic&&);
static ObjectMaker object(dynamic&&, dynamic const&);
static ObjectMaker object(dynamic const&, dynamic const&);
/* /*
* String compatibility constructors. * String compatibility constructors.
......
...@@ -263,6 +263,14 @@ TEST(Dynamic, GetSetDefaultTest) { ...@@ -263,6 +263,14 @@ TEST(Dynamic, GetSetDefaultTest) {
EXPECT_ANY_THROW(d4.setDefault("foo", "bar")); EXPECT_ANY_THROW(d4.setDefault("foo", "bar"));
} }
TEST(Dynamic, ObjectForwarding) {
// Make sure dynamic::object can be constructed the same way as any
// dynamic.
dynamic d = dynamic::object("asd", {"foo", "bar"});
dynamic d2 = dynamic::object("key2", {"value", "words"})
("key", "value1");
}
int main(int argc, char** argv) { int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv); testing::InitGoogleTest(&argc, argv);
google::ParseCommandLineFlags(&argc, &argv, true); google::ParseCommandLineFlags(&argc, &argv, true);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment