| // 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) | |
| #ifndef BOOST_MATH_TOOLS_CONVERT_FROM_STRING_INCLUDED | |
| #define BOOST_MATH_TOOLS_CONVERT_FROM_STRING_INCLUDED | |
| #ifdef _MSC_VER | |
| #pragma once | |
| #endif | |
| #include <boost/math/tools/config.hpp> | |
| #include <type_traits> | |
| #ifndef BOOST_MATH_STANDALONE | |
| #if defined(_MSC_VER) || defined(__GNUC__) | |
| # pragma push_macro( "I" ) | |
| # undef I | |
| #endif | |
| #include <boost/lexical_cast.hpp> | |
| #if defined(_MSC_VER) || defined(__GNUC__) | |
| # pragma pop_macro( "I" ) | |
| #endif | |
| #endif | |
| namespace boost{ namespace math{ namespace tools{ | |
| template <class T> | |
| struct convert_from_string_result | |
| { | |
| typedef typename std::conditional<std::is_constructible<T, const char*>::value, const char*, T>::type type; | |
| }; | |
| template <class Real> | |
| Real convert_from_string(const char* p, const std::false_type&) | |
| { | |
| #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); | |
| #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 | |
| } | |
| template <class Real> | |
| constexpr const char* convert_from_string(const char* p, const std::true_type&) noexcept | |
| { | |
| return p; | |
| } | |
| template <class Real> | |
| constexpr typename convert_from_string_result<Real>::type convert_from_string(const char* p) noexcept((std::is_constructible<Real, const char*>::value)) | |
| { | |
| return convert_from_string<Real>(p, std::is_constructible<Real, const char*>()); | |
| } | |
| } // namespace tools | |
| } // namespace math | |
| } // namespace boost | |
| #endif // BOOST_MATH_TOOLS_CONVERT_FROM_STRING_INCLUDED | |