2
0
mirror of https://github.com/boostorg/math.git synced 2026-01-24 06:02:08 +00:00

Use charconv in convert_from_string for arithmetic types

This commit is contained in:
Matt Borland
2023-05-16 15:40:01 +02:00
parent 0c1920b7fb
commit a0360d8f6d

View File

@@ -1,4 +1,5 @@
// Copyright John Maddock 2016.
// Copyright Matt Borland 2023.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -10,6 +11,7 @@
#pragma once
#endif
#include <boost/math/tools/config.hpp>
#include <type_traits>
#ifndef BOOST_MATH_STANDALONE
#include <boost/lexical_cast.hpp>
@@ -26,14 +28,32 @@ namespace boost{ namespace math{ namespace tools{
template <class Real>
Real convert_from_string(const char* p, const std::false_type&)
{
#ifdef BOOST_MATH_NO_LEXICAL_CAST
#ifdef BOOST_MATH_NO_LEXICAL_CAST
// This function should not compile, we don't have the necessary functionality to support it:
static_assert(sizeof(Real) == 0, "boost.lexical_cast is not supported in standalone mode.");
(void)p; // Suppresses -Wunused-parameter
return Real(0);
#else
#elif defined(BOOST_MATH_USE_CHARCONV_FOR_CONVERSION)
if constexpr (std::is_arithmetic_v<Real>)
{
Real v {};
std::from_chars(p, p + std::strlen(p), v);
return v;
}
else
{
return boost::lexical_cast<Real>(p);
}
#else
return boost::lexical_cast<Real>(p);
#endif
#endif
}
template <class Real>
constexpr const char* convert_from_string(const char* p, const std::true_type&) noexcept