boost/math/tools/convert_from_string.hpp
// 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