From b12e7f7edd889180d9de2277bc3d826195fad66f Mon Sep 17 00:00:00 2001 From: Jiaming Yuan Date: Tue, 7 Sep 2021 13:56:48 +0800 Subject: [PATCH] Add noexcept to JSON objects. (#7205) --- include/xgboost/json.h | 16 ++++++++-------- src/common/json.cc | 13 +++++++++---- tests/cpp/common/test_json.cc | 1 + 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/include/xgboost/json.h b/include/xgboost/json.h index bec8927b3583..ab6ba6ee1018 100644 --- a/include/xgboost/json.h +++ b/include/xgboost/json.h @@ -82,7 +82,7 @@ class JsonString : public Value { JsonString() : Value(ValueKind::kString) {} JsonString(std::string const& str) : // NOLINT Value(ValueKind::kString), str_{str} {} - JsonString(std::string&& str) : // NOLINT + JsonString(std::string&& str) noexcept : // NOLINT Value(ValueKind::kString), str_{std::move(str)} {} JsonString(JsonString&& str) noexcept : // NOLINT Value(ValueKind::kString), str_{std::move(str.str_)} {} @@ -109,12 +109,12 @@ class JsonArray : public Value { public: JsonArray() : Value(ValueKind::kArray) {} - JsonArray(std::vector&& arr) : // NOLINT + JsonArray(std::vector&& arr) noexcept : // NOLINT Value(ValueKind::kArray), vec_{std::move(arr)} {} JsonArray(std::vector const& arr) : // NOLINT Value(ValueKind::kArray), vec_{arr} {} JsonArray(JsonArray const& that) = delete; - JsonArray(JsonArray && that); + JsonArray(JsonArray && that) noexcept; void Save(JsonWriter* writer) override; @@ -138,9 +138,9 @@ class JsonObject : public Value { public: JsonObject() : Value(ValueKind::kObject) {} - JsonObject(std::map&& object); // NOLINT + JsonObject(std::map&& object) noexcept; // NOLINT JsonObject(JsonObject const& that) = delete; - JsonObject(JsonObject && that); + JsonObject(JsonObject && that) noexcept; void Save(JsonWriter* writer) override; @@ -419,9 +419,9 @@ class Json { Json(Json const& other) = default; Json& operator=(Json const& other); // move - Json(Json&& other) : ptr_{std::move(other.ptr_)} {} - Json& operator=(Json&& other) { - ptr_ = std::move(other.ptr_); + Json(Json &&other) noexcept { std::swap(this->ptr_, other.ptr_); } + Json &operator=(Json &&other) noexcept { + std::swap(this->ptr_, other.ptr_); return *this; } diff --git a/src/common/json.cc b/src/common/json.cc index 18dc1c71ce20..8d6e8fc2f219 100644 --- a/src/common/json.cc +++ b/src/common/json.cc @@ -169,10 +169,10 @@ Json& DummyJsonObject() { } // Json Object -JsonObject::JsonObject(JsonObject && that) : +JsonObject::JsonObject(JsonObject && that) noexcept : Value(ValueKind::kObject), object_{std::move(that.object_)} {} -JsonObject::JsonObject(std::map&& object) +JsonObject::JsonObject(std::map &&object) noexcept : Value(ValueKind::kObject), object_{std::move(object)} {} Json& JsonObject::operator[](std::string const & key) { @@ -233,7 +233,7 @@ void JsonString::Save(JsonWriter* writer) { } // Json Array -JsonArray::JsonArray(JsonArray && that) : +JsonArray::JsonArray(JsonArray && that) noexcept : Value(ValueKind::kArray), vec_{std::move(that.vec_)} {} Json& JsonArray::operator[](std::string const& ) { @@ -406,7 +406,7 @@ Json JsonReader::Parse() { Error("Unknown construct"); } } - return Json(); + return {}; } Json JsonReader::Load() { @@ -751,4 +751,9 @@ std::ostream &operator<<(std::ostream &os, StringView const v) { } return os; } + +static_assert(std::is_nothrow_move_constructible::value, ""); +static_assert(std::is_nothrow_move_constructible::value, ""); +static_assert(std::is_nothrow_move_constructible::value, ""); +static_assert(std::is_nothrow_move_constructible::value, ""); } // namespace xgboost diff --git a/tests/cpp/common/test_json.cc b/tests/cpp/common/test_json.cc index 1cf0bbece343..d220e0444669 100644 --- a/tests/cpp/common/test_json.cc +++ b/tests/cpp/common/test_json.cc @@ -332,6 +332,7 @@ TEST(Json, AssigningObjects) { auto str = JsonString("1"); auto& k = json_object["1"]; k = std::move(str); + ASSERT_TRUE(str.GetString().empty()); // NOLINT auto& m = json_object["1"]; std::string value = get(m); ASSERT_EQ(value, "1");