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

Side by Side Diff: third_party/protobuf/src/google/protobuf/extension_set.cc

Issue 2495533002: third_party/protobuf: Update to HEAD (83d681ee2c) (Closed)
Patch Set: Make chrome settings proto generated file a component Created 4 years 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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 return false; 69 return false;
70 70
71 // Do not add a default statement. Let the compiler complain when someone 71 // Do not add a default statement. Let the compiler complain when someone
72 // adds a new wire type. 72 // adds a new wire type.
73 } 73 }
74 GOOGLE_LOG(FATAL) << "can't reach here."; 74 GOOGLE_LOG(FATAL) << "can't reach here.";
75 return false; 75 return false;
76 } 76 }
77 77
78 // Registry stuff. 78 // Registry stuff.
79 typedef hash_map<pair<const MessageLite*, int>, 79 typedef hash_map<std::pair<const MessageLite*, int>,
80 ExtensionInfo> ExtensionRegistry; 80 ExtensionInfo> ExtensionRegistry;
81 ExtensionRegistry* registry_ = NULL; 81 ExtensionRegistry* registry_ = NULL;
82 GOOGLE_PROTOBUF_DECLARE_ONCE(registry_init_); 82 GOOGLE_PROTOBUF_DECLARE_ONCE(registry_init_);
83 83
84 void DeleteRegistry() { 84 void DeleteRegistry() {
85 delete registry_; 85 delete registry_;
86 registry_ = NULL; 86 registry_ = NULL;
87 } 87 }
88 88
89 void InitRegistry() { 89 void InitRegistry() {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 type == WireFormatLite::TYPE_GROUP); 170 type == WireFormatLite::TYPE_GROUP);
171 ExtensionInfo info(type, is_repeated, is_packed); 171 ExtensionInfo info(type, is_repeated, is_packed);
172 info.message_prototype = prototype; 172 info.message_prototype = prototype;
173 Register(containing_type, number, info); 173 Register(containing_type, number, info);
174 } 174 }
175 175
176 176
177 // =================================================================== 177 // ===================================================================
178 // Constructors and basic methods. 178 // Constructors and basic methods.
179 179
180 ExtensionSet::ExtensionSet(::google::protobuf::Arena* arena) : arena_(arena) { 180 ExtensionSet::ExtensionSet(::google::protobuf::Arena* arena)
181 : arena_(arena) {
181 if (arena_ != NULL) { 182 if (arena_ != NULL) {
182 arena_->OwnDestructor(&extensions_); 183 arena_->OwnDestructor(&extensions_);
183 } 184 }
184 } 185 }
185 186
186 ExtensionSet::ExtensionSet() : arena_(NULL) {} 187 ExtensionSet::ExtensionSet() : arena_(NULL) {}
187 188
188 ExtensionSet::~ExtensionSet() { 189 ExtensionSet::~ExtensionSet() {
189 // Deletes all allocated extensions. 190 // Deletes all allocated extensions.
190 if (arena_ == NULL) { 191 if (arena_ == NULL) {
191 for (map<int, Extension>::iterator iter = extensions_.begin(); 192 for (ExtensionMap::iterator iter = extensions_.begin();
192 iter != extensions_.end(); ++iter) { 193 iter != extensions_.end(); ++iter) {
193 iter->second.Free(); 194 iter->second.Free();
194 } 195 }
195 } 196 }
196 } 197 }
197 198
198 // Defined in extension_set_heavy.cc. 199 // Defined in extension_set_heavy.cc.
199 // void ExtensionSet::AppendToList(const Descriptor* containing_type, 200 // void ExtensionSet::AppendToList(const Descriptor* containing_type,
200 // const DescriptorPool* pool, 201 // const DescriptorPool* pool,
201 // vector<const FieldDescriptor*>* output) const 202 // vector<const FieldDescriptor*>* output) const
202 203
203 bool ExtensionSet::Has(int number) const { 204 bool ExtensionSet::Has(int number) const {
204 map<int, Extension>::const_iterator iter = extensions_.find(number); 205 ExtensionMap::const_iterator iter = extensions_.find(number);
205 if (iter == extensions_.end()) return false; 206 if (iter == extensions_.end()) return false;
206 GOOGLE_DCHECK(!iter->second.is_repeated); 207 GOOGLE_DCHECK(!iter->second.is_repeated);
207 return !iter->second.is_cleared; 208 return !iter->second.is_cleared;
208 } 209 }
209 210
210 int ExtensionSet::NumExtensions() const { 211 int ExtensionSet::NumExtensions() const {
211 int result = 0; 212 int result = 0;
212 for (map<int, Extension>::const_iterator iter = extensions_.begin(); 213 for (ExtensionMap::const_iterator iter = extensions_.begin();
213 iter != extensions_.end(); ++iter) { 214 iter != extensions_.end(); ++iter) {
214 if (!iter->second.is_cleared) { 215 if (!iter->second.is_cleared) {
215 ++result; 216 ++result;
216 } 217 }
217 } 218 }
218 return result; 219 return result;
219 } 220 }
220 221
221 int ExtensionSet::ExtensionSize(int number) const { 222 int ExtensionSet::ExtensionSize(int number) const {
222 map<int, Extension>::const_iterator iter = extensions_.find(number); 223 ExtensionMap::const_iterator iter = extensions_.find(number);
223 if (iter == extensions_.end()) return false; 224 if (iter == extensions_.end()) return false;
224 return iter->second.GetSize(); 225 return iter->second.GetSize();
225 } 226 }
226 227
227 FieldType ExtensionSet::ExtensionType(int number) const { 228 FieldType ExtensionSet::ExtensionType(int number) const {
228 map<int, Extension>::const_iterator iter = extensions_.find(number); 229 ExtensionMap::const_iterator iter = extensions_.find(number);
229 if (iter == extensions_.end()) { 230 if (iter == extensions_.end()) {
230 GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present ( 1). "; 231 GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present ( 1). ";
231 return 0; 232 return 0;
232 } 233 }
233 if (iter->second.is_cleared) { 234 if (iter->second.is_cleared) {
234 GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present ( 2). "; 235 GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present ( 2). ";
235 } 236 }
236 return iter->second.type; 237 return iter->second.type;
237 } 238 }
238 239
239 void ExtensionSet::ClearExtension(int number) { 240 void ExtensionSet::ClearExtension(int number) {
240 map<int, Extension>::iterator iter = extensions_.find(number); 241 ExtensionMap::iterator iter = extensions_.find(number);
241 if (iter == extensions_.end()) return; 242 if (iter == extensions_.end()) return;
242 iter->second.Clear(); 243 iter->second.Clear();
243 } 244 }
244 245
245 // =================================================================== 246 // ===================================================================
246 // Field accessors 247 // Field accessors
247 248
248 namespace { 249 namespace {
249 250
250 enum Cardinality { 251 enum Cardinality {
251 REPEATED, 252 REPEATED,
252 OPTIONAL 253 OPTIONAL
253 }; 254 };
254 255
255 } // namespace 256 } // namespace
256 257
257 #define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE) \ 258 #define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE) \
258 GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? REPEATED : OPTIONAL, LABEL); \ 259 GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? REPEATED : OPTIONAL, LABEL); \
259 GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), WireFormatLite::CPPTYPE_##CPPTYPE ) 260 GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), WireFormatLite::CPPTYPE_##CPPTYPE )
260 261
261 // ------------------------------------------------------------------- 262 // -------------------------------------------------------------------
262 // Primitives 263 // Primitives
263 264
264 #define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE) \ 265 #define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE) \
265 \ 266 \
266 LOWERCASE ExtensionSet::Get##CAMELCASE(int number, \ 267 LOWERCASE ExtensionSet::Get##CAMELCASE(int number, \
267 LOWERCASE default_value) const { \ 268 LOWERCASE default_value) const { \
268 map<int, Extension>::const_iterator iter = extensions_.find(number); \ 269 ExtensionMap::const_iterator iter = extensions_.find(number); \
269 if (iter == extensions_.end() || iter->second.is_cleared) { \ 270 if (iter == extensions_.end() || iter->second.is_cleared) { \
270 return default_value; \ 271 return default_value; \
271 } else { \ 272 } else { \
272 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, UPPERCASE); \ 273 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, UPPERCASE); \
273 return iter->second.LOWERCASE##_value; \ 274 return iter->second.LOWERCASE##_value; \
274 } \ 275 } \
275 } \ 276 } \
276 \ 277 \
277 void ExtensionSet::Set##CAMELCASE(int number, FieldType type, \ 278 void ExtensionSet::Set##CAMELCASE(int number, FieldType type, \
278 LOWERCASE value, \ 279 LOWERCASE value, \
279 const FieldDescriptor* descriptor) { \ 280 const FieldDescriptor* descriptor) { \
280 Extension* extension; \ 281 Extension* extension; \
281 if (MaybeNewExtension(number, descriptor, &extension)) { \ 282 if (MaybeNewExtension(number, descriptor, &extension)) { \
282 extension->type = type; \ 283 extension->type = type; \
283 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERC ASE); \ 284 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERC ASE); \
284 extension->is_repeated = false; \ 285 extension->is_repeated = false; \
285 } else { \ 286 } else { \
286 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, UPPERCASE); \ 287 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, UPPERCASE); \
287 } \ 288 } \
288 extension->is_cleared = false; \ 289 extension->is_cleared = false; \
289 extension->LOWERCASE##_value = value; \ 290 extension->LOWERCASE##_value = value; \
290 } \ 291 } \
291 \ 292 \
292 LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) const { \ 293 LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) const { \
293 map<int, Extension>::const_iterator iter = extensions_.find(number); \ 294 ExtensionMap::const_iterator iter = extensions_.find(number); \
294 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; \ 295 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; \
295 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \ 296 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \
296 return iter->second.repeated_##LOWERCASE##_value->Get(index); \ 297 return iter->second.repeated_##LOWERCASE##_value->Get(index); \
297 } \ 298 } \
298 \ 299 \
299 void ExtensionSet::SetRepeated##CAMELCASE( \ 300 void ExtensionSet::SetRepeated##CAMELCASE( \
300 int number, int index, LOWERCASE value) { \ 301 int number, int index, LOWERCASE value) { \
301 map<int, Extension>::iterator iter = extensions_.find(number); \ 302 ExtensionMap::iterator iter = extensions_.find(number); \
302 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; \ 303 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; \
303 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \ 304 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \
304 iter->second.repeated_##LOWERCASE##_value->Set(index, value); \ 305 iter->second.repeated_##LOWERCASE##_value->Set(index, value); \
305 } \ 306 } \
306 \ 307 \
307 void ExtensionSet::Add##CAMELCASE(int number, FieldType type, \ 308 void ExtensionSet::Add##CAMELCASE(int number, FieldType type, \
308 bool packed, LOWERCASE value, \ 309 bool packed, LOWERCASE value, \
309 const FieldDescriptor* descriptor) { \ 310 const FieldDescriptor* descriptor) { \
310 Extension* extension; \ 311 Extension* extension; \
311 if (MaybeNewExtension(number, descriptor, &extension)) { \ 312 if (MaybeNewExtension(number, descriptor, &extension)) { \
(...skipping 15 matching lines...) Expand all
327 PRIMITIVE_ACCESSORS(UINT32, uint32, UInt32) 328 PRIMITIVE_ACCESSORS(UINT32, uint32, UInt32)
328 PRIMITIVE_ACCESSORS(UINT64, uint64, UInt64) 329 PRIMITIVE_ACCESSORS(UINT64, uint64, UInt64)
329 PRIMITIVE_ACCESSORS( FLOAT, float, Float) 330 PRIMITIVE_ACCESSORS( FLOAT, float, Float)
330 PRIMITIVE_ACCESSORS(DOUBLE, double, Double) 331 PRIMITIVE_ACCESSORS(DOUBLE, double, Double)
331 PRIMITIVE_ACCESSORS( BOOL, bool, Bool) 332 PRIMITIVE_ACCESSORS( BOOL, bool, Bool)
332 333
333 #undef PRIMITIVE_ACCESSORS 334 #undef PRIMITIVE_ACCESSORS
334 335
335 const void* ExtensionSet::GetRawRepeatedField(int number, 336 const void* ExtensionSet::GetRawRepeatedField(int number,
336 const void* default_value) const { 337 const void* default_value) const {
337 map<int, Extension>::const_iterator iter = extensions_.find(number); 338 ExtensionMap::const_iterator iter = extensions_.find(number);
338 if (iter == extensions_.end()) { 339 if (iter == extensions_.end()) {
339 return default_value; 340 return default_value;
340 } 341 }
341 // We assume that all the RepeatedField<>* pointers have the same 342 // We assume that all the RepeatedField<>* pointers have the same
342 // size and alignment within the anonymous union in Extension. 343 // size and alignment within the anonymous union in Extension.
343 return iter->second.repeated_int32_value; 344 return iter->second.repeated_int32_value;
344 } 345 }
345 346
346 void* ExtensionSet::MutableRawRepeatedField(int number, FieldType field_type, 347 void* ExtensionSet::MutableRawRepeatedField(int number, FieldType field_type,
347 bool packed, 348 bool packed,
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 } 402 }
402 403
403 // We assume that all the RepeatedField<>* pointers have the same 404 // We assume that all the RepeatedField<>* pointers have the same
404 // size and alignment within the anonymous union in Extension. 405 // size and alignment within the anonymous union in Extension.
405 return extension->repeated_int32_value; 406 return extension->repeated_int32_value;
406 } 407 }
407 408
408 // Compatible version using old call signature. Does not create extensions when 409 // Compatible version using old call signature. Does not create extensions when
409 // the don't already exist; instead, just GOOGLE_CHECK-fails. 410 // the don't already exist; instead, just GOOGLE_CHECK-fails.
410 void* ExtensionSet::MutableRawRepeatedField(int number) { 411 void* ExtensionSet::MutableRawRepeatedField(int number) {
411 map<int, Extension>::iterator iter = extensions_.find(number); 412 ExtensionMap::iterator iter = extensions_.find(number);
412 GOOGLE_CHECK(iter == extensions_.end()) << "Extension not found."; 413 GOOGLE_CHECK(iter == extensions_.end()) << "Extension not found.";
413 // We assume that all the RepeatedField<>* pointers have the same 414 // We assume that all the RepeatedField<>* pointers have the same
414 // size and alignment within the anonymous union in Extension. 415 // size and alignment within the anonymous union in Extension.
415 return iter->second.repeated_int32_value; 416 return iter->second.repeated_int32_value;
416 } 417 }
417 418
418 419
419 // ------------------------------------------------------------------- 420 // -------------------------------------------------------------------
420 // Enums 421 // Enums
421 422
422 int ExtensionSet::GetEnum(int number, int default_value) const { 423 int ExtensionSet::GetEnum(int number, int default_value) const {
423 map<int, Extension>::const_iterator iter = extensions_.find(number); 424 ExtensionMap::const_iterator iter = extensions_.find(number);
424 if (iter == extensions_.end() || iter->second.is_cleared) { 425 if (iter == extensions_.end() || iter->second.is_cleared) {
425 // Not present. Return the default value. 426 // Not present. Return the default value.
426 return default_value; 427 return default_value;
427 } else { 428 } else {
428 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, ENUM); 429 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, ENUM);
429 return iter->second.enum_value; 430 return iter->second.enum_value;
430 } 431 }
431 } 432 }
432 433
433 void ExtensionSet::SetEnum(int number, FieldType type, int value, 434 void ExtensionSet::SetEnum(int number, FieldType type, int value,
434 const FieldDescriptor* descriptor) { 435 const FieldDescriptor* descriptor) {
435 Extension* extension; 436 Extension* extension;
436 if (MaybeNewExtension(number, descriptor, &extension)) { 437 if (MaybeNewExtension(number, descriptor, &extension)) {
437 extension->type = type; 438 extension->type = type;
438 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM); 439 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM);
439 extension->is_repeated = false; 440 extension->is_repeated = false;
440 } else { 441 } else {
441 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, ENUM); 442 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, ENUM);
442 } 443 }
443 extension->is_cleared = false; 444 extension->is_cleared = false;
444 extension->enum_value = value; 445 extension->enum_value = value;
445 } 446 }
446 447
447 int ExtensionSet::GetRepeatedEnum(int number, int index) const { 448 int ExtensionSet::GetRepeatedEnum(int number, int index) const {
448 map<int, Extension>::const_iterator iter = extensions_.find(number); 449 ExtensionMap::const_iterator iter = extensions_.find(number);
449 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 450 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
450 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM); 451 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM);
451 return iter->second.repeated_enum_value->Get(index); 452 return iter->second.repeated_enum_value->Get(index);
452 } 453 }
453 454
454 void ExtensionSet::SetRepeatedEnum(int number, int index, int value) { 455 void ExtensionSet::SetRepeatedEnum(int number, int index, int value) {
455 map<int, Extension>::iterator iter = extensions_.find(number); 456 ExtensionMap::iterator iter = extensions_.find(number);
456 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 457 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
457 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM); 458 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM);
458 iter->second.repeated_enum_value->Set(index, value); 459 iter->second.repeated_enum_value->Set(index, value);
459 } 460 }
460 461
461 void ExtensionSet::AddEnum(int number, FieldType type, 462 void ExtensionSet::AddEnum(int number, FieldType type,
462 bool packed, int value, 463 bool packed, int value,
463 const FieldDescriptor* descriptor) { 464 const FieldDescriptor* descriptor) {
464 Extension* extension; 465 Extension* extension;
465 if (MaybeNewExtension(number, descriptor, &extension)) { 466 if (MaybeNewExtension(number, descriptor, &extension)) {
466 extension->type = type; 467 extension->type = type;
467 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM); 468 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM);
468 extension->is_repeated = true; 469 extension->is_repeated = true;
469 extension->is_packed = packed; 470 extension->is_packed = packed;
470 extension->repeated_enum_value = 471 extension->repeated_enum_value =
471 Arena::CreateMessage<RepeatedField<int> >(arena_); 472 Arena::CreateMessage<RepeatedField<int> >(arena_);
472 } else { 473 } else {
473 GOOGLE_DCHECK_TYPE(*extension, REPEATED, ENUM); 474 GOOGLE_DCHECK_TYPE(*extension, REPEATED, ENUM);
474 GOOGLE_DCHECK_EQ(extension->is_packed, packed); 475 GOOGLE_DCHECK_EQ(extension->is_packed, packed);
475 } 476 }
476 extension->repeated_enum_value->Add(value); 477 extension->repeated_enum_value->Add(value);
477 } 478 }
478 479
479 // ------------------------------------------------------------------- 480 // -------------------------------------------------------------------
480 // Strings 481 // Strings
481 482
482 const string& ExtensionSet::GetString(int number, 483 const string& ExtensionSet::GetString(int number,
483 const string& default_value) const { 484 const string& default_value) const {
484 map<int, Extension>::const_iterator iter = extensions_.find(number); 485 ExtensionMap::const_iterator iter = extensions_.find(number);
485 if (iter == extensions_.end() || iter->second.is_cleared) { 486 if (iter == extensions_.end() || iter->second.is_cleared) {
486 // Not present. Return the default value. 487 // Not present. Return the default value.
487 return default_value; 488 return default_value;
488 } else { 489 } else {
489 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, STRING); 490 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, STRING);
490 return *iter->second.string_value; 491 return *iter->second.string_value;
491 } 492 }
492 } 493 }
493 494
494 string* ExtensionSet::MutableString(int number, FieldType type, 495 string* ExtensionSet::MutableString(int number, FieldType type,
495 const FieldDescriptor* descriptor) { 496 const FieldDescriptor* descriptor) {
496 Extension* extension; 497 Extension* extension;
497 if (MaybeNewExtension(number, descriptor, &extension)) { 498 if (MaybeNewExtension(number, descriptor, &extension)) {
498 extension->type = type; 499 extension->type = type;
499 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING); 500 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);
500 extension->is_repeated = false; 501 extension->is_repeated = false;
501 extension->string_value = Arena::Create<string>(arena_); 502 extension->string_value = Arena::Create<string>(arena_);
502 } else { 503 } else {
503 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, STRING); 504 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, STRING);
504 } 505 }
505 extension->is_cleared = false; 506 extension->is_cleared = false;
506 return extension->string_value; 507 return extension->string_value;
507 } 508 }
508 509
509 const string& ExtensionSet::GetRepeatedString(int number, int index) const { 510 const string& ExtensionSet::GetRepeatedString(int number, int index) const {
510 map<int, Extension>::const_iterator iter = extensions_.find(number); 511 ExtensionMap::const_iterator iter = extensions_.find(number);
511 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 512 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
512 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING); 513 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);
513 return iter->second.repeated_string_value->Get(index); 514 return iter->second.repeated_string_value->Get(index);
514 } 515 }
515 516
516 string* ExtensionSet::MutableRepeatedString(int number, int index) { 517 string* ExtensionSet::MutableRepeatedString(int number, int index) {
517 map<int, Extension>::iterator iter = extensions_.find(number); 518 ExtensionMap::iterator iter = extensions_.find(number);
518 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 519 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
519 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING); 520 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);
520 return iter->second.repeated_string_value->Mutable(index); 521 return iter->second.repeated_string_value->Mutable(index);
521 } 522 }
522 523
523 string* ExtensionSet::AddString(int number, FieldType type, 524 string* ExtensionSet::AddString(int number, FieldType type,
524 const FieldDescriptor* descriptor) { 525 const FieldDescriptor* descriptor) {
525 Extension* extension; 526 Extension* extension;
526 if (MaybeNewExtension(number, descriptor, &extension)) { 527 if (MaybeNewExtension(number, descriptor, &extension)) {
527 extension->type = type; 528 extension->type = type;
528 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING); 529 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);
529 extension->is_repeated = true; 530 extension->is_repeated = true;
530 extension->is_packed = false; 531 extension->is_packed = false;
531 extension->repeated_string_value = 532 extension->repeated_string_value =
532 Arena::CreateMessage<RepeatedPtrField<string> >(arena_); 533 Arena::CreateMessage<RepeatedPtrField<string> >(arena_);
533 } else { 534 } else {
534 GOOGLE_DCHECK_TYPE(*extension, REPEATED, STRING); 535 GOOGLE_DCHECK_TYPE(*extension, REPEATED, STRING);
535 } 536 }
536 return extension->repeated_string_value->Add(); 537 return extension->repeated_string_value->Add();
537 } 538 }
538 539
539 // ------------------------------------------------------------------- 540 // -------------------------------------------------------------------
540 // Messages 541 // Messages
541 542
542 const MessageLite& ExtensionSet::GetMessage( 543 const MessageLite& ExtensionSet::GetMessage(
543 int number, const MessageLite& default_value) const { 544 int number, const MessageLite& default_value) const {
544 map<int, Extension>::const_iterator iter = extensions_.find(number); 545 ExtensionMap::const_iterator iter = extensions_.find(number);
545 if (iter == extensions_.end()) { 546 if (iter == extensions_.end()) {
546 // Not present. Return the default value. 547 // Not present. Return the default value.
547 return default_value; 548 return default_value;
548 } else { 549 } else {
549 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); 550 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);
550 if (iter->second.is_lazy) { 551 if (iter->second.is_lazy) {
551 return iter->second.lazymessage_value->GetMessage(default_value); 552 return iter->second.lazymessage_value->GetMessage(default_value);
552 } else { 553 } else {
553 return *iter->second.message_value; 554 return *iter->second.message_value;
554 } 555 }
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 } 658 }
658 extension->message_value = message; 659 extension->message_value = message;
659 } 660 }
660 } 661 }
661 extension->is_cleared = false; 662 extension->is_cleared = false;
662 } 663 }
663 664
664 665
665 MessageLite* ExtensionSet::ReleaseMessage(int number, 666 MessageLite* ExtensionSet::ReleaseMessage(int number,
666 const MessageLite& prototype) { 667 const MessageLite& prototype) {
667 map<int, Extension>::iterator iter = extensions_.find(number); 668 ExtensionMap::iterator iter = extensions_.find(number);
668 if (iter == extensions_.end()) { 669 if (iter == extensions_.end()) {
669 // Not present. Return NULL. 670 // Not present. Return NULL.
670 return NULL; 671 return NULL;
671 } else { 672 } else {
672 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); 673 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);
673 MessageLite* ret = NULL; 674 MessageLite* ret = NULL;
674 if (iter->second.is_lazy) { 675 if (iter->second.is_lazy) {
675 ret = iter->second.lazymessage_value->ReleaseMessage(prototype); 676 ret = iter->second.lazymessage_value->ReleaseMessage(prototype);
676 if (arena_ == NULL) { 677 if (arena_ == NULL) {
677 delete iter->second.lazymessage_value; 678 delete iter->second.lazymessage_value;
678 } 679 }
679 } else { 680 } else {
680 if (arena_ == NULL) { 681 if (arena_ == NULL) {
681 ret = iter->second.message_value; 682 ret = iter->second.message_value;
682 } else { 683 } else {
683 // ReleaseMessage() always returns a heap-allocated message, and we are 684 // ReleaseMessage() always returns a heap-allocated message, and we are
684 // on an arena, so we need to make a copy of this message to return. 685 // on an arena, so we need to make a copy of this message to return.
685 ret = (iter->second.message_value)->New(); 686 ret = (iter->second.message_value)->New();
686 ret->CheckTypeAndMergeFrom(*iter->second.message_value); 687 ret->CheckTypeAndMergeFrom(*iter->second.message_value);
687 } 688 }
688 } 689 }
689 extensions_.erase(number); 690 extensions_.erase(number);
690 return ret; 691 return ret;
691 } 692 }
692 } 693 }
693 694
694 MessageLite* ExtensionSet::UnsafeArenaReleaseMessage( 695 MessageLite* ExtensionSet::UnsafeArenaReleaseMessage(
695 int number, const MessageLite& prototype) { 696 int number, const MessageLite& prototype) {
696 map<int, Extension>::iterator iter = extensions_.find(number); 697 ExtensionMap::iterator iter = extensions_.find(number);
697 if (iter == extensions_.end()) { 698 if (iter == extensions_.end()) {
698 // Not present. Return NULL. 699 // Not present. Return NULL.
699 return NULL; 700 return NULL;
700 } else { 701 } else {
701 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); 702 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);
702 MessageLite* ret = NULL; 703 MessageLite* ret = NULL;
703 if (iter->second.is_lazy) { 704 if (iter->second.is_lazy) {
704 ret = 705 ret =
705 iter->second.lazymessage_value->UnsafeArenaReleaseMessage(prototype); 706 iter->second.lazymessage_value->UnsafeArenaReleaseMessage(prototype);
706 if (arena_ == NULL) { 707 if (arena_ == NULL) {
707 delete iter->second.lazymessage_value; 708 delete iter->second.lazymessage_value;
708 } 709 }
709 } else { 710 } else {
710 ret = iter->second.message_value; 711 ret = iter->second.message_value;
711 } 712 }
712 extensions_.erase(number); 713 extensions_.erase(number);
713 return ret; 714 return ret;
714 } 715 }
715 } 716 }
716 717
717 // Defined in extension_set_heavy.cc. 718 // Defined in extension_set_heavy.cc.
718 // MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor, 719 // MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor,
719 // MessageFactory* factory); 720 // MessageFactory* factory);
720 721
721 const MessageLite& ExtensionSet::GetRepeatedMessage( 722 const MessageLite& ExtensionSet::GetRepeatedMessage(
722 int number, int index) const { 723 int number, int index) const {
723 map<int, Extension>::const_iterator iter = extensions_.find(number); 724 ExtensionMap::const_iterator iter = extensions_.find(number);
724 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 725 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
725 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE); 726 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE);
726 return iter->second.repeated_message_value->Get(index); 727 return iter->second.repeated_message_value->Get(index);
727 } 728 }
728 729
729 MessageLite* ExtensionSet::MutableRepeatedMessage(int number, int index) { 730 MessageLite* ExtensionSet::MutableRepeatedMessage(int number, int index) {
730 map<int, Extension>::iterator iter = extensions_.find(number); 731 ExtensionMap::iterator iter = extensions_.find(number);
731 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 732 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
732 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE); 733 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE);
733 return iter->second.repeated_message_value->Mutable(index); 734 return iter->second.repeated_message_value->Mutable(index);
734 } 735 }
735 736
736 MessageLite* ExtensionSet::AddMessage(int number, FieldType type, 737 MessageLite* ExtensionSet::AddMessage(int number, FieldType type,
737 const MessageLite& prototype, 738 const MessageLite& prototype,
738 const FieldDescriptor* descriptor) { 739 const FieldDescriptor* descriptor) {
739 Extension* extension; 740 Extension* extension;
740 if (MaybeNewExtension(number, descriptor, &extension)) { 741 if (MaybeNewExtension(number, descriptor, &extension)) {
(...skipping 18 matching lines...) Expand all
759 } 760 }
760 761
761 // Defined in extension_set_heavy.cc. 762 // Defined in extension_set_heavy.cc.
762 // MessageLite* ExtensionSet::AddMessage(int number, FieldType type, 763 // MessageLite* ExtensionSet::AddMessage(int number, FieldType type,
763 // const Descriptor* message_type, 764 // const Descriptor* message_type,
764 // MessageFactory* factory) 765 // MessageFactory* factory)
765 766
766 #undef GOOGLE_DCHECK_TYPE 767 #undef GOOGLE_DCHECK_TYPE
767 768
768 void ExtensionSet::RemoveLast(int number) { 769 void ExtensionSet::RemoveLast(int number) {
769 map<int, Extension>::iterator iter = extensions_.find(number); 770 ExtensionMap::iterator iter = extensions_.find(number);
770 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 771 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
771 772
772 Extension* extension = &iter->second; 773 Extension* extension = &iter->second;
773 GOOGLE_DCHECK(extension->is_repeated); 774 GOOGLE_DCHECK(extension->is_repeated);
774 775
775 switch(cpp_type(extension->type)) { 776 switch(cpp_type(extension->type)) {
776 case WireFormatLite::CPPTYPE_INT32: 777 case WireFormatLite::CPPTYPE_INT32:
777 extension->repeated_int32_value->RemoveLast(); 778 extension->repeated_int32_value->RemoveLast();
778 break; 779 break;
779 case WireFormatLite::CPPTYPE_INT64: 780 case WireFormatLite::CPPTYPE_INT64:
(...skipping 20 matching lines...) Expand all
800 case WireFormatLite::CPPTYPE_STRING: 801 case WireFormatLite::CPPTYPE_STRING:
801 extension->repeated_string_value->RemoveLast(); 802 extension->repeated_string_value->RemoveLast();
802 break; 803 break;
803 case WireFormatLite::CPPTYPE_MESSAGE: 804 case WireFormatLite::CPPTYPE_MESSAGE:
804 extension->repeated_message_value->RemoveLast(); 805 extension->repeated_message_value->RemoveLast();
805 break; 806 break;
806 } 807 }
807 } 808 }
808 809
809 MessageLite* ExtensionSet::ReleaseLast(int number) { 810 MessageLite* ExtensionSet::ReleaseLast(int number) {
810 map<int, Extension>::iterator iter = extensions_.find(number); 811 ExtensionMap::iterator iter = extensions_.find(number);
811 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 812 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
812 813
813 Extension* extension = &iter->second; 814 Extension* extension = &iter->second;
814 GOOGLE_DCHECK(extension->is_repeated); 815 GOOGLE_DCHECK(extension->is_repeated);
815 GOOGLE_DCHECK(cpp_type(extension->type) == WireFormatLite::CPPTYPE_MESSAGE); 816 GOOGLE_DCHECK(cpp_type(extension->type) == WireFormatLite::CPPTYPE_MESSAGE);
816 return extension->repeated_message_value->ReleaseLast(); 817 return extension->repeated_message_value->ReleaseLast();
817 } 818 }
818 819
819 void ExtensionSet::SwapElements(int number, int index1, int index2) { 820 void ExtensionSet::SwapElements(int number, int index1, int index2) {
820 map<int, Extension>::iterator iter = extensions_.find(number); 821 ExtensionMap::iterator iter = extensions_.find(number);
821 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 822 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
822 823
823 Extension* extension = &iter->second; 824 Extension* extension = &iter->second;
824 GOOGLE_DCHECK(extension->is_repeated); 825 GOOGLE_DCHECK(extension->is_repeated);
825 826
826 switch(cpp_type(extension->type)) { 827 switch(cpp_type(extension->type)) {
827 case WireFormatLite::CPPTYPE_INT32: 828 case WireFormatLite::CPPTYPE_INT32:
828 extension->repeated_int32_value->SwapElements(index1, index2); 829 extension->repeated_int32_value->SwapElements(index1, index2);
829 break; 830 break;
830 case WireFormatLite::CPPTYPE_INT64: 831 case WireFormatLite::CPPTYPE_INT64:
(...skipping 22 matching lines...) Expand all
853 break; 854 break;
854 case WireFormatLite::CPPTYPE_MESSAGE: 855 case WireFormatLite::CPPTYPE_MESSAGE:
855 extension->repeated_message_value->SwapElements(index1, index2); 856 extension->repeated_message_value->SwapElements(index1, index2);
856 break; 857 break;
857 } 858 }
858 } 859 }
859 860
860 // =================================================================== 861 // ===================================================================
861 862
862 void ExtensionSet::Clear() { 863 void ExtensionSet::Clear() {
863 for (map<int, Extension>::iterator iter = extensions_.begin(); 864 for (ExtensionMap::iterator iter = extensions_.begin();
864 iter != extensions_.end(); ++iter) { 865 iter != extensions_.end(); ++iter) {
865 iter->second.Clear(); 866 iter->second.Clear();
866 } 867 }
867 } 868 }
868 869
869 void ExtensionSet::MergeFrom(const ExtensionSet& other) { 870 void ExtensionSet::MergeFrom(const ExtensionSet& other) {
870 for (map<int, Extension>::const_iterator iter = other.extensions_.begin(); 871 for (ExtensionMap::const_iterator iter = other.extensions_.begin();
871 iter != other.extensions_.end(); ++iter) { 872 iter != other.extensions_.end(); ++iter) {
872 const Extension& other_extension = iter->second; 873 const Extension& other_extension = iter->second;
873 InternalExtensionMergeFrom(iter->first, other_extension); 874 InternalExtensionMergeFrom(iter->first, other_extension);
874 } 875 }
875 } 876 }
876 877
877 void ExtensionSet::InternalExtensionMergeFrom( 878 void ExtensionSet::InternalExtensionMergeFrom(
878 int number, const Extension& other_extension) { 879 int number, const Extension& other_extension) {
879 if (other_extension.is_repeated) { 880 if (other_extension.is_repeated) {
880 Extension* extension; 881 Extension* extension;
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1024 x->Clear(); 1025 x->Clear();
1025 x->MergeFrom(*this); 1026 x->MergeFrom(*this);
1026 Clear(); 1027 Clear();
1027 MergeFrom(extension_set); 1028 MergeFrom(extension_set);
1028 } 1029 }
1029 } 1030 }
1030 1031
1031 void ExtensionSet::SwapExtension(ExtensionSet* other, 1032 void ExtensionSet::SwapExtension(ExtensionSet* other,
1032 int number) { 1033 int number) {
1033 if (this == other) return; 1034 if (this == other) return;
1034 map<int, Extension>::iterator this_iter = extensions_.find(number); 1035 ExtensionMap::iterator this_iter = extensions_.find(number);
1035 map<int, Extension>::iterator other_iter = other->extensions_.find(number); 1036 ExtensionMap::iterator other_iter = other->extensions_.find(number);
1036 1037
1037 if (this_iter == extensions_.end() && 1038 if (this_iter == extensions_.end() &&
1038 other_iter == other->extensions_.end()) { 1039 other_iter == other->extensions_.end()) {
1039 return; 1040 return;
1040 } 1041 }
1041 1042
1042 if (this_iter != extensions_.end() && 1043 if (this_iter != extensions_.end() &&
1043 other_iter != other->extensions_.end()) { 1044 other_iter != other->extensions_.end()) {
1044 if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { 1045 if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
1045 using std::swap; 1046 using std::swap;
1046 swap(this_iter->second, other_iter->second); 1047 swap(this_iter->second, other_iter->second);
1047 } else { 1048 } else {
1048 // TODO(cfallin, rohananil): We could further optimize these cases, 1049 // TODO(cfallin, rohananil): We could further optimize these cases,
1049 // especially avoid creation of ExtensionSet, and move MergeFrom logic 1050 // especially avoid creation of ExtensionSet, and move MergeFrom logic
1050 // into Extensions itself (which takes arena as an argument). 1051 // into Extensions itself (which takes arena as an argument).
1051 // We do it this way to reuse the copy-across-arenas logic already 1052 // We do it this way to reuse the copy-across-arenas logic already
1052 // implemented in ExtensionSet's MergeFrom. 1053 // implemented in ExtensionSet's MergeFrom.
1053 ExtensionSet temp; 1054 ExtensionSet temp;
1054 temp.InternalExtensionMergeFrom(number, other_iter->second); 1055 temp.InternalExtensionMergeFrom(number, other_iter->second);
1055 map<int, Extension>::iterator temp_iter = temp.extensions_.find(number); 1056 ExtensionMap::iterator temp_iter = temp.extensions_.find(number);
1056 other_iter->second.Clear(); 1057 other_iter->second.Clear();
1057 other->InternalExtensionMergeFrom(number, this_iter->second); 1058 other->InternalExtensionMergeFrom(number, this_iter->second);
1058 this_iter->second.Clear(); 1059 this_iter->second.Clear();
1059 InternalExtensionMergeFrom(number, temp_iter->second); 1060 InternalExtensionMergeFrom(number, temp_iter->second);
1060 } 1061 }
1061 return; 1062 return;
1062 } 1063 }
1063 1064
1064 if (this_iter == extensions_.end()) { 1065 if (this_iter == extensions_.end()) {
1065 if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { 1066 if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
(...skipping 12 matching lines...) Expand all
1078 other->InternalExtensionMergeFrom(number, this_iter->second); 1079 other->InternalExtensionMergeFrom(number, this_iter->second);
1079 } 1080 }
1080 extensions_.erase(number); 1081 extensions_.erase(number);
1081 return; 1082 return;
1082 } 1083 }
1083 } 1084 }
1084 1085
1085 bool ExtensionSet::IsInitialized() const { 1086 bool ExtensionSet::IsInitialized() const {
1086 // Extensions are never required. However, we need to check that all 1087 // Extensions are never required. However, we need to check that all
1087 // embedded messages are initialized. 1088 // embedded messages are initialized.
1088 for (map<int, Extension>::const_iterator iter = extensions_.begin(); 1089 for (ExtensionMap::const_iterator iter = extensions_.begin();
1089 iter != extensions_.end(); ++iter) { 1090 iter != extensions_.end(); ++iter) {
1090 const Extension& extension = iter->second; 1091 const Extension& extension = iter->second;
1091 if (cpp_type(extension.type) == WireFormatLite::CPPTYPE_MESSAGE) { 1092 if (cpp_type(extension.type) == WireFormatLite::CPPTYPE_MESSAGE) {
1092 if (extension.is_repeated) { 1093 if (extension.is_repeated) {
1093 for (int i = 0; i < extension.repeated_message_value->size(); i++) { 1094 for (int i = 0; i < extension.repeated_message_value->size(); i++) {
1094 if (!extension.repeated_message_value->Get(i).IsInitialized()) { 1095 if (!extension.repeated_message_value->Get(i).IsInitialized()) {
1095 return false; 1096 return false;
1096 } 1097 }
1097 } 1098 }
1098 } else { 1099 } else {
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
1338 // UnknownFieldSet* unknown_fields) 1339 // UnknownFieldSet* unknown_fields)
1339 1340
1340 // Defined in extension_set_heavy.cc. 1341 // Defined in extension_set_heavy.cc.
1341 // bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, 1342 // bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input,
1342 // const MessageLite* containing_type, 1343 // const MessageLite* containing_type,
1343 // UnknownFieldSet* unknown_fields); 1344 // UnknownFieldSet* unknown_fields);
1344 1345
1345 void ExtensionSet::SerializeWithCachedSizes( 1346 void ExtensionSet::SerializeWithCachedSizes(
1346 int start_field_number, int end_field_number, 1347 int start_field_number, int end_field_number,
1347 io::CodedOutputStream* output) const { 1348 io::CodedOutputStream* output) const {
1348 map<int, Extension>::const_iterator iter; 1349 ExtensionMap::const_iterator iter;
1349 for (iter = extensions_.lower_bound(start_field_number); 1350 for (iter = extensions_.lower_bound(start_field_number);
1350 iter != extensions_.end() && iter->first < end_field_number; 1351 iter != extensions_.end() && iter->first < end_field_number;
1351 ++iter) { 1352 ++iter) {
1352 iter->second.SerializeFieldWithCachedSizes(iter->first, output); 1353 iter->second.SerializeFieldWithCachedSizes(iter->first, output);
1353 } 1354 }
1354 } 1355 }
1355 1356
1356 int ExtensionSet::ByteSize() const { 1357 size_t ExtensionSet::ByteSize() const {
1357 int total_size = 0; 1358 size_t total_size = 0;
1358 1359
1359 for (map<int, Extension>::const_iterator iter = extensions_.begin(); 1360 for (ExtensionMap::const_iterator iter = extensions_.begin();
1360 iter != extensions_.end(); ++iter) { 1361 iter != extensions_.end(); ++iter) {
1361 total_size += iter->second.ByteSize(iter->first); 1362 total_size += iter->second.ByteSize(iter->first);
1362 } 1363 }
1363 1364
1364 return total_size; 1365 return total_size;
1365 } 1366 }
1366 1367
1367 // Defined in extension_set_heavy.cc. 1368 // Defined in extension_set_heavy.cc.
1368 // int ExtensionSet::SpaceUsedExcludingSelf() const 1369 // int ExtensionSet::SpaceUsedExcludingSelf() const
1369 1370
1370 bool ExtensionSet::MaybeNewExtension(int number, 1371 bool ExtensionSet::MaybeNewExtension(int number,
1371 const FieldDescriptor* descriptor, 1372 const FieldDescriptor* descriptor,
1372 Extension** result) { 1373 Extension** result) {
1373 pair<map<int, Extension>::iterator, bool> insert_result = 1374 std::pair<ExtensionMap::iterator, bool> insert_result =
1374 extensions_.insert(std::make_pair(number, Extension())); 1375 extensions_.insert(std::make_pair(number, Extension()));
1375 *result = &insert_result.first->second; 1376 *result = &insert_result.first->second;
1376 (*result)->descriptor = descriptor; 1377 (*result)->descriptor = descriptor;
1377 return insert_result.second; 1378 return insert_result.second;
1378 } 1379 }
1379 1380
1380 // =================================================================== 1381 // ===================================================================
1381 // Methods of ExtensionSet::Extension 1382 // Methods of ExtensionSet::Extension
1382 1383
1383 void ExtensionSet::Extension::Clear() { 1384 void ExtensionSet::Extension::Clear() {
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1528 if (is_lazy) { 1529 if (is_lazy) {
1529 lazymessage_value->WriteMessage(number, output); 1530 lazymessage_value->WriteMessage(number, output);
1530 } else { 1531 } else {
1531 WireFormatLite::WriteMessage(number, *message_value, output); 1532 WireFormatLite::WriteMessage(number, *message_value, output);
1532 } 1533 }
1533 break; 1534 break;
1534 } 1535 }
1535 } 1536 }
1536 } 1537 }
1537 1538
1538 int ExtensionSet::Extension::ByteSize(int number) const { 1539 size_t ExtensionSet::Extension::ByteSize(int number) const {
1539 int result = 0; 1540 size_t result = 0;
1540 1541
1541 if (is_repeated) { 1542 if (is_repeated) {
1542 if (is_packed) { 1543 if (is_packed) {
1543 switch (real_type(type)) { 1544 switch (real_type(type)) {
1544 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1545 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1545 case WireFormatLite::TYPE_##UPPERCASE: \ 1546 case WireFormatLite::TYPE_##UPPERCASE: \
1546 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ 1547 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
1547 result += WireFormatLite::CAMELCASE##Size( \ 1548 result += WireFormatLite::CAMELCASE##Size( \
1548 repeated_##LOWERCASE##_value->Get(i)); \ 1549 repeated_##LOWERCASE##_value->Get(i)); \
1549 } \ 1550 } \
1550 break 1551 break
1551 1552
1552 HANDLE_TYPE( INT32, Int32, int32); 1553 HANDLE_TYPE( INT32, Int32, int32);
1553 HANDLE_TYPE( INT64, Int64, int64); 1554 HANDLE_TYPE( INT64, Int64, int64);
1554 HANDLE_TYPE( UINT32, UInt32, uint32); 1555 HANDLE_TYPE( UINT32, UInt32, uint32);
1555 HANDLE_TYPE( UINT64, UInt64, uint64); 1556 HANDLE_TYPE( UINT64, UInt64, uint64);
1556 HANDLE_TYPE( SINT32, SInt32, int32); 1557 HANDLE_TYPE( SINT32, SInt32, int32);
1557 HANDLE_TYPE( SINT64, SInt64, int64); 1558 HANDLE_TYPE( SINT64, SInt64, int64);
1558 HANDLE_TYPE( ENUM, Enum, enum); 1559 HANDLE_TYPE( ENUM, Enum, enum);
1559 #undef HANDLE_TYPE 1560 #undef HANDLE_TYPE
1560 1561
1561 // Stuff with fixed size. 1562 // Stuff with fixed size.
1562 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1563 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1563 case WireFormatLite::TYPE_##UPPERCASE: \ 1564 case WireFormatLite::TYPE_##UPPERCASE: \
1564 result += WireFormatLite::k##CAMELCASE##Size * \ 1565 result += WireFormatLite::k##CAMELCASE##Size * \
1565 repeated_##LOWERCASE##_value->size(); \ 1566 FromIntSize(repeated_##LOWERCASE##_value->size()); \
1566 break 1567 break
1567 HANDLE_TYPE( FIXED32, Fixed32, uint32); 1568 HANDLE_TYPE( FIXED32, Fixed32, uint32);
1568 HANDLE_TYPE( FIXED64, Fixed64, uint64); 1569 HANDLE_TYPE( FIXED64, Fixed64, uint64);
1569 HANDLE_TYPE(SFIXED32, SFixed32, int32); 1570 HANDLE_TYPE(SFIXED32, SFixed32, int32);
1570 HANDLE_TYPE(SFIXED64, SFixed64, int64); 1571 HANDLE_TYPE(SFIXED64, SFixed64, int64);
1571 HANDLE_TYPE( FLOAT, Float, float); 1572 HANDLE_TYPE( FLOAT, Float, float);
1572 HANDLE_TYPE( DOUBLE, Double, double); 1573 HANDLE_TYPE( DOUBLE, Double, double);
1573 HANDLE_TYPE( BOOL, Bool, bool); 1574 HANDLE_TYPE( BOOL, Bool, bool);
1574 #undef HANDLE_TYPE 1575 #undef HANDLE_TYPE
1575 1576
1576 case WireFormatLite::TYPE_STRING: 1577 case WireFormatLite::TYPE_STRING:
1577 case WireFormatLite::TYPE_BYTES: 1578 case WireFormatLite::TYPE_BYTES:
1578 case WireFormatLite::TYPE_GROUP: 1579 case WireFormatLite::TYPE_GROUP:
1579 case WireFormatLite::TYPE_MESSAGE: 1580 case WireFormatLite::TYPE_MESSAGE:
1580 GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; 1581 GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed.";
1581 break; 1582 break;
1582 } 1583 }
1583 1584
1584 cached_size = result; 1585 cached_size = ToCachedSize(result);
1585 if (result > 0) { 1586 if (result > 0) {
1586 result += io::CodedOutputStream::VarintSize32(result); 1587 result += io::CodedOutputStream::VarintSize32(result);
1587 result += io::CodedOutputStream::VarintSize32( 1588 result += io::CodedOutputStream::VarintSize32(
1588 WireFormatLite::MakeTag(number, 1589 WireFormatLite::MakeTag(number,
1589 WireFormatLite::WIRETYPE_LENGTH_DELIMITED)); 1590 WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
1590 } 1591 }
1591 } else { 1592 } else {
1592 int tag_size = WireFormatLite::TagSize(number, real_type(type)); 1593 size_t tag_size = WireFormatLite::TagSize(number, real_type(type));
1593 1594
1594 switch (real_type(type)) { 1595 switch (real_type(type)) {
1595 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1596 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1596 case WireFormatLite::TYPE_##UPPERCASE: \ 1597 case WireFormatLite::TYPE_##UPPERCASE: \
1597 result += tag_size * repeated_##LOWERCASE##_value->size(); \ 1598 result += tag_size * \
1599 FromIntSize(repeated_##LOWERCASE##_value->size()); \
1598 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ 1600 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
1599 result += WireFormatLite::CAMELCASE##Size( \ 1601 result += WireFormatLite::CAMELCASE##Size( \
1600 repeated_##LOWERCASE##_value->Get(i)); \ 1602 repeated_##LOWERCASE##_value->Get(i)); \
1601 } \ 1603 } \
1602 break 1604 break
1603 1605
1604 HANDLE_TYPE( INT32, Int32, int32); 1606 HANDLE_TYPE( INT32, Int32, int32);
1605 HANDLE_TYPE( INT64, Int64, int64); 1607 HANDLE_TYPE( INT64, Int64, int64);
1606 HANDLE_TYPE( UINT32, UInt32, uint32); 1608 HANDLE_TYPE( UINT32, UInt32, uint32);
1607 HANDLE_TYPE( UINT64, UInt64, uint64); 1609 HANDLE_TYPE( UINT64, UInt64, uint64);
1608 HANDLE_TYPE( SINT32, SInt32, int32); 1610 HANDLE_TYPE( SINT32, SInt32, int32);
1609 HANDLE_TYPE( SINT64, SInt64, int64); 1611 HANDLE_TYPE( SINT64, SInt64, int64);
1610 HANDLE_TYPE( STRING, String, string); 1612 HANDLE_TYPE( STRING, String, string);
1611 HANDLE_TYPE( BYTES, Bytes, string); 1613 HANDLE_TYPE( BYTES, Bytes, string);
1612 HANDLE_TYPE( ENUM, Enum, enum); 1614 HANDLE_TYPE( ENUM, Enum, enum);
1613 HANDLE_TYPE( GROUP, Group, message); 1615 HANDLE_TYPE( GROUP, Group, message);
1614 HANDLE_TYPE( MESSAGE, Message, message); 1616 HANDLE_TYPE( MESSAGE, Message, message);
1615 #undef HANDLE_TYPE 1617 #undef HANDLE_TYPE
1616 1618
1617 // Stuff with fixed size. 1619 // Stuff with fixed size.
1618 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1620 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1619 case WireFormatLite::TYPE_##UPPERCASE: \ 1621 case WireFormatLite::TYPE_##UPPERCASE: \
1620 result += (tag_size + WireFormatLite::k##CAMELCASE##Size) * \ 1622 result += (tag_size + WireFormatLite::k##CAMELCASE##Size) * \
1621 repeated_##LOWERCASE##_value->size(); \ 1623 FromIntSize(repeated_##LOWERCASE##_value->size()); \
1622 break 1624 break
1623 HANDLE_TYPE( FIXED32, Fixed32, uint32); 1625 HANDLE_TYPE( FIXED32, Fixed32, uint32);
1624 HANDLE_TYPE( FIXED64, Fixed64, uint64); 1626 HANDLE_TYPE( FIXED64, Fixed64, uint64);
1625 HANDLE_TYPE(SFIXED32, SFixed32, int32); 1627 HANDLE_TYPE(SFIXED32, SFixed32, int32);
1626 HANDLE_TYPE(SFIXED64, SFixed64, int64); 1628 HANDLE_TYPE(SFIXED64, SFixed64, int64);
1627 HANDLE_TYPE( FLOAT, Float, float); 1629 HANDLE_TYPE( FLOAT, Float, float);
1628 HANDLE_TYPE( DOUBLE, Double, double); 1630 HANDLE_TYPE( DOUBLE, Double, double);
1629 HANDLE_TYPE( BOOL, Bool, bool); 1631 HANDLE_TYPE( BOOL, Bool, bool);
1630 #undef HANDLE_TYPE 1632 #undef HANDLE_TYPE
1631 } 1633 }
(...skipping 12 matching lines...) Expand all
1644 HANDLE_TYPE( UINT64, UInt64, uint64_value); 1646 HANDLE_TYPE( UINT64, UInt64, uint64_value);
1645 HANDLE_TYPE( SINT32, SInt32, int32_value); 1647 HANDLE_TYPE( SINT32, SInt32, int32_value);
1646 HANDLE_TYPE( SINT64, SInt64, int64_value); 1648 HANDLE_TYPE( SINT64, SInt64, int64_value);
1647 HANDLE_TYPE( STRING, String, *string_value); 1649 HANDLE_TYPE( STRING, String, *string_value);
1648 HANDLE_TYPE( BYTES, Bytes, *string_value); 1650 HANDLE_TYPE( BYTES, Bytes, *string_value);
1649 HANDLE_TYPE( ENUM, Enum, enum_value); 1651 HANDLE_TYPE( ENUM, Enum, enum_value);
1650 HANDLE_TYPE( GROUP, Group, *message_value); 1652 HANDLE_TYPE( GROUP, Group, *message_value);
1651 #undef HANDLE_TYPE 1653 #undef HANDLE_TYPE
1652 case WireFormatLite::TYPE_MESSAGE: { 1654 case WireFormatLite::TYPE_MESSAGE: {
1653 if (is_lazy) { 1655 if (is_lazy) {
1654 int size = lazymessage_value->ByteSize(); 1656 size_t size = lazymessage_value->ByteSize();
1655 result += io::CodedOutputStream::VarintSize32(size) + size; 1657 result += io::CodedOutputStream::VarintSize32(size) + size;
1656 } else { 1658 } else {
1657 result += WireFormatLite::MessageSize(*message_value); 1659 result += WireFormatLite::MessageSize(*message_value);
1658 } 1660 }
1659 break; 1661 break;
1660 } 1662 }
1661 1663
1662 // Stuff with fixed size. 1664 // Stuff with fixed size.
1663 #define HANDLE_TYPE(UPPERCASE, CAMELCASE) \ 1665 #define HANDLE_TYPE(UPPERCASE, CAMELCASE) \
1664 case WireFormatLite::TYPE_##UPPERCASE: \ 1666 case WireFormatLite::TYPE_##UPPERCASE: \
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1806 const RepeatedField<bool>* 1808 const RepeatedField<bool>*
1807 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_ = NULL; 1809 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_ = NULL;
1808 const RepeatedStringTypeTraits::RepeatedFieldType* 1810 const RepeatedStringTypeTraits::RepeatedFieldType*
1809 RepeatedStringTypeTraits::default_repeated_field_ = NULL; 1811 RepeatedStringTypeTraits::default_repeated_field_ = NULL;
1810 const RepeatedMessageGenericTypeTraits::RepeatedFieldType* 1812 const RepeatedMessageGenericTypeTraits::RepeatedFieldType*
1811 RepeatedMessageGenericTypeTraits::default_repeated_field_ = NULL; 1813 RepeatedMessageGenericTypeTraits::default_repeated_field_ = NULL;
1812 1814
1813 } // namespace internal 1815 } // namespace internal
1814 } // namespace protobuf 1816 } // namespace protobuf
1815 } // namespace google 1817 } // namespace google
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698