Restart the token string of token-tracking adapters after an error
Since #5828, a stream adapter keeps the current token itself (mark_token_start() / copy_token()), so lazy_token_string no longer implies a seekable adapter. restart_token_string_impl(std::true_type) still called get_consumed_count(), which only seekable adapters have, and failed to compile for std::istream input. Dispatch on adapter_token as note_token_start() does. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
2 files changed
+42
-2
No files matched your search
@@ -3054,13 +3054,33 @@ scan_number_done:
|
||||
return result;
|
||||
}
|
||||
|
||||
/// seekable or token-tracking adapter: the token string begins at current
|
||||
void restart_token_string_impl(std::true_type /*lazy*/)
|
||||
{
|
||||
restart_token_string_lazy(std::integral_constant<bool, adapter_token> {});
|
||||
}
|
||||
|
||||
/// seekable adapter: the token string begins at current, which was consumed
|
||||
void restart_token_string_impl(std::true_type /*lazy*/) noexcept
|
||||
void restart_token_string_lazy(std::false_type /*adapter_token*/) noexcept
|
||||
{
|
||||
const std::size_t consumed = ia.get_consumed_count();
|
||||
token_string_start = (consumed > 0 && current != char_traits<char_type>::eof()) ? consumed - 1 : consumed;
|
||||
}
|
||||
|
||||
/// token-tracking adapter: the token begins with current, or with the next
|
||||
/// character if current was put back or is the end of input
|
||||
void restart_token_string_lazy(std::true_type /*adapter_token*/)
|
||||
{
|
||||
if (!next_unget && current != char_traits<char_type>::eof())
|
||||
{
|
||||
ia.mark_token_start(current);
|
||||
}
|
||||
else
|
||||
{
|
||||
ia.begin_token();
|
||||
}
|
||||
}
|
||||
|
||||
/// streaming adapter: the token string begins at current; a character
|
||||
/// that was put back is copied again when it is read again
|
||||
void restart_token_string_impl(std::false_type /*lazy*/)
|
||||
|
||||
Generated
+21
-1
@@ -14656,13 +14656,33 @@ scan_number_done:
|
||||
return result;
|
||||
}
|
||||
|
||||
/// seekable or token-tracking adapter: the token string begins at current
|
||||
void restart_token_string_impl(std::true_type /*lazy*/)
|
||||
{
|
||||
restart_token_string_lazy(std::integral_constant<bool, adapter_token> {});
|
||||
}
|
||||
|
||||
/// seekable adapter: the token string begins at current, which was consumed
|
||||
void restart_token_string_impl(std::true_type /*lazy*/) noexcept
|
||||
void restart_token_string_lazy(std::false_type /*adapter_token*/) noexcept
|
||||
{
|
||||
const std::size_t consumed = ia.get_consumed_count();
|
||||
token_string_start = (consumed > 0 && current != char_traits<char_type>::eof()) ? consumed - 1 : consumed;
|
||||
}
|
||||
|
||||
/// token-tracking adapter: the token begins with current, or with the next
|
||||
/// character if current was put back or is the end of input
|
||||
void restart_token_string_lazy(std::true_type /*adapter_token*/)
|
||||
{
|
||||
if (!next_unget && current != char_traits<char_type>::eof())
|
||||
{
|
||||
ia.mark_token_start(current);
|
||||
}
|
||||
else
|
||||
{
|
||||
ia.begin_token();
|
||||
}
|
||||
}
|
||||
|
||||
/// streaming adapter: the token string begins at current; a character
|
||||
/// that was put back is copied again when it is read again
|
||||
void restart_token_string_impl(std::false_type /*lazy*/)
|
||||
|
||||
Reference in new issue
Block a user