Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(915)

Side by Side Diff: third_party/protobuf/src/google/protobuf/util/internal/utility.cc

Issue 2599263002: third_party/protobuf: Update to HEAD (f52e188fe4) (Closed)
Patch Set: Address comments Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Protocol Buffers - Google's data interchange format 1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved. 2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/ 3 // https://developers.google.com/protocol-buffers/
4 // 4 //
5 // Redistribution and use in source and binary forms, with or without 5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are 6 // modification, are permitted provided that the following conditions are
7 // met: 7 // met:
8 // 8 //
9 // * Redistributions of source code must retain the above copyright 9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer. 10 // notice, this list of conditions and the following disclaimer.
(...skipping 12 matching lines...) Expand all
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 30
31 #include <google/protobuf/util/internal/utility.h> 31 #include <google/protobuf/util/internal/utility.h>
32 32
33 #include <algorithm>
34
33 #include <google/protobuf/stubs/callback.h> 35 #include <google/protobuf/stubs/callback.h>
34 #include <google/protobuf/stubs/common.h> 36 #include <google/protobuf/stubs/common.h>
35 #include <google/protobuf/stubs/logging.h> 37 #include <google/protobuf/stubs/logging.h>
36 #include <google/protobuf/wrappers.pb.h> 38 #include <google/protobuf/wrappers.pb.h>
37 #include <google/protobuf/descriptor.pb.h> 39 #include <google/protobuf/descriptor.pb.h>
38 #include <google/protobuf/descriptor.h> 40 #include <google/protobuf/descriptor.h>
39 #include <google/protobuf/util/internal/constants.h> 41 #include <google/protobuf/util/internal/constants.h>
40 #include <google/protobuf/stubs/strutil.h> 42 #include <google/protobuf/stubs/strutil.h>
41 #include <google/protobuf/stubs/map_util.h> 43 #include <google/protobuf/stubs/map_util.h>
42 #include <google/protobuf/stubs/mathlimits.h> 44 #include <google/protobuf/stubs/mathlimits.h>
43 45
44 namespace google { 46 namespace google {
45 namespace protobuf { 47 namespace protobuf {
46 namespace util { 48 namespace util {
47 namespace converter { 49 namespace converter {
48 50
49 namespace { 51 namespace {
50 const StringPiece SkipWhiteSpace(StringPiece str) { 52 const StringPiece SkipWhiteSpace(StringPiece str) {
51 StringPiece::size_type i; 53 StringPiece::size_type i;
52 for (i = 0; i < str.size() && isspace(str[i]); ++i) { 54 for (i = 0; i < str.size() && isspace(str[i]); ++i) {
53 } 55 }
54 GOOGLE_DCHECK(i == str.size() || !isspace(str[i])); 56 GOOGLE_DCHECK(i == str.size() || !isspace(str[i]));
55 return StringPiece(str, i); 57 return str.substr(i);
56 } 58 }
57 } // namespace 59 } // namespace
58 60
59 bool GetBoolOptionOrDefault( 61 bool GetBoolOptionOrDefault(
60 const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options, 62 const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
61 const string& option_name, bool default_value) { 63 const string& option_name, bool default_value) {
62 const google::protobuf::Option* opt = FindOptionOrNull(options, option_name); 64 const google::protobuf::Option* opt = FindOptionOrNull(options, option_name);
63 if (opt == NULL) { 65 if (opt == NULL) {
64 return default_value; 66 return default_value;
65 } 67 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 return i.value(); 123 return i.value();
122 } 124 }
123 125
124 string GetStringFromAny(const google::protobuf::Any& any) { 126 string GetStringFromAny(const google::protobuf::Any& any) {
125 google::protobuf::StringValue s; 127 google::protobuf::StringValue s;
126 ParseFromAny(any.value(), &s); 128 ParseFromAny(any.value(), &s);
127 return s.value(); 129 return s.value();
128 } 130 }
129 131
130 const StringPiece GetTypeWithoutUrl(StringPiece type_url) { 132 const StringPiece GetTypeWithoutUrl(StringPiece type_url) {
131 size_t idx = type_url.rfind('/'); 133 if (type_url.size() > kTypeUrlSize && type_url[kTypeUrlSize] == '/') {
132 return type_url.substr(idx + 1); 134 return type_url.substr(kTypeUrlSize + 1);
135 } else {
136 size_t idx = type_url.rfind('/');
137 return type_url.substr(idx + 1);
138 }
133 } 139 }
134 140
135 const string GetFullTypeWithUrl(StringPiece simple_type) { 141 const string GetFullTypeWithUrl(StringPiece simple_type) {
136 return StrCat(kTypeServiceBaseUrl, "/", simple_type); 142 return StrCat(kTypeServiceBaseUrl, "/", simple_type);
137 } 143 }
138 144
139 const google::protobuf::Option* FindOptionOrNull( 145 const google::protobuf::Option* FindOptionOrNull(
140 const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options, 146 const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
141 const string& option_name) { 147 const string& option_name) {
142 for (int i = 0; i < options.size(); ++i) { 148 for (int i = 0; i < options.size(); ++i) {
(...skipping 24 matching lines...) Expand all
167 for (int i = 0; i < type->fields_size(); ++i) { 173 for (int i = 0; i < type->fields_size(); ++i) {
168 const google::protobuf::Field& field = type->fields(i); 174 const google::protobuf::Field& field = type->fields(i);
169 if (field.json_name() == json_name) { 175 if (field.json_name() == json_name) {
170 return &field; 176 return &field;
171 } 177 }
172 } 178 }
173 } 179 }
174 return NULL; 180 return NULL;
175 } 181 }
176 182
183 const google::protobuf::Field* FindFieldInTypeByNumberOrNull(
184 const google::protobuf::Type* type, int32 number) {
185 if (type != NULL) {
186 for (int i = 0; i < type->fields_size(); ++i) {
187 const google::protobuf::Field& field = type->fields(i);
188 if (field.number() == number) {
189 return &field;
190 }
191 }
192 }
193 return NULL;
194 }
195
177 const google::protobuf::EnumValue* FindEnumValueByNameOrNull( 196 const google::protobuf::EnumValue* FindEnumValueByNameOrNull(
178 const google::protobuf::Enum* enum_type, StringPiece enum_name) { 197 const google::protobuf::Enum* enum_type, StringPiece enum_name) {
179 if (enum_type != NULL) { 198 if (enum_type != NULL) {
180 for (int i = 0; i < enum_type->enumvalue_size(); ++i) { 199 for (int i = 0; i < enum_type->enumvalue_size(); ++i) {
181 const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i); 200 const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i);
182 if (enum_value.name() == enum_name) { 201 if (enum_value.name() == enum_name) {
183 return &enum_value; 202 return &enum_value;
184 } 203 }
185 } 204 }
186 } 205 }
187 return NULL; 206 return NULL;
188 } 207 }
189 208
190 const google::protobuf::EnumValue* FindEnumValueByNumberOrNull( 209 const google::protobuf::EnumValue* FindEnumValueByNumberOrNull(
191 const google::protobuf::Enum* enum_type, int32 value) { 210 const google::protobuf::Enum* enum_type, int32 value) {
192 if (enum_type != NULL) { 211 if (enum_type != NULL) {
193 for (int i = 0; i < enum_type->enumvalue_size(); ++i) { 212 for (int i = 0; i < enum_type->enumvalue_size(); ++i) {
194 const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i); 213 const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i);
195 if (enum_value.number() == value) { 214 if (enum_value.number() == value) {
196 return &enum_value; 215 return &enum_value;
197 } 216 }
198 } 217 }
199 } 218 }
200 return NULL; 219 return NULL;
201 } 220 }
202 221
222 const google::protobuf::EnumValue* FindEnumValueByNameWithoutUnderscoreOrNull(
223 const google::protobuf::Enum* enum_type, StringPiece enum_name) {
224 if (enum_type != NULL) {
225 for (int i = 0; i < enum_type->enumvalue_size(); ++i) {
226 const google::protobuf::EnumValue& enum_value = enum_type->enumvalue(i);
227 string enum_name_without_underscore = enum_value.name();
228
229 // Remove underscore from the name.
230 enum_name_without_underscore.erase(
231 std::remove(enum_name_without_underscore.begin(),
232 enum_name_without_underscore.end(), '_'),
233 enum_name_without_underscore.end());
234 // Make the name uppercase.
235 for (string::iterator it = enum_name_without_underscore.begin();
236 it != enum_name_without_underscore.end(); ++it) {
237 *it = ascii_toupper(*it);
238 }
239
240 if (enum_name_without_underscore == enum_name) {
241 return &enum_value;
242 }
243 }
244 }
245 return NULL;
246 }
247
203 string ToCamelCase(const StringPiece input) { 248 string ToCamelCase(const StringPiece input) {
204 bool capitalize_next = false; 249 bool capitalize_next = false;
205 bool was_cap = true; 250 bool was_cap = true;
206 bool is_cap = false; 251 bool is_cap = false;
207 bool first_word = true; 252 bool first_word = true;
208 string result; 253 string result;
209 result.reserve(input.size()); 254 result.reserve(input.size());
210 255
211 for (size_t i = 0; i < input.size(); ++i, was_cap = is_cap) { 256 for (size_t i = 0; i < input.size(); ++i, was_cap = is_cap) {
212 is_cap = ascii_isupper(input[i]); 257 is_cap = ascii_isupper(input[i]);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 was_not_cap = false; 317 was_not_cap = false;
273 } else { 318 } else {
274 result.push_back(input[i]); 319 result.push_back(input[i]);
275 was_not_underscore = input[i] != '_'; 320 was_not_underscore = input[i] != '_';
276 was_not_cap = true; 321 was_not_cap = true;
277 } 322 }
278 } 323 }
279 return result; 324 return result;
280 } 325 }
281 326
282 set<string>* well_known_types_ = NULL; 327 std::set<string>* well_known_types_ = NULL;
283 GOOGLE_PROTOBUF_DECLARE_ONCE(well_known_types_init_); 328 GOOGLE_PROTOBUF_DECLARE_ONCE(well_known_types_init_);
284 const char* well_known_types_name_array_[] = { 329 const char* well_known_types_name_array_[] = {
285 "google.protobuf.Timestamp", "google.protobuf.Duration", 330 "google.protobuf.Timestamp", "google.protobuf.Duration",
286 "google.protobuf.DoubleValue", "google.protobuf.FloatValue", 331 "google.protobuf.DoubleValue", "google.protobuf.FloatValue",
287 "google.protobuf.Int64Value", "google.protobuf.UInt64Value", 332 "google.protobuf.Int64Value", "google.protobuf.UInt64Value",
288 "google.protobuf.Int32Value", "google.protobuf.UInt32Value", 333 "google.protobuf.Int32Value", "google.protobuf.UInt32Value",
289 "google.protobuf.BoolValue", "google.protobuf.StringValue", 334 "google.protobuf.BoolValue", "google.protobuf.StringValue",
290 "google.protobuf.BytesValue", "google.protobuf.FieldMask"}; 335 "google.protobuf.BytesValue", "google.protobuf.FieldMask"};
291 336
292 void DeleteWellKnownTypes() { delete well_known_types_; } 337 void DeleteWellKnownTypes() { delete well_known_types_; }
293 338
294 void InitWellKnownTypes() { 339 void InitWellKnownTypes() {
295 well_known_types_ = new set<string>; 340 well_known_types_ = new std::set<string>;
296 for (int i = 0; i < GOOGLE_ARRAYSIZE(well_known_types_name_array_); ++i) { 341 for (int i = 0; i < GOOGLE_ARRAYSIZE(well_known_types_name_array_); ++i) {
297 well_known_types_->insert(well_known_types_name_array_[i]); 342 well_known_types_->insert(well_known_types_name_array_[i]);
298 } 343 }
299 google::protobuf::internal::OnShutdown(&DeleteWellKnownTypes); 344 google::protobuf::internal::OnShutdown(&DeleteWellKnownTypes);
300 } 345 }
301 346
302 bool IsWellKnownType(const string& type_name) { 347 bool IsWellKnownType(const string& type_name) {
303 InitWellKnownTypes(); 348 InitWellKnownTypes();
304 return ContainsKey(*well_known_types_, type_name); 349 return ContainsKey(*well_known_types_, type_name);
305 } 350 }
306 351
307 bool IsValidBoolString(const string& bool_string) { 352 bool IsValidBoolString(const string& bool_string) {
308 return bool_string == "true" || bool_string == "false" || 353 return bool_string == "true" || bool_string == "false" ||
309 bool_string == "1" || bool_string == "0"; 354 bool_string == "1" || bool_string == "0";
310 } 355 }
311 356
312 bool IsMap(const google::protobuf::Field& field, 357 bool IsMap(const google::protobuf::Field& field,
313 const google::protobuf::Type& type) { 358 const google::protobuf::Type& type) {
314 return (field.cardinality() == 359 return (
315 google::protobuf::Field_Cardinality_CARDINALITY_REPEATED && 360 field.cardinality() ==
316 GetBoolOptionOrDefault(type.options(), 361 google::protobuf::Field_Cardinality_CARDINALITY_REPEATED &&
317 "google.protobuf.MessageOptions.map_entry", fal se)); 362 (GetBoolOptionOrDefault(
363 type.options(), "google.protobuf.MessageOptions.map_entry", false) ||
364 GetBoolOptionOrDefault(type.options(), "proto2.MessageOptions.map_entry",
365 false)));
318 } 366 }
319 367
320 bool IsMessageSetWireFormat(const google::protobuf::Type& type) { 368 bool IsMessageSetWireFormat(const google::protobuf::Type& type) {
321 return GetBoolOptionOrDefault( 369 return (
322 type.options(), "google.protobuf.MessageOptions.message_set_wire_format", false); 370 GetBoolOptionOrDefault(
371 type.options(),
372 "google.protobuf.MessageOptions.message_set_wire_format", false) ||
373 GetBoolOptionOrDefault(type.options(),
374 "proto2.MessageOptions.message_set_wire_format",
375 false));
323 } 376 }
324 377
325 string DoubleAsString(double value) { 378 string DoubleAsString(double value) {
326 if (MathLimits<double>::IsPosInf(value)) return "Infinity"; 379 if (MathLimits<double>::IsPosInf(value)) return "Infinity";
327 if (MathLimits<double>::IsNegInf(value)) return "-Infinity"; 380 if (MathLimits<double>::IsNegInf(value)) return "-Infinity";
328 if (MathLimits<double>::IsNaN(value)) return "NaN"; 381 if (MathLimits<double>::IsNaN(value)) return "NaN";
329 382
330 return SimpleDtoa(value); 383 return SimpleDtoa(value);
331 } 384 }
332 385
(...skipping 19 matching lines...) Expand all
352 } 405 }
353 406
354 *value = static_cast<float>(double_value); 407 *value = static_cast<float>(double_value);
355 return true; 408 return true;
356 } 409 }
357 410
358 } // namespace converter 411 } // namespace converter
359 } // namespace util 412 } // namespace util
360 } // namespace protobuf 413 } // namespace protobuf
361 } // namespace google 414 } // namespace google
415
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698