mirror of
https://github.com/nlohmann/json.git
synced 2026-10-10 16:37:14 +00:00
Pass keys with data() and size() unchanged into the at() miss message
key_for_message() converted every key that string_t can be constructed from, so a miss on a string_t or string_view key copied it before concat() copied it again. Keys that concat() can append through data() and size() are now passed through; only other keys (string literals, key types that just convert to string_t) are converted. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
2 files changed
+22
-20
No files matched your search
+11
-10
@@ -3354,21 +3354,22 @@ public:
|
||||
}
|
||||
|
||||
/// @brief key as it is passed to detail::concat for an error message
|
||||
/// @note string_t is used where it can be constructed from the key; other
|
||||
/// key types are passed through unchanged, as concat only needs
|
||||
/// data() and size() of them
|
||||
template<typename KeyType, detail::enable_if_t<std::is_constructible<string_t, const KeyType&>::value, int> = 0>
|
||||
static string_t key_for_message(const KeyType& key)
|
||||
{
|
||||
return string_t(key);
|
||||
}
|
||||
|
||||
template < typename KeyType, detail::enable_if_t < !std::is_constructible<string_t, const KeyType&>::value, int > = 0 >
|
||||
/// @note keys with data() and size() (such as string_t itself or a string
|
||||
/// view) are passed through unchanged, so a miss does not copy them;
|
||||
/// other keys (such as string literals or key types that only convert
|
||||
/// to string_t) are converted to string_t
|
||||
template < typename KeyType, detail::enable_if_t < detail::detect_string_can_append_data<string_t, KeyType>::value, int > = 0 >
|
||||
static const KeyType & key_for_message(const KeyType& key)
|
||||
{
|
||||
return key; // NOLINT(bugprone-return-const-ref-from-parameter): the result is only passed to concat() within the full-expression that holds key
|
||||
}
|
||||
|
||||
template < typename KeyType, detail::enable_if_t < !detail::detect_string_can_append_data<string_t, KeyType>::value, int > = 0 >
|
||||
static string_t key_for_message(const KeyType& key)
|
||||
{
|
||||
return string_t(key);
|
||||
}
|
||||
|
||||
/// @brief checked array element access used by the at() overloads taking an index
|
||||
/// @throw type_error.304 if @a j is not an array
|
||||
/// @throw out_of_range.401 if @a idx is out of range
|
||||
|
||||
Reference in new issue
Block a user