56 inline Status InvalidArgument(StringPiece value_str) {
60 template <
typename To,
typename From>
61 StatusOr<To> ValidateNumberConversion(To after, From before) {
62 if (after == before &&
63 MathUtil::Sign<From>(before) == MathUtil::Sign<To>(after)) {
77 template <
typename To,
typename From>
78 StatusOr<To> NumberConvertAndCheck(From before) {
81 To after =
static_cast<To
>(before);
82 return ValidateNumberConversion(after, before);
87 template <
typename To,
typename From>
88 StatusOr<To> FloatingPointToIntConvertAndCheck(From before) {
91 To after =
static_cast<To
>(before);
92 return ValidateNumberConversion(after, before);
96 StatusOr<double> FloatToDouble(
float before) {
99 return static_cast<double>(before);
102 StatusOr<float> DoubleToFloat(
double before) {
104 return std::numeric_limits<float>::quiet_NaN();
107 return static_cast<float>(before);
108 }
else if (before > std::numeric_limits<float>::max() ||
109 before < -std::numeric_limits<float>::max()) {
113 return static_cast<float>(before);
123 return FloatingPointToIntConvertAndCheck<int32, double>(
double_);
126 return FloatingPointToIntConvertAndCheck<int32, float>(
float_);
128 return GenericConvert<int32>();
136 return FloatingPointToIntConvertAndCheck<uint32, double>(
double_);
139 return FloatingPointToIntConvertAndCheck<uint32, float>(
float_);
141 return GenericConvert<uint32>();
148 return FloatingPointToIntConvertAndCheck<int64, double>(
double_);
151 return FloatingPointToIntConvertAndCheck<int64, float>(
float_);
153 return GenericConvert<int64>();
161 return FloatingPointToIntConvertAndCheck<uint64, double>(
double_);
164 return FloatingPointToIntConvertAndCheck<uint64, float>(
float_);
166 return GenericConvert<uint64>();
171 return FloatToDouble(
float_);
174 if (
str_ ==
"Infinity")
return std::numeric_limits<double>::infinity();
175 if (
str_ ==
"-Infinity")
return -std::numeric_limits<double>::infinity();
176 if (
str_ ==
"NaN")
return std::numeric_limits<double>::quiet_NaN();
181 return InvalidArgument(
StrCat(
"\"",
str_,
"\""));
186 return GenericConvert<double>();
194 if (
str_ ==
"Infinity")
return std::numeric_limits<float>::infinity();
195 if (
str_ ==
"-Infinity")
return -std::numeric_limits<float>::infinity();
196 if (
str_ ==
"NaN")
return std::numeric_limits<float>::quiet_NaN();
201 return GenericConvert<float>();
211 return InvalidArgument(
226 return InvalidArgument(
272 "Wrong type. Only String or Bytes can be converted to Bytes."));
277 bool use_lower_camel_for_enums,
278 bool case_insensitive_enum_parsing,
279 bool ignore_unknown_enum_values,
280 bool* is_unknown_enum_value)
const {
292 if (int_value.
ok()) {
295 return enum_value->number();
300 bool should_normalize_enum =
301 case_insensitive_enum_parsing || use_lower_camel_for_enums;
302 if (should_normalize_enum) {
303 for (std::string::iterator
it = enum_name.begin();
it != enum_name.end();
314 if (use_lower_camel_for_enums) {
320 if (ignore_unknown_enum_values) {
321 *is_unknown_enum_value =
true;
329 return InvalidArgument(
333 template <
typename To>
337 return NumberConvertAndCheck<To, int32>(
i32_);
339 return NumberConvertAndCheck<To, int64>(
i64_);
341 return NumberConvertAndCheck<To, uint32>(
u32_);
343 return NumberConvertAndCheck<To, uint64>(
u64_);
345 return NumberConvertAndCheck<To, double>(
double_);
347 return NumberConvertAndCheck<To, float>(
float_);
350 "Wrong type. Bool, Enum, String and Cord not supported in "
355 template <
typename To>
359 return InvalidArgument(
StrCat(
"\"",
str_,
"\""));
362 if (
func(
str_, &result))
return result;
363 return InvalidArgument(
StrCat(
"\"",
string(
str_),
"\""));
379 return encoded == src_no_padding;
388 reinterpret_cast<const unsigned char*
>(
dest->data()),
dest->length(),
393 return encoded == src_no_padding;