25 #ifdef LEXICAL_CAST_DEBUG
26 #undef LEXICAL_CAST_HPP_INCLUDED
29 #ifndef LEXICAL_CAST_HPP_INCLUDED
30 #define LEXICAL_CAST_HPP_INCLUDED
32 #ifdef LEXICAL_CAST_DEBUG
42 #define DEBUG_THROW(id) throw id;
51 #include <type_traits>
53 #define DEBUG_THROW(id)
66 ,
typename ToEnable = void
67 ,
typename FromEnable =
void
85 template<
typename To,
typename From>
102 template<
typename To,
typename From>
111 const char*
what() const noexcept
113 return "bad_lexical_cast";
134 ,
typename FromEnable
138 To
operator()(From value, utils::optional<To> fallback)
const
143 std::stringstream sstr;
145 if(!(sstr << value && sstr >> result)) {
146 if(fallback) {
return *fallback; }
161 template <
typename From>
166 , std::enable_if_t<std::is_arithmetic_v<From>>
169 std::string
operator()(From value, utils::optional<std::string>)
const
171 DEBUG_THROW(
"specialized - To std::string - From arithmetic");
172 if constexpr (std::is_same_v<bool, From>) {
173 return value ?
"1" :
"0";
195 bool operator()(std::string_view str, utils::optional<bool> fallback)
const
197 DEBUG_THROW(
"specialized - To bool - From string");
201 }
else if(str ==
"0") {
203 }
else if (fallback) {
216 template <
typename To>
220 , std::enable_if_t<std::is_arithmetic_v<To>>
224 To
operator()(std::string_view str, utils::optional<To> fallback)
const
226 DEBUG_THROW(
"specialized - To arithmetic - From string");
233 if(ec == std::errc()) {
248 template <
typename To>
252 , std::enable_if_t<std::is_arithmetic_v<To>>
256 To
operator()(
const std::string& value, utils::optional<To> fallback)
const
260 return lexical_cast_default<To>(std::string_view(value), *fallback);
262 return lexical_cast<To>(std::string_view(value));
273 template <
class To,
class From>
277 , std::enable_if_t<std::is_arithmetic_v<To> >
278 , std::enable_if_t<std::is_same_v<From, const char*> || std::is_same_v<From, char*> >
281 To
operator()(
const std::string& value, utils::optional<To> fallback)
const
285 return lexical_cast_default<To>(std::string_view(value), *fallback);
287 return lexical_cast<To>(std::string_view(value));
To lexical_cast_default(From value, To fallback=To())
Lexical cast converts one type to another with a fallback.
To lexical_cast(From value)
Lexical cast converts one type to another.
Contains the implementation details for lexical_cast and shouldn't be used directly.
std::enable_if_t< std::is_integral_v< T >, std::from_chars_result > from_chars(const char *first, const char *last, T &value, int base=10)
void trim_for_from_chars(std::string_view &v)
Thrown when a lexical_cast fails.
const char * what() const noexcept
To operator()(const std::string &value, utils::optional< To > fallback) const
To operator()(const std::string &value, utils::optional< To > fallback) const
To operator()(std::string_view str, utils::optional< To > fallback) const
bool operator()(std::string_view str, utils::optional< bool > fallback) const
std::string operator()(From value, utils::optional< std::string >) const
Base class for the conversion.
To operator()(From value, utils::optional< To > fallback) const
std::string to_string() const