Index: third_party/protobuf/src/google/protobuf/util/internal/utility.cc |
diff --git a/third_party/protobuf/src/google/protobuf/util/internal/utility.cc b/third_party/protobuf/src/google/protobuf/util/internal/utility.cc |
index ee7a51fc41b6db81b4ee9b58cfaa11d7a023791e..05759e85ab62abb0d60ae2de4d3455282b3c171f 100644 |
--- a/third_party/protobuf/src/google/protobuf/util/internal/utility.cc |
+++ b/third_party/protobuf/src/google/protobuf/util/internal/utility.cc |
@@ -30,6 +30,8 @@ |
#include <google/protobuf/util/internal/utility.h> |
+#include <algorithm> |
+ |
#include <google/protobuf/stubs/callback.h> |
#include <google/protobuf/stubs/common.h> |
#include <google/protobuf/stubs/logging.h> |
@@ -52,7 +54,7 @@ const StringPiece SkipWhiteSpace(StringPiece str) { |
for (i = 0; i < str.size() && isspace(str[i]); ++i) { |
} |
GOOGLE_DCHECK(i == str.size() || !isspace(str[i])); |
- return StringPiece(str, i); |
+ return str.substr(i); |
} |
} // namespace |
@@ -128,8 +130,12 @@ string GetStringFromAny(const google::protobuf::Any& any) { |
} |
const StringPiece GetTypeWithoutUrl(StringPiece type_url) { |
- size_t idx = type_url.rfind('/'); |
- return type_url.substr(idx + 1); |
+ if (type_url.size() > kTypeUrlSize && type_url[kTypeUrlSize] == '/') { |
+ return type_url.substr(kTypeUrlSize + 1); |
+ } else { |
+ size_t idx = type_url.rfind('/'); |
+ return type_url.substr(idx + 1); |
+ } |
} |
const string GetFullTypeWithUrl(StringPiece simple_type) { |
@@ -174,6 +180,19 @@ const google::protobuf::Field* FindJsonFieldInTypeOrNull( |
return NULL; |
} |
+const google::protobuf::Field* FindFieldInTypeByNumberOrNull( |
+ const google::protobuf::Type* type, int32 number) { |
+ if (type != NULL) { |
+ for (int i = 0; i < type->fields_size(); ++i) { |
+ const google::protobuf::Field& field = type->fields(i); |
+ if (field.number() == number) { |
+ return &field; |
+ } |
+ } |
+ } |
+ return NULL; |
+} |
+ |
const google::protobuf::EnumValue* FindEnumValueByNameOrNull( |
const google::protobuf::Enum* enum_type, StringPiece enum_name) { |
if (enum_type != NULL) { |
@@ -200,6 +219,32 @@ const google::protobuf::EnumValue* FindEnumValueByNumberOrNull( |
return NULL; |
} |
+const google::protobuf::EnumValue* FindEnumValueByNameWithoutUnderscoreOrNull( |
+ const google::protobuf::Enum* enum_type, StringPiece enum_name) { |
+ if (enum_type != NULL) { |
+ for (int i = 0; i < enum_type->enumvalue_size(); ++i) { |
+ const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i); |
+ string enum_name_without_underscore = enum_value.name(); |
+ |
+ // Remove underscore from the name. |
+ enum_name_without_underscore.erase( |
+ std::remove(enum_name_without_underscore.begin(), |
+ enum_name_without_underscore.end(), '_'), |
+ enum_name_without_underscore.end()); |
+ // Make the name uppercase. |
+ for (string::iterator it = enum_name_without_underscore.begin(); |
+ it != enum_name_without_underscore.end(); ++it) { |
+ *it = ascii_toupper(*it); |
+ } |
+ |
+ if (enum_name_without_underscore == enum_name) { |
+ return &enum_value; |
+ } |
+ } |
+ } |
+ return NULL; |
+} |
+ |
string ToCamelCase(const StringPiece input) { |
bool capitalize_next = false; |
bool was_cap = true; |
@@ -279,7 +324,7 @@ string ToSnakeCase(StringPiece input) { |
return result; |
} |
-set<string>* well_known_types_ = NULL; |
+std::set<string>* well_known_types_ = NULL; |
GOOGLE_PROTOBUF_DECLARE_ONCE(well_known_types_init_); |
const char* well_known_types_name_array_[] = { |
"google.protobuf.Timestamp", "google.protobuf.Duration", |
@@ -292,7 +337,7 @@ const char* well_known_types_name_array_[] = { |
void DeleteWellKnownTypes() { delete well_known_types_; } |
void InitWellKnownTypes() { |
- well_known_types_ = new set<string>; |
+ well_known_types_ = new std::set<string>; |
for (int i = 0; i < GOOGLE_ARRAYSIZE(well_known_types_name_array_); ++i) { |
well_known_types_->insert(well_known_types_name_array_[i]); |
} |
@@ -311,15 +356,23 @@ bool IsValidBoolString(const string& bool_string) { |
bool IsMap(const google::protobuf::Field& field, |
const google::protobuf::Type& type) { |
- return (field.cardinality() == |
- google::protobuf::Field_Cardinality_CARDINALITY_REPEATED && |
- GetBoolOptionOrDefault(type.options(), |
- "google.protobuf.MessageOptions.map_entry", false)); |
+ return ( |
+ field.cardinality() == |
+ google::protobuf::Field_Cardinality_CARDINALITY_REPEATED && |
+ (GetBoolOptionOrDefault( |
+ type.options(), "google.protobuf.MessageOptions.map_entry", false) || |
+ GetBoolOptionOrDefault(type.options(), "proto2.MessageOptions.map_entry", |
+ false))); |
} |
bool IsMessageSetWireFormat(const google::protobuf::Type& type) { |
- return GetBoolOptionOrDefault( |
- type.options(), "google.protobuf.MessageOptions.message_set_wire_format", false); |
+ return ( |
+ GetBoolOptionOrDefault( |
+ type.options(), |
+ "google.protobuf.MessageOptions.message_set_wire_format", false) || |
+ GetBoolOptionOrDefault(type.options(), |
+ "proto2.MessageOptions.message_set_wire_format", |
+ false)); |
} |
string DoubleAsString(double value) { |
@@ -359,3 +412,4 @@ bool SafeStrToFloat(StringPiece str, float* value) { |
} // namespace util |
} // namespace protobuf |
} // namespace google |
+ |