Unverified Commit e7260f07 authored by Niels Lohmann's avatar Niels Lohmann

Merge branch 'develop' of https://github.com/nlohmann/json into issue2824

parents 8676f674 a5440329
cff-version: 1.1.0
message: "If you use this software, please cite it as below."
authors:
- family-names: Lohmann
given-names: Niels
orcid: https://orcid.org/0000-0001-9037-795X
email: mail@nlohmann.me
website: https://nlohmann.me
title: "JSON for Modern C++"
version: 3.9.1
date-released: 2021
license: MIT
repository-code: "https://github.com/nlohmann"
url: https://json.nlohmann.me
...@@ -356,7 +356,7 @@ set(GCC_CXXFLAGS "-std=c++11 \ ...@@ -356,7 +356,7 @@ set(GCC_CXXFLAGS "-std=c++11 \
-Wunused-result \ -Wunused-result \
-Wunused-value \ -Wunused-value \
-Wunused-variable \ -Wunused-variable \
-Wno-useless-cast \ -Wuseless-cast \
-Wvarargs \ -Wvarargs \
-Wvariadic-macros \ -Wvariadic-macros \
-Wvector-operation-performance \ -Wvector-operation-performance \
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <nlohmann/detail/input/lexer.hpp> #include <nlohmann/detail/input/lexer.hpp>
#include <nlohmann/detail/macro_scope.hpp> #include <nlohmann/detail/macro_scope.hpp>
#include <nlohmann/detail/meta/is_sax.hpp> #include <nlohmann/detail/meta/is_sax.hpp>
#include <nlohmann/detail/meta/type_traits.hpp>
#include <nlohmann/detail/value_t.hpp> #include <nlohmann/detail/value_t.hpp>
namespace nlohmann namespace nlohmann
...@@ -631,7 +632,7 @@ class binary_reader ...@@ -631,7 +632,7 @@ class binary_reader
case 0x9B: // array (eight-byte uint64_t for n follow) case 0x9B: // array (eight-byte uint64_t for n follow)
{ {
std::uint64_t len{}; std::uint64_t len{};
return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler); return get_number(input_format_t::cbor, len) && get_cbor_array(detail::conditional_static_cast<std::size_t>(len), tag_handler);
} }
case 0x9F: // array (indefinite length) case 0x9F: // array (indefinite length)
...@@ -685,7 +686,7 @@ class binary_reader ...@@ -685,7 +686,7 @@ class binary_reader
case 0xBB: // map (eight-byte uint64_t for n follow) case 0xBB: // map (eight-byte uint64_t for n follow)
{ {
std::uint64_t len{}; std::uint64_t len{};
return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler); return get_number(input_format_t::cbor, len) && get_cbor_object(detail::conditional_static_cast<std::size_t>(len), tag_handler);
} }
case 0xBF: // map (indefinite length) case 0xBF: // map (indefinite length)
......
...@@ -435,5 +435,19 @@ struct is_constructible_tuple : std::false_type {}; ...@@ -435,5 +435,19 @@ struct is_constructible_tuple : std::false_type {};
template<typename T1, typename... Args> template<typename T1, typename... Args>
struct is_constructible_tuple<T1, std::tuple<Args...>> : conjunction<is_constructible<T1, Args>...> {}; struct is_constructible_tuple<T1, std::tuple<Args...>> : conjunction<is_constructible<T1, Args>...> {};
// to avoid useless casts (see https://github.com/nlohmann/json/issues/2893#issuecomment-889152324)
template < typename T, typename U, enable_if_t < !std::is_same<T, U>::value, int > = 0 >
T conditional_static_cast(U value)
{
return static_cast<T>(value);
}
template<typename T, typename U, enable_if_t<std::is_same<T, U>::value, int> = 0>
T conditional_static_cast(U value)
{
return value;
}
} // namespace detail } // namespace detail
} // namespace nlohmann } // namespace nlohmann
...@@ -3835,6 +3835,20 @@ struct is_constructible_tuple : std::false_type {}; ...@@ -3835,6 +3835,20 @@ struct is_constructible_tuple : std::false_type {};
template<typename T1, typename... Args> template<typename T1, typename... Args>
struct is_constructible_tuple<T1, std::tuple<Args...>> : conjunction<is_constructible<T1, Args>...> {}; struct is_constructible_tuple<T1, std::tuple<Args...>> : conjunction<is_constructible<T1, Args>...> {};
// to avoid useless casts (see https://github.com/nlohmann/json/issues/2893#issuecomment-889152324)
template < typename T, typename U, enable_if_t < !std::is_same<T, U>::value, int > = 0 >
T conditional_static_cast(U value)
{
return static_cast<T>(value);
}
template<typename T, typename U, enable_if_t<std::is_same<T, U>::value, int> = 0>
T conditional_static_cast(U value)
{
return value;
}
} // namespace detail } // namespace detail
} // namespace nlohmann } // namespace nlohmann
...@@ -8240,6 +8254,8 @@ struct is_sax_static_asserts ...@@ -8240,6 +8254,8 @@ struct is_sax_static_asserts
} // namespace detail } // namespace detail
} // namespace nlohmann } // namespace nlohmann
// #include <nlohmann/detail/meta/type_traits.hpp>
// #include <nlohmann/detail/value_t.hpp> // #include <nlohmann/detail/value_t.hpp>
...@@ -8853,7 +8869,7 @@ class binary_reader ...@@ -8853,7 +8869,7 @@ class binary_reader
case 0x9B: // array (eight-byte uint64_t for n follow) case 0x9B: // array (eight-byte uint64_t for n follow)
{ {
std::uint64_t len{}; std::uint64_t len{};
return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler); return get_number(input_format_t::cbor, len) && get_cbor_array(detail::conditional_static_cast<std::size_t>(len), tag_handler);
} }
case 0x9F: // array (indefinite length) case 0x9F: // array (indefinite length)
...@@ -8907,7 +8923,7 @@ class binary_reader ...@@ -8907,7 +8923,7 @@ class binary_reader
case 0xBB: // map (eight-byte uint64_t for n follow) case 0xBB: // map (eight-byte uint64_t for n follow)
{ {
std::uint64_t len{}; std::uint64_t len{};
return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler); return get_number(input_format_t::cbor, len) && get_cbor_object(detail::conditional_static_cast<std::size_t>(len), tag_handler);
} }
case 0xBF: // map (indefinite length) case 0xBF: // map (indefinite length)
......
...@@ -1381,7 +1381,7 @@ TEST_CASE("parser class") ...@@ -1381,7 +1381,7 @@ TEST_CASE("parser class")
case ('r'): case ('r'):
case ('t'): case ('t'):
{ {
CHECK(json::parser(nlohmann::detail::input_adapter(std::string(s))).accept()); CHECK(json::parser(nlohmann::detail::input_adapter(s)).accept());
break; break;
} }
...@@ -1394,7 +1394,7 @@ TEST_CASE("parser class") ...@@ -1394,7 +1394,7 @@ TEST_CASE("parser class")
// any other combination of backslash and character is invalid // any other combination of backslash and character is invalid
default: default:
{ {
CHECK(json::parser(nlohmann::detail::input_adapter(std::string(s))).accept() == false); CHECK(json::parser(nlohmann::detail::input_adapter(s)).accept() == false);
break; break;
} }
} }
...@@ -1445,35 +1445,35 @@ TEST_CASE("parser class") ...@@ -1445,35 +1445,35 @@ TEST_CASE("parser class")
std::string s = "\"\\u"; std::string s = "\"\\u";
// create a string with the iterated character at each position // create a string with the iterated character at each position
auto s1 = s + "000" + std::string(1, static_cast<char>(c)) + "\""; const auto s1 = s + "000" + std::string(1, static_cast<char>(c)) + "\"";
auto s2 = s + "00" + std::string(1, static_cast<char>(c)) + "0\""; const auto s2 = s + "00" + std::string(1, static_cast<char>(c)) + "0\"";
auto s3 = s + "0" + std::string(1, static_cast<char>(c)) + "00\""; const auto s3 = s + "0" + std::string(1, static_cast<char>(c)) + "00\"";
auto s4 = s + std::string(1, static_cast<char>(c)) + "000\""; const auto s4 = s + std::string(1, static_cast<char>(c)) + "000\"";
if (valid(c)) if (valid(c))
{ {
CAPTURE(s1) CAPTURE(s1)
CHECK(json::parser(nlohmann::detail::input_adapter(std::string(s1))).accept()); CHECK(json::parser(nlohmann::detail::input_adapter(s1)).accept());
CAPTURE(s2) CAPTURE(s2)
CHECK(json::parser(nlohmann::detail::input_adapter(std::string(s2))).accept()); CHECK(json::parser(nlohmann::detail::input_adapter(s2)).accept());
CAPTURE(s3) CAPTURE(s3)
CHECK(json::parser(nlohmann::detail::input_adapter(std::string(s3))).accept()); CHECK(json::parser(nlohmann::detail::input_adapter(s3)).accept());
CAPTURE(s4) CAPTURE(s4)
CHECK(json::parser(nlohmann::detail::input_adapter(std::string(s4))).accept()); CHECK(json::parser(nlohmann::detail::input_adapter(s4)).accept());
} }
else else
{ {
CAPTURE(s1) CAPTURE(s1)
CHECK(json::parser(nlohmann::detail::input_adapter(std::string(s1))).accept() == false); CHECK(json::parser(nlohmann::detail::input_adapter(s1)).accept() == false);
CAPTURE(s2) CAPTURE(s2)
CHECK(json::parser(nlohmann::detail::input_adapter(std::string(s2))).accept() == false); CHECK(json::parser(nlohmann::detail::input_adapter(s2)).accept() == false);
CAPTURE(s3) CAPTURE(s3)
CHECK(json::parser(nlohmann::detail::input_adapter(std::string(s3))).accept() == false); CHECK(json::parser(nlohmann::detail::input_adapter(s3)).accept() == false);
CAPTURE(s4) CAPTURE(s4)
CHECK(json::parser(nlohmann::detail::input_adapter(std::string(s4))).accept() == false); CHECK(json::parser(nlohmann::detail::input_adapter(s4)).accept() == false);
} }
} }
} }
......
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