diff --git a/include/nlohmann/detail/iterators/iter_impl.hpp b/include/nlohmann/detail/iterators/iter_impl.hpp index 84a850356..1d46168ab 100644 --- a/include/nlohmann/detail/iterators/iter_impl.hpp +++ b/include/nlohmann/detail/iterators/iter_impl.hpp @@ -107,20 +107,8 @@ class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-speci explicit iter_impl(pointer object) noexcept : m_object(object) { JSON_ASSERT(m_object != nullptr); - - if (m_object->is_object()) - { - m_it.object_iterator = typename object_t::iterator(); - } - else if (m_object->is_array()) - { - m_it.array_iterator = typename array_t::iterator(); - } - else - { - // primitive (is_primitive(), including discarded) - m_it.primitive_iterator = primitive_iterator_t(); - } + // m_it is value-initialized: its iterators are singular, and the + // primitive iterator is in its "uninitialized" state } /*! diff --git a/include/nlohmann/detail/output/serializer.hpp b/include/nlohmann/detail/output/serializer.hpp index fc8e2b384..0c004c491 100644 --- a/include/nlohmann/detail/output/serializer.hpp +++ b/include/nlohmann/detail/output/serializer.hpp @@ -1113,21 +1113,14 @@ class serializer { // the code point is at least 0x60 (smaller ones are handled // above) and is not printable ASCII (which the scanner - // copies): it is DEL (0x7F) under EnsureAscii or a non-ASCII - // character + // copies). Under EnsureAscii it is DEL (0x7F): every + // well-formed multi-byte character is escaped by + // write_u_escapes() above, so decode() only ever accepts a + // single byte here, and nothing of it was buffered if (EnsureAscii) { JSON_ASSERT(codepoint == 0x7F); - if (error_handler == error_handler_t::keep) - { - // this character was buffered as raw bytes below - // in case it turned out to be part of an - // ill-formed sequence (which is kept as is); now - // that it decoded to a well-formed code point, - // undo that and \u-escape it like any other - // character instead - bytes = bytes_after_last_accept; - } + JSON_ASSERT(bytes == bytes_after_last_accept); write_u_escape(bytes, static_cast(codepoint)); } else diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index eb3544234..f3c2e9859 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -1576,7 +1576,7 @@ public: auto src_it = src_object.cbegin(); for (auto& element : *dst.m_data.m_value.object) { - if (JSON_HEDLEY_LIKELY(src_it != src_object.cend() && copy_keys_equal(src_it->first, element.first))) + if (JSON_HEDLEY_LIKELY(copy_keys_equal(src_it->first, element.first))) { copy_shallow(src_it->second, element.second, worklist); ++src_it; @@ -5404,8 +5404,15 @@ public: return (*lhs.m_data.m_value.object) op (*rhs.m_data.m_value.object); \ } \ \ - JSON_IMPLEMENT_SCALAR_CASES(op, null_result) \ - \ + /* same-type scalars never get here: the inline fast path of the operator handles them */ \ + case value_t::null: \ + case value_t::boolean: \ + case value_t::number_integer: \ + case value_t::number_unsigned: \ + case value_t::number_float: \ + JSON_ASSERT(false); /* NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) */ \ + return (unordered_result); \ + \ case value_t::string: \ return (*lhs.m_data.m_value.string) op (*rhs.m_data.m_value.string); \ \ @@ -5445,7 +5452,7 @@ public: ? (number_integer_t(-1) op number_integer_t(1)) \ : (static_cast(lhs.m_data.m_value.number_integer) op rhs.m_data.m_value.number_unsigned); \ } \ - else if(compares_unordered(lhs, rhs))\ + else if(lhs_type == value_t::discarded || rhs_type == value_t::discarded)\ {\ return (unordered_result);\ }\ diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 7e8cebab4..d743ecf31 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -24063,20 +24063,8 @@ class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-speci explicit iter_impl(pointer object) noexcept : m_object(object) { JSON_ASSERT(m_object != nullptr); - - if (m_object->is_object()) - { - m_it.object_iterator = typename object_t::iterator(); - } - else if (m_object->is_array()) - { - m_it.array_iterator = typename array_t::iterator(); - } - else - { - // primitive (is_primitive(), including discarded) - m_it.primitive_iterator = primitive_iterator_t(); - } + // m_it is value-initialized: its iterators are singular, and the + // primitive iterator is in its "uninitialized" state } /*! @@ -36267,21 +36255,14 @@ class serializer { // the code point is at least 0x60 (smaller ones are handled // above) and is not printable ASCII (which the scanner - // copies): it is DEL (0x7F) under EnsureAscii or a non-ASCII - // character + // copies). Under EnsureAscii it is DEL (0x7F): every + // well-formed multi-byte character is escaped by + // write_u_escapes() above, so decode() only ever accepts a + // single byte here, and nothing of it was buffered if (EnsureAscii) { JSON_ASSERT(codepoint == 0x7F); - if (error_handler == error_handler_t::keep) - { - // this character was buffered as raw bytes below - // in case it turned out to be part of an - // ill-formed sequence (which is kept as is); now - // that it decoded to a well-formed code point, - // undo that and \u-escape it like any other - // character instead - bytes = bytes_after_last_accept; - } + JSON_ASSERT(bytes == bytes_after_last_accept); write_u_escape(bytes, static_cast(codepoint)); } else @@ -39305,7 +39286,7 @@ public: auto src_it = src_object.cbegin(); for (auto& element : *dst.m_data.m_value.object) { - if (JSON_HEDLEY_LIKELY(src_it != src_object.cend() && copy_keys_equal(src_it->first, element.first))) + if (JSON_HEDLEY_LIKELY(copy_keys_equal(src_it->first, element.first))) { copy_shallow(src_it->second, element.second, worklist); ++src_it; @@ -43133,8 +43114,15 @@ public: return (*lhs.m_data.m_value.object) op (*rhs.m_data.m_value.object); \ } \ \ - JSON_IMPLEMENT_SCALAR_CASES(op, null_result) \ - \ + /* same-type scalars never get here: the inline fast path of the operator handles them */ \ + case value_t::null: \ + case value_t::boolean: \ + case value_t::number_integer: \ + case value_t::number_unsigned: \ + case value_t::number_float: \ + JSON_ASSERT(false); /* NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) */ \ + return (unordered_result); \ + \ case value_t::string: \ return (*lhs.m_data.m_value.string) op (*rhs.m_data.m_value.string); \ \ @@ -43174,7 +43162,7 @@ public: ? (number_integer_t(-1) op number_integer_t(1)) \ : (static_cast(lhs.m_data.m_value.number_integer) op rhs.m_data.m_value.number_unsigned); \ } \ - else if(compares_unordered(lhs, rhs))\ + else if(lhs_type == value_t::discarded || rhs_type == value_t::discarded)\ {\ return (unordered_result);\ }\