Compare commits

...

2 Commits

Author SHA1 Message Date
Martchus 8e5c1eab1f WIP: Use charconv functions 2021-05-23 19:17:50 +02:00
Martchus 96fb32e12f Fix a few details in string conversion functions 2021-05-23 19:01:22 +02:00
2 changed files with 18 additions and 3 deletions

View File

@ -197,6 +197,16 @@ if (NOT ENABLE_THREAD_LOCAL)
PROPERTY COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_NO_THREAD_LOCAL) PROPERTY COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_NO_THREAD_LOCAL)
endif () endif ()
# configure use of charconv
option(ENABLE_CHARCONV "enables use charconv for integer conversions" ON)
option(ENABLE_CHARCONV_FP "enables use charconv for floating point conversions" ON)
if (ENABLE_CHARCONV)
list(APPEND META_PUBLIC_COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_ENABLE_CHARCONV)
endif ()
if (ENABLE_CHARCONV_FP)
list(APPEND META_PUBLIC_COMPILE_DEFINITIONS ${META_PROJECT_VARNAME}_ENABLE_CHARCONV_FP)
endif ()
# include modules to apply configuration # include modules to apply configuration
include(BasicConfig) include(BasicConfig)
include(WindowsResources) include(WindowsResources)

View File

@ -25,6 +25,10 @@
#include <ranges> #include <ranges>
#endif #endif
#if defined(CPP_UTILITIES_ENABLE_CHARCONV) || defined(CPP_UTILITIES_ENABLE_CHARCONV_FP)
#include <charconv>
#endif
namespace CppUtilities { namespace CppUtilities {
/*! /*!
@ -442,6 +446,7 @@ template <typename IntegralType, class StringType = std::string, typename BaseTy
Traits::EnableIf<std::is_integral<IntegralType>, std::is_signed<IntegralType>> * = nullptr> Traits::EnableIf<std::is_integral<IntegralType>, std::is_signed<IntegralType>> * = nullptr>
StringType numberToString(IntegralType number, BaseType base = 10) StringType numberToString(IntegralType number, BaseType base = 10)
{ {
const bool negative = number < 0; const bool negative = number < 0;
std::size_t resSize; std::size_t resSize;
if (negative) { if (negative) {
@ -537,7 +542,7 @@ IntegralType stringToNumber(const StringType &string, BaseType base = 10)
*/ */
template <typename IntegralType, class StringType, typename BaseType = IntegralType, template <typename IntegralType, class StringType, typename BaseType = IntegralType,
Traits::EnableIf<std::is_integral<IntegralType>, std::is_signed<IntegralType>, Traits::Not<std::is_scalar<std::decay_t<StringType>>>> * = nullptr> Traits::EnableIf<std::is_integral<IntegralType>, std::is_signed<IntegralType>, Traits::Not<std::is_scalar<std::decay_t<StringType>>>> * = nullptr>
IntegralType stringToNumber(const StringType &string, IntegralType base = 10) IntegralType stringToNumber(const StringType &string, BaseType base = 10)
{ {
auto i = string.begin(); auto i = string.begin();
auto end = string.end(); auto end = string.end();
@ -581,10 +586,10 @@ FloatingType stringToNumber(const StringType &string, int base = 10)
return result; return result;
} }
std::string errorMsg; std::string errorMsg;
errorMsg.reserve(42 + string.size()); errorMsg.reserve(48 + string.size());
errorMsg += "The string \""; errorMsg += "The string \"";
errorMsg += string; errorMsg += string;
errorMsg += "\" is no valid floating number."; errorMsg += "\" is no valid floating point number.";
throw ConversionException(errorMsg); throw ConversionException(errorMsg);
} }