mirror of
https://github.com/nlohmann/json.git
synced 2026-08-20 08:03:18 +00:00
Fix number fast path for custom string types without assign()
The contiguous number fast path materialized token_buffer with token_buffer.assign(data, len), but string_t is only required to provide the minimal interface the rest of the lexer uses (push_back, append, clear, operator[], ...). Custom string types such as the test's alt_string do not implement assign(), so scan_number_bulk_contiguous() failed to compile for them (unit-alt-string), breaking the gcc/clang standards and old-compiler CI jobs. reset() already clears token_buffer, so fill it with append() - which alt_string and std::string both provide and which the string fast path already relies on - instead of assign(). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AXcDtEma2PjxgmPS9cQGzA Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
195e23a98b
commit
6aec681e9d
@@ -1490,9 +1490,11 @@ scan_number_done:
|
|||||||
const std::size_t len = i;
|
const std::size_t len = i;
|
||||||
|
|
||||||
// materialize the token exactly as scan_number() would, substituting the
|
// materialize the token exactly as scan_number() would, substituting the
|
||||||
// locale decimal point so convert_number()'s strtof fallback stays valid
|
// locale decimal point so convert_number()'s strtof fallback stays valid.
|
||||||
|
// reset() already cleared token_buffer, so append() fills it (assign() is
|
||||||
|
// avoided because custom string_t types need not provide it)
|
||||||
reset();
|
reset();
|
||||||
token_buffer.assign(data, len);
|
token_buffer.append(reinterpret_cast<const typename string_t::value_type*>(data), len);
|
||||||
if (dot_index != std::string::npos)
|
if (dot_index != std::string::npos)
|
||||||
{
|
{
|
||||||
token_buffer[dot_index] = static_cast<typename string_t::value_type>(decimal_point_char);
|
token_buffer[dot_index] = static_cast<typename string_t::value_type>(decimal_point_char);
|
||||||
|
|||||||
@@ -9758,9 +9758,11 @@ scan_number_done:
|
|||||||
const std::size_t len = i;
|
const std::size_t len = i;
|
||||||
|
|
||||||
// materialize the token exactly as scan_number() would, substituting the
|
// materialize the token exactly as scan_number() would, substituting the
|
||||||
// locale decimal point so convert_number()'s strtof fallback stays valid
|
// locale decimal point so convert_number()'s strtof fallback stays valid.
|
||||||
|
// reset() already cleared token_buffer, so append() fills it (assign() is
|
||||||
|
// avoided because custom string_t types need not provide it)
|
||||||
reset();
|
reset();
|
||||||
token_buffer.assign(data, len);
|
token_buffer.append(reinterpret_cast<const typename string_t::value_type*>(data), len);
|
||||||
if (dot_index != std::string::npos)
|
if (dot_index != std::string::npos)
|
||||||
{
|
{
|
||||||
token_buffer[dot_index] = static_cast<typename string_t::value_type>(decimal_point_char);
|
token_buffer[dot_index] = static_cast<typename string_t::value_type>(decimal_point_char);
|
||||||
|
|||||||
Reference in New Issue
Block a user