Commit 80e95844 by Niels Lohmann Committed by GitHub

Merge pull request #663 from himikof/move-construction

Support moving from rvalues in std::initializer_list
parents 96dd4ffa aad55219
...@@ -842,8 +842,7 @@ TEST_CASE("constructors") ...@@ -842,8 +842,7 @@ TEST_CASE("constructors")
{ {
SECTION("explicit") SECTION("explicit")
{ {
std::initializer_list<json> l; json j(json::initializer_list_t {});
json j(l);
CHECK(j.type() == json::value_t::object); CHECK(j.type() == json::value_t::object);
} }
...@@ -860,8 +859,7 @@ TEST_CASE("constructors") ...@@ -860,8 +859,7 @@ TEST_CASE("constructors")
{ {
SECTION("explicit") SECTION("explicit")
{ {
std::initializer_list<json> l = {json(json::array_t())}; json j(json::initializer_list_t {json(json::array_t())});
json j(l);
CHECK(j.type() == json::value_t::array); CHECK(j.type() == json::value_t::array);
} }
...@@ -876,8 +874,7 @@ TEST_CASE("constructors") ...@@ -876,8 +874,7 @@ TEST_CASE("constructors")
{ {
SECTION("explicit") SECTION("explicit")
{ {
std::initializer_list<json> l = {json(json::object_t())}; json j(json::initializer_list_t {json(json::object_t())});
json j(l);
CHECK(j.type() == json::value_t::array); CHECK(j.type() == json::value_t::array);
} }
...@@ -892,8 +889,7 @@ TEST_CASE("constructors") ...@@ -892,8 +889,7 @@ TEST_CASE("constructors")
{ {
SECTION("explicit") SECTION("explicit")
{ {
std::initializer_list<json> l = {json("Hello world")}; json j(json::initializer_list_t {json("Hello world")});
json j(l);
CHECK(j.type() == json::value_t::array); CHECK(j.type() == json::value_t::array);
} }
...@@ -908,8 +904,7 @@ TEST_CASE("constructors") ...@@ -908,8 +904,7 @@ TEST_CASE("constructors")
{ {
SECTION("explicit") SECTION("explicit")
{ {
std::initializer_list<json> l = {json(true)}; json j(json::initializer_list_t {json(true)});
json j(l);
CHECK(j.type() == json::value_t::array); CHECK(j.type() == json::value_t::array);
} }
...@@ -924,8 +919,7 @@ TEST_CASE("constructors") ...@@ -924,8 +919,7 @@ TEST_CASE("constructors")
{ {
SECTION("explicit") SECTION("explicit")
{ {
std::initializer_list<json> l = {json(1)}; json j(json::initializer_list_t {json(1)});
json j(l);
CHECK(j.type() == json::value_t::array); CHECK(j.type() == json::value_t::array);
} }
...@@ -940,8 +934,7 @@ TEST_CASE("constructors") ...@@ -940,8 +934,7 @@ TEST_CASE("constructors")
{ {
SECTION("explicit") SECTION("explicit")
{ {
std::initializer_list<json> l = {json(1u)}; json j(json::initializer_list_t {json(1u)});
json j(l);
CHECK(j.type() == json::value_t::array); CHECK(j.type() == json::value_t::array);
} }
...@@ -956,8 +949,7 @@ TEST_CASE("constructors") ...@@ -956,8 +949,7 @@ TEST_CASE("constructors")
{ {
SECTION("explicit") SECTION("explicit")
{ {
std::initializer_list<json> l = {json(42.23)}; json j(json::initializer_list_t {json(42.23)});
json j(l);
CHECK(j.type() == json::value_t::array); CHECK(j.type() == json::value_t::array);
} }
...@@ -973,8 +965,7 @@ TEST_CASE("constructors") ...@@ -973,8 +965,7 @@ TEST_CASE("constructors")
{ {
SECTION("explicit") SECTION("explicit")
{ {
std::initializer_list<json> l = {1, 1u, 42.23, true, nullptr, json::object_t(), json::array_t()}; json j(json::initializer_list_t {1, 1u, 42.23, true, nullptr, json::object_t(), json::array_t()});
json j(l);
CHECK(j.type() == json::value_t::array); CHECK(j.type() == json::value_t::array);
} }
...@@ -1034,6 +1025,125 @@ TEST_CASE("constructors") ...@@ -1034,6 +1025,125 @@ TEST_CASE("constructors")
CHECK(j.type() == json::value_t::array); CHECK(j.type() == json::value_t::array);
} }
} }
SECTION("move from initializer_list")
{
SECTION("string")
{
// This should break through any short string optimization in std::string
std::string source(1024, '!');
const char* source_addr = source.data();
SECTION("constructor with implicit types (array)")
{
json j = {std::move(source)};
CHECK(j[0].get_ref<std::string const&>().data() == source_addr);
}
SECTION("constructor with implicit types (object)")
{
json j = {{"key", std::move(source)}};
CHECK(j["key"].get_ref<std::string const&>().data() == source_addr);
}
SECTION("constructor with implicit types (object key)")
{
json j = {{std::move(source), 42}};
CHECK(j.get_ref<json::object_t&>().begin()->first.data() == source_addr);
}
}
SECTION("array")
{
json::array_t source = {1, 2, 3};
const json* source_addr = source.data();
SECTION("constructor with implicit types (array)")
{
json j {std::move(source)};
CHECK(j[0].get_ref<json::array_t const&>().data() == source_addr);
}
SECTION("constructor with implicit types (object)")
{
json j {{"key", std::move(source)}};
CHECK(j["key"].get_ref<json::array_t const&>().data() == source_addr);
}
SECTION("assignment with implicit types (array)")
{
json j = {std::move(source)};
CHECK(j[0].get_ref<json::array_t const&>().data() == source_addr);
}
SECTION("assignment with implicit types (object)")
{
json j = {{"key", std::move(source)}};
CHECK(j["key"].get_ref<json::array_t const&>().data() == source_addr);
}
}
SECTION("object")
{
json::object_t source = {{"hello", "world"}};
const json* source_addr = &source.at("hello");
SECTION("constructor with implicit types (array)")
{
json j {std::move(source)};
CHECK(&(j[0].get_ref<json::object_t const&>().at("hello")) == source_addr);
}
SECTION("constructor with implicit types (object)")
{
json j {{"key", std::move(source)}};
CHECK(&(j["key"].get_ref<json::object_t const&>().at("hello")) == source_addr);
}
SECTION("assignment with implicit types (array)")
{
json j = {std::move(source)};
CHECK(&(j[0].get_ref<json::object_t const&>().at("hello")) == source_addr);
}
SECTION("assignment with implicit types (object)")
{
json j = {{"key", std::move(source)}};
CHECK(&(j["key"].get_ref<json::object_t const&>().at("hello")) == source_addr);
}
}
SECTION("json")
{
json source {1, 2, 3};
const json* source_addr = &source[0];
SECTION("constructor with implicit types (array)")
{
json j {std::move(source), {}};
CHECK(&j[0][0] == source_addr);
}
SECTION("constructor with implicit types (object)")
{
json j {{"key", std::move(source)}};
CHECK(&j["key"][0] == source_addr);
}
SECTION("assignment with implicit types (array)")
{
json j = {std::move(source), {}};
CHECK(&j[0][0] == source_addr);
}
SECTION("assignment with implicit types (object)")
{
json j = {{"key", std::move(source)}};
CHECK(&j["key"][0] == source_addr);
}
}
}
} }
SECTION("create an array of n copies of a given value") SECTION("create an array of n copies of a given value")
......
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