Skip to content

Commit 5627456

Browse files
committed
Use c4 (part of ryml) to parse doubles and ints
1 parent de3fb0d commit 5627456

File tree

1 file changed

+20
-16
lines changed

1 file changed

+20
-16
lines changed

src/core/io/src/4C_io_value_parser.cpp

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
#include "4C_io_value_parser.hpp"
99

10+
#include <c4/charconv.hpp>
11+
1012
#include <algorithm>
1113

1214
FOUR_C_NAMESPACE_OPEN
@@ -74,34 +76,36 @@ void Core::IO::ValueParser::read_internal(bool& value)
7476

7577
void Core::IO::ValueParser::read_internal(int& value)
7678
{
77-
std::string token(advance_token());
78-
std::size_t end;
79-
try
79+
auto token(advance_token());
80+
if (token.front() == '+') [[unlikely]]
8081
{
81-
value = std::stoi(token.data(), &end);
82+
token = token.substr(1);
8283
}
83-
catch (const std::logic_error&)
84+
85+
c4::csubstr token_cstr = c4::csubstr{token.data(), token.size()};
86+
// Note: this could use std::from_chars if clang fully supports it at some point.
87+
std::size_t n_chars_used = c4::from_chars_first(token_cstr, &value);
88+
if (n_chars_used != token.size())
8489
{
85-
FOUR_C_THROW("Could not parse '{}' as an integer value.", token.c_str());
90+
FOUR_C_THROW("Could not parse '{}' as an integer value.", token);
8691
}
87-
88-
if (end != token.size()) FOUR_C_THROW("Could not parse '{}' as an integer value.", token.c_str());
8992
}
9093

9194
void Core::IO::ValueParser::read_internal(double& value)
9295
{
93-
std::string token(advance_token());
94-
std::size_t end;
95-
try
96+
auto token(advance_token());
97+
if (token.front() == '+') [[unlikely]]
9698
{
97-
value = std::stod(token.data(), &end);
99+
token = token.substr(1);
98100
}
99-
catch (const std::logic_error&)
101+
102+
c4::csubstr token_cstr = c4::csubstr{token.data(), token.size()};
103+
// Note: this could use std::from_chars if clang fully supports it at some point.
104+
std::size_t n_chars_used = c4::from_chars_first(token_cstr, &value);
105+
if (n_chars_used != token.size())
100106
{
101-
FOUR_C_THROW("Could not parse '{}' as a double value.", token.c_str());
107+
FOUR_C_THROW("Could not parse '{}' as a double value.", token);
102108
}
103-
104-
if (end != token.size()) FOUR_C_THROW("Could not parse '{}' as a double value.", token.c_str());
105109
}
106110

107111
void Core::IO::ValueParser::read_internal(std::string& value)

0 commit comments

Comments
 (0)