aboutsummaryrefslogtreecommitdiffhomepage
path: root/third_party/protobuf/src/google/protobuf/util/internal/datapiece.cc
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/protobuf/src/google/protobuf/util/internal/datapiece.cc')
-rw-r--r--third_party/protobuf/src/google/protobuf/util/internal/datapiece.cc324
1 files changed, 0 insertions, 324 deletions
diff --git a/third_party/protobuf/src/google/protobuf/util/internal/datapiece.cc b/third_party/protobuf/src/google/protobuf/util/internal/datapiece.cc
deleted file mode 100644
index b557429fc1..0000000000
--- a/third_party/protobuf/src/google/protobuf/util/internal/datapiece.cc
+++ /dev/null
@@ -1,324 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#include <google/protobuf/util/internal/datapiece.h>
-
-#include <google/protobuf/struct.pb.h>
-#include <google/protobuf/type.pb.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/util/internal/utility.h>
-#include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/mathlimits.h>
-#include <google/protobuf/stubs/mathutil.h>
-
-namespace google {
-namespace protobuf {
-namespace util {
-namespace converter {
-
-using google::protobuf::EnumDescriptor;
-using google::protobuf::EnumValueDescriptor;
-;
-;
-using util::error::Code;
-using util::Status;
-using util::StatusOr;
-
-namespace {
-
-inline Status InvalidArgument(StringPiece value_str) {
- return Status(util::error::INVALID_ARGUMENT, value_str);
-}
-
-template <typename To, typename From>
-StatusOr<To> ValidateNumberConversion(To after, From before) {
- if (after == before &&
- MathUtil::Sign<From>(before) == MathUtil::Sign<To>(after)) {
- return after;
- } else {
- return InvalidArgument(::google::protobuf::internal::is_integral<From>::value
- ? ValueAsString(before)
- : ::google::protobuf::internal::is_same<From, double>::value
- ? DoubleAsString(before)
- : FloatAsString(before));
- }
-}
-
-// For general conversion between
-// int32, int64, uint32, uint64, double and float
-// except conversion between double and float.
-template <typename To, typename From>
-StatusOr<To> NumberConvertAndCheck(From before) {
- if (::google::protobuf::internal::is_same<From, To>::value) return before;
-
- To after = static_cast<To>(before);
- return ValidateNumberConversion(after, before);
-}
-
-// For conversion to integer types (int32, int64, uint32, uint64) from floating
-// point types (double, float) only.
-template <typename To, typename From>
-StatusOr<To> FloatingPointToIntConvertAndCheck(From before) {
- if (::google::protobuf::internal::is_same<From, To>::value) return before;
-
- To after = static_cast<To>(before);
- return ValidateNumberConversion(after, before);
-}
-
-// For conversion between double and float only.
-template <typename To, typename From>
-StatusOr<To> FloatingPointConvertAndCheck(From before) {
- if (MathLimits<From>::IsNaN(before)) {
- return std::numeric_limits<To>::quiet_NaN();
- }
-
- To after = static_cast<To>(before);
- if (MathUtil::AlmostEquals<To>(after, before)) {
- return after;
- } else {
- return InvalidArgument(::google::protobuf::internal::is_same<From, double>::value
- ? DoubleAsString(before)
- : FloatAsString(before));
- }
-}
-
-} // namespace
-
-StatusOr<int32> DataPiece::ToInt32() const {
- if (type_ == TYPE_STRING) return StringToNumber<int32>(safe_strto32);
-
- if (type_ == TYPE_DOUBLE)
- return FloatingPointToIntConvertAndCheck<int32, double>(double_);
-
- if (type_ == TYPE_FLOAT)
- return FloatingPointToIntConvertAndCheck<int32, float>(float_);
-
- return GenericConvert<int32>();
-}
-
-StatusOr<uint32> DataPiece::ToUint32() const {
- if (type_ == TYPE_STRING) return StringToNumber<uint32>(safe_strtou32);
-
- if (type_ == TYPE_DOUBLE)
- return FloatingPointToIntConvertAndCheck<uint32, double>(double_);
-
- if (type_ == TYPE_FLOAT)
- return FloatingPointToIntConvertAndCheck<uint32, float>(float_);
-
- return GenericConvert<uint32>();
-}
-
-StatusOr<int64> DataPiece::ToInt64() const {
- if (type_ == TYPE_STRING) return StringToNumber<int64>(safe_strto64);
-
- if (type_ == TYPE_DOUBLE)
- return FloatingPointToIntConvertAndCheck<int64, double>(double_);
-
- if (type_ == TYPE_FLOAT)
- return FloatingPointToIntConvertAndCheck<int64, float>(float_);
-
- return GenericConvert<int64>();
-}
-
-StatusOr<uint64> DataPiece::ToUint64() const {
- if (type_ == TYPE_STRING) return StringToNumber<uint64>(safe_strtou64);
-
- if (type_ == TYPE_DOUBLE)
- return FloatingPointToIntConvertAndCheck<uint64, double>(double_);
-
- if (type_ == TYPE_FLOAT)
- return FloatingPointToIntConvertAndCheck<uint64, float>(float_);
-
- return GenericConvert<uint64>();
-}
-
-StatusOr<double> DataPiece::ToDouble() const {
- if (type_ == TYPE_FLOAT) {
- return FloatingPointConvertAndCheck<double, float>(float_);
- }
- if (type_ == TYPE_STRING) {
- if (str_ == "Infinity") return std::numeric_limits<double>::infinity();
- if (str_ == "-Infinity") return -std::numeric_limits<double>::infinity();
- if (str_ == "NaN") return std::numeric_limits<double>::quiet_NaN();
- return StringToNumber<double>(safe_strtod);
- }
- return GenericConvert<double>();
-}
-
-StatusOr<float> DataPiece::ToFloat() const {
- if (type_ == TYPE_DOUBLE) {
- return FloatingPointConvertAndCheck<float, double>(double_);
- }
- if (type_ == TYPE_STRING) {
- if (str_ == "Infinity") return std::numeric_limits<float>::infinity();
- if (str_ == "-Infinity") return -std::numeric_limits<float>::infinity();
- if (str_ == "NaN") return std::numeric_limits<float>::quiet_NaN();
- // SafeStrToFloat() is used instead of safe_strtof() because the later
- // does not fail on inputs like SimpleDtoa(DBL_MAX).
- return StringToNumber<float>(SafeStrToFloat);
- }
- return GenericConvert<float>();
-}
-
-StatusOr<bool> DataPiece::ToBool() const {
- switch (type_) {
- case TYPE_BOOL:
- return bool_;
- case TYPE_STRING:
- return StringToNumber<bool>(safe_strtob);
- default:
- return InvalidArgument(
- ValueAsStringOrDefault("Wrong type. Cannot convert to Bool."));
- }
-}
-
-StatusOr<string> DataPiece::ToString() const {
- switch (type_) {
- case TYPE_STRING:
- return str_.ToString();
- case TYPE_BYTES: {
- string base64;
- Base64Escape(str_, &base64);
- return base64;
- }
- default:
- return InvalidArgument(
- ValueAsStringOrDefault("Cannot convert to string."));
- }
-}
-
-string DataPiece::ValueAsStringOrDefault(StringPiece default_string) const {
- switch (type_) {
- case TYPE_INT32:
- return SimpleItoa(i32_);
- case TYPE_INT64:
- return SimpleItoa(i64_);
- case TYPE_UINT32:
- return SimpleItoa(u32_);
- case TYPE_UINT64:
- return SimpleItoa(u64_);
- case TYPE_DOUBLE:
- return DoubleAsString(double_);
- case TYPE_FLOAT:
- return FloatAsString(float_);
- case TYPE_BOOL:
- return SimpleBtoa(bool_);
- case TYPE_STRING:
- return StrCat("\"", str_.ToString(), "\"");
- case TYPE_BYTES: {
- string base64;
- WebSafeBase64Escape(str_, &base64);
- return StrCat("\"", base64, "\"");
- }
- case TYPE_NULL:
- return "null";
- default:
- return default_string.ToString();
- }
-}
-
-StatusOr<string> DataPiece::ToBytes() const {
- if (type_ == TYPE_BYTES) return str_.ToString();
- if (type_ == TYPE_STRING) {
- string decoded;
- if (!WebSafeBase64Unescape(str_, &decoded)) {
- if (!Base64Unescape(str_, &decoded)) {
- return InvalidArgument(
- ValueAsStringOrDefault("Invalid data in input."));
- }
- }
- return decoded;
- } else {
- return InvalidArgument(ValueAsStringOrDefault(
- "Wrong type. Only String or Bytes can be converted to Bytes."));
- }
-}
-
-StatusOr<int> DataPiece::ToEnum(const google::protobuf::Enum* enum_type) const {
- if (type_ == TYPE_NULL) return google::protobuf::NULL_VALUE;
-
- if (type_ == TYPE_STRING) {
- // First try the given value as a name.
- string enum_name = str_.ToString();
- const google::protobuf::EnumValue* value =
- FindEnumValueByNameOrNull(enum_type, enum_name);
- if (value != NULL) return value->number();
- // Next try a normalized name.
- for (string::iterator it = enum_name.begin(); it != enum_name.end(); ++it) {
- *it = *it == '-' ? '_' : ascii_toupper(*it);
- }
- value = FindEnumValueByNameOrNull(enum_type, enum_name);
- if (value != NULL) return value->number();
- } else {
- StatusOr<int32> value = ToInt32();
- if (value.ok()) {
- if (const google::protobuf::EnumValue* enum_value =
- FindEnumValueByNumberOrNull(enum_type, value.ValueOrDie())) {
- return enum_value->number();
- }
- }
- }
- return InvalidArgument(
- ValueAsStringOrDefault("Cannot find enum with given value."));
-}
-
-template <typename To>
-StatusOr<To> DataPiece::GenericConvert() const {
- switch (type_) {
- case TYPE_INT32:
- return NumberConvertAndCheck<To, int32>(i32_);
- case TYPE_INT64:
- return NumberConvertAndCheck<To, int64>(i64_);
- case TYPE_UINT32:
- return NumberConvertAndCheck<To, uint32>(u32_);
- case TYPE_UINT64:
- return NumberConvertAndCheck<To, uint64>(u64_);
- case TYPE_DOUBLE:
- return NumberConvertAndCheck<To, double>(double_);
- case TYPE_FLOAT:
- return NumberConvertAndCheck<To, float>(float_);
- default: // TYPE_ENUM, TYPE_STRING, TYPE_CORD, TYPE_BOOL
- return InvalidArgument(ValueAsStringOrDefault(
- "Wrong type. Bool, Enum, String and Cord not supported in "
- "GenericConvert."));
- }
-}
-
-template <typename To>
-StatusOr<To> DataPiece::StringToNumber(bool (*func)(StringPiece, To*)) const {
- To result;
- if (func(str_, &result)) return result;
- return InvalidArgument(StrCat("\"", str_.ToString(), "\""));
-}
-
-} // namespace converter
-} // namespace util
-} // namespace protobuf
-} // namespace google