mirror of
https://github.com/red0124/ssp.git
synced 2025-01-23 13:05:20 +01:00
remove throws on invalid
This commit is contained in:
parent
cbdd350b63
commit
47ef93b532
@ -274,19 +274,12 @@ class converter {
|
|||||||
// conversion
|
// conversion
|
||||||
////////////////
|
////////////////
|
||||||
|
|
||||||
#ifdef SS_THROW_ON_INVALID
|
|
||||||
#define SS_RETURN_ON_INVALID // nop
|
|
||||||
#else
|
|
||||||
#define SS_RETURN_ON_INVALID \
|
|
||||||
if (!valid()) { \
|
|
||||||
return; \
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void extract_one(no_validator_t<T>& dst, const string_range msg,
|
void extract_one(no_validator_t<T>& dst, const string_range msg,
|
||||||
size_t pos) {
|
size_t pos) {
|
||||||
SS_RETURN_ON_INVALID;
|
if (!valid()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!extract(msg.first, msg.second, dst)) {
|
if (!extract(msg.first, msg.second, dst)) {
|
||||||
set_error_invalid_conversion(msg, pos);
|
set_error_invalid_conversion(msg, pos);
|
||||||
@ -351,11 +344,13 @@ class converter {
|
|||||||
|
|
||||||
template <>
|
template <>
|
||||||
inline void converter::extract_one<std::string>(std::string& dst,
|
inline void converter::extract_one<std::string>(std::string& dst,
|
||||||
const string_range msg, size_t) {
|
const string_range msg,
|
||||||
SS_RETURN_ON_INVALID;
|
size_t) {
|
||||||
|
if (!valid()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
extract(msg.first, msg.second, dst);
|
extract(msg.first, msg.second, dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef SS_RETURN_ON_INVALID
|
|
||||||
|
|
||||||
} /* ss */
|
} /* ss */
|
||||||
|
@ -7,14 +7,6 @@
|
|||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#ifdef SS_THROW_ON_INVALID
|
|
||||||
#define SS_THROW_OR_NULL(x) throw std::invalid_argument(x)
|
|
||||||
#define SS_THROW_OR_FALSE(x) throw std::invalid_argument(x)
|
|
||||||
#else
|
|
||||||
#define SS_THROW_OR_NULL(x) return std::nullopt
|
|
||||||
#define SS_THROW_OR_FALSE(x) return false
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace ss {
|
namespace ss {
|
||||||
|
|
||||||
// todo
|
// todo
|
||||||
@ -47,7 +39,7 @@ template <typename T>
|
|||||||
std::enable_if_t<std::is_floating_point_v<T>, std::optional<T>> to_num(
|
std::enable_if_t<std::is_floating_point_v<T>, std::optional<T>> to_num(
|
||||||
const char* begin, const char* const end) {
|
const char* begin, const char* const end) {
|
||||||
if (begin == end) {
|
if (begin == end) {
|
||||||
SS_THROW_OR_NULL("floating point");
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
int sign = 1;
|
int sign = 1;
|
||||||
T int_part = 0.0;
|
T int_part = 0.0;
|
||||||
@ -73,7 +65,7 @@ std::enable_if_t<std::is_floating_point_v<T>, std::optional<T>> to_num(
|
|||||||
++begin;
|
++begin;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
SS_THROW_OR_NULL("floating point");
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
++begin;
|
++begin;
|
||||||
}
|
}
|
||||||
@ -90,7 +82,7 @@ std::enable_if_t<std::is_floating_point_v<T>, std::optional<T>> to_num(
|
|||||||
++begin;
|
++begin;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
SS_THROW_OR_NULL("floating point");
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
++begin;
|
++begin;
|
||||||
}
|
}
|
||||||
@ -117,7 +109,7 @@ std::enable_if_t<std::is_floating_point_v<T>, std::optional<T>> to_num(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (begin != end) {
|
if (begin != end) {
|
||||||
SS_THROW_OR_NULL("floating point");
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
return sign * (int_part + frac_part) * exp_part;
|
return sign * (int_part + frac_part) * exp_part;
|
||||||
@ -127,7 +119,7 @@ inline std::optional<short> from_char(char c) {
|
|||||||
if (c >= '0' && c <= '9') {
|
if (c >= '0' && c <= '9') {
|
||||||
return c - '0';
|
return c - '0';
|
||||||
}
|
}
|
||||||
SS_THROW_OR_NULL("integral");
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__clang__) || defined(__GNUC__) || defined(__GUNG__)
|
#if defined(__clang__) || defined(__GNUC__) || defined(__GUNG__)
|
||||||
@ -279,7 +271,7 @@ template <typename T>
|
|||||||
std::enable_if_t<std::is_integral_v<T>, std::optional<T>> to_num(
|
std::enable_if_t<std::is_integral_v<T>, std::optional<T>> to_num(
|
||||||
const char* begin, const char* end) {
|
const char* begin, const char* end) {
|
||||||
if (begin == end) {
|
if (begin == end) {
|
||||||
SS_THROW_OR_NULL("integral");
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
bool is_negative = false;
|
bool is_negative = false;
|
||||||
if constexpr (std::is_signed_v<T>) {
|
if constexpr (std::is_signed_v<T>) {
|
||||||
@ -302,7 +294,7 @@ std::enable_if_t<std::is_integral_v<T>, std::optional<T>> to_num(
|
|||||||
!digit ||
|
!digit ||
|
||||||
shift_and_add_overflow<T>(value, digit.value(),
|
shift_and_add_overflow<T>(value, digit.value(),
|
||||||
add_last_digit_owerflow)) {
|
add_last_digit_owerflow)) {
|
||||||
SS_THROW_OR_NULL("integral");
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,11 +329,9 @@ template <typename T>
|
|||||||
std::enable_if_t<std::is_integral_v<T> || std::is_floating_point_v<T>, bool>
|
std::enable_if_t<std::is_integral_v<T> || std::is_floating_point_v<T>, bool>
|
||||||
extract(const char* begin, const char* end, T& value) {
|
extract(const char* begin, const char* end, T& value) {
|
||||||
auto optional_value = to_num<T>(begin, end);
|
auto optional_value = to_num<T>(begin, end);
|
||||||
#ifndef SS_THROW_ON_INVALID
|
|
||||||
if (!optional_value) {
|
if (!optional_value) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
value = optional_value.value();
|
value = optional_value.value();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -367,16 +357,13 @@ inline bool extract(const char* begin, const char* end, bool& value) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SS_THROW_OR_FALSE("boolean");
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
inline bool extract(const char* begin, const char* end, char& value) {
|
inline bool extract(const char* begin, const char* end, char& value) {
|
||||||
value = *begin;
|
value = *begin;
|
||||||
if (end != begin + 1) {
|
return (end == begin + 1);
|
||||||
SS_THROW_OR_FALSE("character");
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
@ -385,7 +372,4 @@ inline bool extract(const char* begin, const char* end, std::string& value) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef SS_THROW_OR_NULL
|
|
||||||
#undef SS_THROW_OR_FALSE
|
|
||||||
|
|
||||||
} /* ss */
|
} /* ss */
|
||||||
|
Loading…
Reference in New Issue
Block a user