31 #include <google/protobuf/util/internal/datapiece.h>
37 #include <google/protobuf/struct.pb.h>
38 #include <google/protobuf/type.pb.h>
39 #include <google/protobuf/descriptor.h>
40 #include <google/protobuf/util/internal/utility.h>
41 #include <google/protobuf/stubs/status.h>
42 #include <google/protobuf/stubs/strutil.h>
43 #include <google/protobuf/stubs/mathutil.h>
54 template <
typename To,
typename From>
55 util::StatusOr<To> ValidateNumberConversion(To
after, From
before) {
57 MathUtil::Sign<From>(
before) == MathUtil::Sign<To>(
after)) {
70 template <
typename To,
typename From>
71 util::StatusOr<To> NumberConvertAndCheck(From
before) {
80 template <
typename To,
typename From>
81 util::StatusOr<To> FloatingPointToIntConvertAndCheck(From
before) {
89 util::StatusOr<double> FloatToDouble(
float before) {
92 return static_cast<double>(
before);
95 util::StatusOr<float> DoubleToFloat(
double before) {
97 return std::numeric_limits<float>::quiet_NaN();
100 return static_cast<float>(
before);
106 return static_cast<float>(
before);
117 return FloatingPointToIntConvertAndCheck<int32_t, double>(
double_);
120 return FloatingPointToIntConvertAndCheck<int32_t, float>(
float_);
122 return GenericConvert<int32_t>();
130 return FloatingPointToIntConvertAndCheck<uint32_t, double>(
double_);
133 return FloatingPointToIntConvertAndCheck<uint32_t, float>(
float_);
135 return GenericConvert<uint32_t>();
143 return FloatingPointToIntConvertAndCheck<int64_t, double>(
double_);
146 return FloatingPointToIntConvertAndCheck<int64_t, float>(
float_);
148 return GenericConvert<int64_t>();
156 return FloatingPointToIntConvertAndCheck<uint64_t, double>(
double_);
159 return FloatingPointToIntConvertAndCheck<uint64_t, float>(
float_);
161 return GenericConvert<uint64_t>();
166 return FloatToDouble(
float_);
169 if (
str_ ==
"Infinity")
return std::numeric_limits<double>::infinity();
170 if (
str_ ==
"-Infinity")
return -std::numeric_limits<double>::infinity();
171 if (
str_ ==
"NaN")
return std::numeric_limits<double>::quiet_NaN();
181 return GenericConvert<double>();
189 if (
str_ ==
"Infinity")
return std::numeric_limits<float>::infinity();
190 if (
str_ ==
"-Infinity")
return -std::numeric_limits<float>::infinity();
191 if (
str_ ==
"NaN")
return std::numeric_limits<float>::quiet_NaN();
196 return GenericConvert<float>();
248 return StrCat(
"\"", base64,
"\"");
268 "Wrong type. Only String or Bytes can be converted to Bytes."));
273 bool use_lower_camel_for_enums,
274 bool case_insensitive_enum_parsing,
275 bool ignore_unknown_enum_values,
276 bool* is_unknown_enum_value)
const {
287 util::StatusOr<int32_t> int_value =
ToInt32();
288 if (int_value.ok()) {
291 return enum_value->number();
296 bool should_normalize_enum =
297 case_insensitive_enum_parsing || use_lower_camel_for_enums;
298 if (should_normalize_enum) {
310 if (use_lower_camel_for_enums) {
316 if (ignore_unknown_enum_values) {
317 *is_unknown_enum_value =
true;
331 template <
typename To>
335 return NumberConvertAndCheck<To, int32_t>(
i32_);
337 return NumberConvertAndCheck<To, int64_t>(
i64_);
339 return NumberConvertAndCheck<To, uint32_t>(
u32_);
341 return NumberConvertAndCheck<To, uint64_t>(
u64_);
343 return NumberConvertAndCheck<To, double>(
double_);
345 return NumberConvertAndCheck<To, float>(
float_);
348 "Wrong type. Bool, Enum, String and Cord not supported in "
353 template <
typename To>
378 return encoded == src_no_padding;
387 dest->length(), &encoded,
false);
391 return encoded == src_no_padding;