Skip to content

Commit

Permalink
Adding backward compatibility for string-to-double conversion (#1284)
Browse files Browse the repository at this point in the history
---------

Co-authored-by: Sai Kishor Kothakota <saisastra3@gmail.com>
Co-authored-by: Dr. Denis <denis@stoglrobotics.de>
  • Loading branch information
3 people authored Jan 12, 2024
1 parent f0c3642 commit 477c85d
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#define HARDWARE_INTERFACE__LEXICAL_CASTS_HPP_

#include <locale>
#include <optional>
#include <sstream>
#include <stdexcept>
#include <string>
Expand Down
28 changes: 25 additions & 3 deletions hardware_interface/src/lexical_casts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,42 @@

namespace hardware_interface
{
double stod(const std::string & s)
namespace impl
{
std::optional<double> stod(const std::string & s)
{
#if __cplusplus < 202002L
// convert from string using no locale
// Impl with std::istringstream
std::istringstream stream(s);
stream.imbue(std::locale::classic());
double result;
stream >> result;
if (stream.fail() || !stream.eof())
{
throw std::invalid_argument("Failed converting string to real number");
return std::nullopt;
}
return result;
#else
// Impl with std::from_chars
double result_value;
const auto parse_result = std::from_chars(s.data(), s.data() + s.size(), result_value);
if (parse_result.ec == std::errc())
{
return result_value;
}
return std::nullopt;
#endif
}
} // namespace impl
double stod(const std::string & s)
{
if (const auto result = impl::stod(s))
{
return *result;
}
throw std::invalid_argument("Failed converting string to real number");
}

bool parse_bool(const std::string & bool_string)
{
return bool_string == "true" || bool_string == "True";
Expand Down

0 comments on commit 477c85d

Please sign in to comment.