mirror of
https://github.com/nlohmann/json.git
synced 2026-10-29 00:55:44 +00:00
Fix clang-tidy findings in unit-json_view_from_json.cpp (#5954)
* Fix clang-tidy findings in unit-json_view_from_json.cpp Silence misc-use-internal-linkage on the macro-generated ADL functions, reconcile -Weffc++ with readability-redundant-member-init, use auto for get<T>() initializers, and use value() on the optional access. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Satisfy bugprone-unchecked-optional-access in unit-json_view_from_json.cpp clang-tidy 22 also flags value(); check has_value() in the same expression. Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
1 parent
da83aa92c8
commit
282079ba82
1 file changed
+21
-10
@@ -69,9 +69,12 @@ struct point
|
|||||||
struct shape
|
struct shape
|
||||||
{
|
{
|
||||||
// initialized for GCC -Weffc++
|
// initialized for GCC -Weffc++
|
||||||
|
// NOLINTNEXTLINE(readability-redundant-member-init)
|
||||||
std::string name{};
|
std::string name{};
|
||||||
|
// NOLINTNEXTLINE(readability-redundant-member-init)
|
||||||
std::vector<point> points{};
|
std::vector<point> points{};
|
||||||
point center{};
|
point center{};
|
||||||
|
// NOLINTNEXTLINE(readability-redundant-member-init)
|
||||||
std::map<std::string, point> named{};
|
std::map<std::string, point> named{};
|
||||||
NLOHMANN_DEFINE_TYPE_INTRUSIVE(shape, name, points, center, named)
|
NLOHMANN_DEFINE_TYPE_INTRUSIVE(shape, name, points, center, named)
|
||||||
};
|
};
|
||||||
@@ -82,13 +85,17 @@ struct with_defaults
|
|||||||
std::string b = "default";
|
std::string b = "default";
|
||||||
std::vector<int> c = {1, 2};
|
std::vector<int> c = {1, 2};
|
||||||
};
|
};
|
||||||
|
// NOLINTNEXTLINE(misc-use-internal-linkage): found by ADL, like the from_json() functions of users
|
||||||
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(with_defaults, a, b, c)
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(with_defaults, a, b, c)
|
||||||
|
|
||||||
struct with_names
|
struct with_names
|
||||||
{
|
{
|
||||||
int value = 0;
|
int value = 0;
|
||||||
std::string text{}; // initialized for GCC -Weffc++
|
// initialized for GCC -Weffc++
|
||||||
|
// NOLINTNEXTLINE(readability-redundant-member-init)
|
||||||
|
std::string text{};
|
||||||
};
|
};
|
||||||
|
// NOLINTNEXTLINE(misc-use-internal-linkage): found by ADL, like the from_json() functions of users
|
||||||
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_NAMES(with_names, "Value", value, "Text", text)
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_NAMES(with_names, "Value", value, "Text", text)
|
||||||
|
|
||||||
struct empty
|
struct empty
|
||||||
@@ -102,6 +109,7 @@ enum class color
|
|||||||
green,
|
green,
|
||||||
blue
|
blue
|
||||||
};
|
};
|
||||||
|
// NOLINTNEXTLINE(misc-use-internal-linkage): found by ADL, like the from_json() functions of users
|
||||||
NLOHMANN_JSON_SERIALIZE_ENUM(color,
|
NLOHMANN_JSON_SERIALIZE_ENUM(color,
|
||||||
{
|
{
|
||||||
{color::red, "red"},
|
{color::red, "red"},
|
||||||
@@ -114,6 +122,7 @@ enum class strict_color
|
|||||||
red,
|
red,
|
||||||
green
|
green
|
||||||
};
|
};
|
||||||
|
// NOLINTNEXTLINE(misc-use-internal-linkage): found by ADL, like the from_json() functions of users
|
||||||
NLOHMANN_JSON_SERIALIZE_ENUM_STRICT(strict_color,
|
NLOHMANN_JSON_SERIALIZE_ENUM_STRICT(strict_color,
|
||||||
{
|
{
|
||||||
{strict_color::red, "red"},
|
{strict_color::red, "red"},
|
||||||
@@ -154,6 +163,7 @@ struct derived_from_legacy : legacy_base
|
|||||||
{
|
{
|
||||||
int extra = 0;
|
int extra = 0;
|
||||||
};
|
};
|
||||||
|
// NOLINTNEXTLINE(misc-use-internal-linkage): found by ADL, like the from_json() functions of users
|
||||||
NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE(derived_from_legacy, legacy_base, extra)
|
NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE(derived_from_legacy, legacy_base, extra)
|
||||||
|
|
||||||
// from_json() for json only: converted through materialize()
|
// from_json() for json only: converted through materialize()
|
||||||
@@ -301,18 +311,19 @@ TEST_CASE("json_view from_json")
|
|||||||
CHECK(same<std::string>(v, j, "text"));
|
CHECK(same<std::string>(v, j, "text"));
|
||||||
CHECK(same<std::nullptr_t>(v, j, "nothing"));
|
CHECK(same<std::nullptr_t>(v, j, "nothing"));
|
||||||
CHECK(same<json>(v, j, "object"));
|
CHECK(same<json>(v, j, "object"));
|
||||||
const std::valarray<int> va = v["ints"].get<std::valarray<int>>();
|
const auto va = v["ints"].get<std::valarray<int>>();
|
||||||
CHECK(va.size() == 4);
|
CHECK(va.size() == 4);
|
||||||
CHECK(va[0] == 3);
|
CHECK(va[0] == 3);
|
||||||
int c_array[2][2] = {{0, 0}, {0, 0}}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays): the conversion to C arrays
|
int c_array[2][2] = {{0, 0}, {0, 0}}; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays): the conversion to C arrays
|
||||||
v["nested"][0].get_to(c_array[0]);
|
v["nested"][0].get_to(c_array[0]);
|
||||||
CHECK(c_array[0][1] == 2);
|
CHECK(c_array[0][1] == 2);
|
||||||
#ifdef JSON_HAS_CPP_17
|
#ifdef JSON_HAS_CPP_17
|
||||||
CHECK(v["points"][0].get<std::optional<point>>()->y == 2);
|
const auto first = v["points"][0].get<std::optional<point>>();
|
||||||
|
CHECK((first.has_value() && first->y == 2));
|
||||||
CHECK(!v["nothing"].get<std::optional<point>>().has_value());
|
CHECK(!v["nothing"].get<std::optional<point>>().has_value());
|
||||||
#endif
|
#endif
|
||||||
// containers of views keep views of the elements
|
// containers of views keep views of the elements
|
||||||
const std::vector<json_view> views = v["points"].get<std::vector<json_view>>();
|
const auto views = v["points"].get<std::vector<json_view>>();
|
||||||
CHECK(views.size() == 2);
|
CHECK(views.size() == 2);
|
||||||
CHECK(views[1]["x"].get<int>() == 3);
|
CHECK(views[1]["x"].get<int>() == 3);
|
||||||
CHECK(v["object"].get<std::map<std::string, json_view>>().at("a").get<int>() == 2);
|
CHECK(v["object"].get<std::map<std::string, json_view>>().at("a").get<int>() == 2);
|
||||||
@@ -352,7 +363,7 @@ TEST_CASE("json_view from_json")
|
|||||||
{
|
{
|
||||||
const json_document d = json_document::parse(R"({"name": "s", "points": [{"x": 1, "y": 2}, {"x": 3, "y": 4}],
|
const json_document d = json_document::parse(R"({"name": "s", "points": [{"x": 1, "y": 2}, {"x": 3, "y": 4}],
|
||||||
"center": {"x": 5, "y": 6}, "named": {"a": {"x": 7, "y": 8}}})");
|
"center": {"x": 5, "y": 6}, "named": {"a": {"x": 7, "y": 8}}})");
|
||||||
const shape s = d.root().get<shape>();
|
const auto s = d.root().get<shape>();
|
||||||
CHECK(s.name == "s");
|
CHECK(s.name == "s");
|
||||||
CHECK(s.points.size() == 2);
|
CHECK(s.points.size() == 2);
|
||||||
CHECK(s.points[1].y == 4);
|
CHECK(s.points[1].y == 4);
|
||||||
@@ -370,13 +381,13 @@ TEST_CASE("json_view from_json")
|
|||||||
SECTION("defaults and names")
|
SECTION("defaults and names")
|
||||||
{
|
{
|
||||||
const json_document d = json_document::parse(R"({"a": 5, "Value": 3, "Text": "t"})");
|
const json_document d = json_document::parse(R"({"a": 5, "Value": 3, "Text": "t"})");
|
||||||
const with_defaults w = d.root().get<with_defaults>();
|
const auto w = d.root().get<with_defaults>();
|
||||||
CHECK(w.a == 5);
|
CHECK(w.a == 5);
|
||||||
CHECK(w.b == "default");
|
CHECK(w.b == "default");
|
||||||
CHECK(w.c == std::vector<int> {1, 2});
|
CHECK(w.c == std::vector<int> {1, 2});
|
||||||
const json_document null_document = json_document::parse("null");
|
const json_document null_document = json_document::parse("null");
|
||||||
CHECK(null_document.root().get<with_defaults>().a == 1);
|
CHECK(null_document.root().get<with_defaults>().a == 1);
|
||||||
const with_names n = d.root().get<with_names>();
|
const auto n = d.root().get<with_names>();
|
||||||
CHECK(n.value == 3);
|
CHECK(n.value == 3);
|
||||||
CHECK(n.text == "t");
|
CHECK(n.text == "t");
|
||||||
}
|
}
|
||||||
@@ -401,13 +412,13 @@ TEST_CASE("json_view from_json")
|
|||||||
SECTION("derived types")
|
SECTION("derived types")
|
||||||
{
|
{
|
||||||
const json_document d = json_document::parse(R"({"id": 7, "c": "green", "extra": 3})");
|
const json_document d = json_document::parse(R"({"id": 7, "c": "green", "extra": 3})");
|
||||||
const derived x = d.root().get<derived>();
|
const auto x = d.root().get<derived>();
|
||||||
CHECK(x.id == 7);
|
CHECK(x.id == 7);
|
||||||
CHECK(x.c == color::green);
|
CHECK(x.c == color::green);
|
||||||
const derived_with_defaults y = d.root().get<derived_with_defaults>();
|
const auto y = d.root().get<derived_with_defaults>();
|
||||||
CHECK(y.id == 7);
|
CHECK(y.id == 7);
|
||||||
CHECK(y.label == "none");
|
CHECK(y.label == "none");
|
||||||
const derived_from_legacy z = d.root().get<derived_from_legacy>();
|
const auto z = d.root().get<derived_from_legacy>();
|
||||||
CHECK(z.id == 7);
|
CHECK(z.id == 7);
|
||||||
CHECK(z.extra == 3);
|
CHECK(z.extra == 3);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user