// 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 #include #ifndef BOOST_MATH_STANDALONE #if defined(_MSC_VER) || defined(__GNUC__) # pragma push_macro( "I" ) # undef I #endif #include #if defined(_MSC_VER) || defined(__GNUC__) # pragma pop_macro( "I" ) #endif #endif namespace boost{ namespace math{ namespace tools{ template struct convert_from_string_result { typedef typename std::conditional::value, const char*, T>::type type; }; template 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 v {}; std::from_chars(p, p + std::strlen(p), v); return v; } else { return boost::lexical_cast(p); } #else return boost::lexical_cast(p); #endif } template constexpr const char* convert_from_string(const char* p, const std::true_type&) noexcept { return p; } template constexpr typename convert_from_string_result::type convert_from_string(const char* p) noexcept((std::is_constructible::value)) { return convert_from_string(p, std::is_constructible()); } } // namespace tools } // namespace math } // namespace boost #endif // BOOST_MATH_TOOLS_CONVERT_FROM_STRING_INCLUDED