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

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

Issue 1842653006: Update //third_party/protobuf to version 3. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: pull whole protobuf Created 4 years, 8 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 // http://code.google.com/p/protobuf/ 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.
11 // * Redistributions in binary form must reproduce the above 11 // * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer 12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the 13 // in the documentation and/or other materials provided with the
(...skipping 17 matching lines...) Expand all
31 // Author: kenton@google.com (Kenton Varda) 31 // Author: kenton@google.com (Kenton Varda)
32 // Based on original Protocol Buffers design by 32 // Based on original Protocol Buffers design by
33 // Sanjay Ghemawat, Jeff Dean, and others. 33 // Sanjay Ghemawat, Jeff Dean, and others.
34 34
35 #include <google/protobuf/stubs/hash.h> 35 #include <google/protobuf/stubs/hash.h>
36 #include <google/protobuf/stubs/common.h> 36 #include <google/protobuf/stubs/common.h>
37 #include <google/protobuf/stubs/once.h> 37 #include <google/protobuf/stubs/once.h>
38 #include <google/protobuf/extension_set.h> 38 #include <google/protobuf/extension_set.h>
39 #include <google/protobuf/message_lite.h> 39 #include <google/protobuf/message_lite.h>
40 #include <google/protobuf/io/coded_stream.h> 40 #include <google/protobuf/io/coded_stream.h>
41 #include <google/protobuf/io/zero_copy_stream_impl.h>
42 #include <google/protobuf/wire_format_lite_inl.h> 41 #include <google/protobuf/wire_format_lite_inl.h>
43 #include <google/protobuf/repeated_field.h> 42 #include <google/protobuf/repeated_field.h>
44 #include <google/protobuf/stubs/map-util.h> 43 #include <google/protobuf/stubs/map_util.h>
45 44
46 namespace google { 45 namespace google {
47 namespace protobuf { 46 namespace protobuf {
48 namespace internal { 47 namespace internal {
49 48
50 namespace { 49 namespace {
51 50
52 inline WireFormatLite::FieldType real_type(FieldType type) { 51 inline WireFormatLite::FieldType real_type(FieldType type) {
53 GOOGLE_DCHECK(type > 0 && type <= WireFormatLite::MAX_FIELD_TYPE); 52 GOOGLE_DCHECK(type > 0 && type <= WireFormatLite::MAX_FIELD_TYPE);
54 return static_cast<WireFormatLite::FieldType>(type); 53 return static_cast<WireFormatLite::FieldType>(type);
55 } 54 }
56 55
57 inline WireFormatLite::CppType cpp_type(FieldType type) { 56 inline WireFormatLite::CppType cpp_type(FieldType type) {
58 return WireFormatLite::FieldTypeToCppType(real_type(type)); 57 return WireFormatLite::FieldTypeToCppType(real_type(type));
59 } 58 }
60 59
60 inline bool is_packable(WireFormatLite::WireType type) {
61 switch (type) {
62 case WireFormatLite::WIRETYPE_VARINT:
63 case WireFormatLite::WIRETYPE_FIXED64:
64 case WireFormatLite::WIRETYPE_FIXED32:
65 return true;
66 case WireFormatLite::WIRETYPE_LENGTH_DELIMITED:
67 case WireFormatLite::WIRETYPE_START_GROUP:
68 case WireFormatLite::WIRETYPE_END_GROUP:
69 return false;
70
71 // Do not add a default statement. Let the compiler complain when someone
72 // adds a new wire type.
73 }
74 GOOGLE_LOG(FATAL) << "can't reach here.";
75 return false;
76 }
77
61 // Registry stuff. 78 // Registry stuff.
62 typedef hash_map<pair<const MessageLite*, int>, 79 typedef hash_map<pair<const MessageLite*, int>,
63 ExtensionInfo> ExtensionRegistry; 80 ExtensionInfo> ExtensionRegistry;
64 ExtensionRegistry* registry_ = NULL; 81 ExtensionRegistry* registry_ = NULL;
65 GOOGLE_PROTOBUF_DECLARE_ONCE(registry_init_); 82 GOOGLE_PROTOBUF_DECLARE_ONCE(registry_init_);
66 83
67 void DeleteRegistry() { 84 void DeleteRegistry() {
68 delete registry_; 85 delete registry_;
69 registry_ = NULL; 86 registry_ = NULL;
70 } 87 }
71 88
72 void InitRegistry() { 89 void InitRegistry() {
73 registry_ = new ExtensionRegistry; 90 registry_ = new ExtensionRegistry;
74 OnShutdown(&DeleteRegistry); 91 OnShutdown(&DeleteRegistry);
75 } 92 }
76 93
77 // This function is only called at startup, so there is no need for thread- 94 // This function is only called at startup, so there is no need for thread-
78 // safety. 95 // safety.
79 void Register(const MessageLite* containing_type, 96 void Register(const MessageLite* containing_type,
80 int number, ExtensionInfo info) { 97 int number, ExtensionInfo info) {
81 ::google::protobuf::GoogleOnceInit(&registry_init_, &InitRegistry); 98 ::google::protobuf::GoogleOnceInit(&registry_init_, &InitRegistry);
82 99
83 if (!InsertIfNotPresent(registry_, make_pair(containing_type, number), 100 if (!InsertIfNotPresent(registry_, std::make_pair(containing_type, number),
84 info)) { 101 info)) {
85 GOOGLE_LOG(FATAL) << "Multiple extension registrations for type \"" 102 GOOGLE_LOG(FATAL) << "Multiple extension registrations for type \""
86 << containing_type->GetTypeName() 103 << containing_type->GetTypeName()
87 << "\", field number " << number << "."; 104 << "\", field number " << number << ".";
88 } 105 }
89 } 106 }
90 107
91 const ExtensionInfo* FindRegisteredExtension( 108 const ExtensionInfo* FindRegisteredExtension(
92 const MessageLite* containing_type, int number) { 109 const MessageLite* containing_type, int number) {
93 return (registry_ == NULL) ? NULL : 110 return (registry_ == NULL)
94 FindOrNull(*registry_, make_pair(containing_type, number)); 111 ? NULL
112 : FindOrNull(*registry_, std::make_pair(containing_type, number));
95 } 113 }
96 114
97 } // namespace 115 } // namespace
98 116
99 ExtensionFinder::~ExtensionFinder() {} 117 ExtensionFinder::~ExtensionFinder() {}
100 118
101 bool GeneratedExtensionFinder::Find(int number, ExtensionInfo* output) { 119 bool GeneratedExtensionFinder::Find(int number, ExtensionInfo* output) {
102 const ExtensionInfo* extension = 120 const ExtensionInfo* extension =
103 FindRegisteredExtension(containing_type_, number); 121 FindRegisteredExtension(containing_type_, number);
104 if (extension == NULL) { 122 if (extension == NULL) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 type == WireFormatLite::TYPE_GROUP); 170 type == WireFormatLite::TYPE_GROUP);
153 ExtensionInfo info(type, is_repeated, is_packed); 171 ExtensionInfo info(type, is_repeated, is_packed);
154 info.message_prototype = prototype; 172 info.message_prototype = prototype;
155 Register(containing_type, number, info); 173 Register(containing_type, number, info);
156 } 174 }
157 175
158 176
159 // =================================================================== 177 // ===================================================================
160 // Constructors and basic methods. 178 // Constructors and basic methods.
161 179
162 ExtensionSet::ExtensionSet() {} 180 ExtensionSet::ExtensionSet(::google::protobuf::Arena* arena) : arena_(arena) {
163 181 if (arena_ != NULL) {
164 ExtensionSet::~ExtensionSet() { 182 arena_->OwnDestructor(&extensions_);
165 for (map<int, Extension>::iterator iter = extensions_.begin();
166 iter != extensions_.end(); ++iter) {
167 iter->second.Free();
168 } 183 }
169 } 184 }
170 185
186 ExtensionSet::ExtensionSet() : arena_(NULL) {}
187
188 ExtensionSet::~ExtensionSet() {
189 // Deletes all allocated extensions.
190 if (arena_ == NULL) {
191 for (map<int, Extension>::iterator iter = extensions_.begin();
192 iter != extensions_.end(); ++iter) {
193 iter->second.Free();
194 }
195 }
196 }
197
171 // Defined in extension_set_heavy.cc. 198 // Defined in extension_set_heavy.cc.
172 // void ExtensionSet::AppendToList(const Descriptor* containing_type, 199 // void ExtensionSet::AppendToList(const Descriptor* containing_type,
173 // const DescriptorPool* pool, 200 // const DescriptorPool* pool,
174 // vector<const FieldDescriptor*>* output) const 201 // vector<const FieldDescriptor*>* output) const
175 202
176 bool ExtensionSet::Has(int number) const { 203 bool ExtensionSet::Has(int number) const {
177 map<int, Extension>::const_iterator iter = extensions_.find(number); 204 map<int, Extension>::const_iterator iter = extensions_.find(number);
178 if (iter == extensions_.end()) return false; 205 if (iter == extensions_.end()) return false;
179 GOOGLE_DCHECK(!iter->second.is_repeated); 206 GOOGLE_DCHECK(!iter->second.is_repeated);
180 return !iter->second.is_cleared; 207 return !iter->second.is_cleared;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 \ 306 \
280 void ExtensionSet::Add##CAMELCASE(int number, FieldType type, \ 307 void ExtensionSet::Add##CAMELCASE(int number, FieldType type, \
281 bool packed, LOWERCASE value, \ 308 bool packed, LOWERCASE value, \
282 const FieldDescriptor* descriptor) { \ 309 const FieldDescriptor* descriptor) { \
283 Extension* extension; \ 310 Extension* extension; \
284 if (MaybeNewExtension(number, descriptor, &extension)) { \ 311 if (MaybeNewExtension(number, descriptor, &extension)) { \
285 extension->type = type; \ 312 extension->type = type; \
286 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERC ASE); \ 313 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERC ASE); \
287 extension->is_repeated = true; \ 314 extension->is_repeated = true; \
288 extension->is_packed = packed; \ 315 extension->is_packed = packed; \
289 extension->repeated_##LOWERCASE##_value = new RepeatedField<LOWERCASE>(); \ 316 extension->repeated_##LOWERCASE##_value = \
317 Arena::CreateMessage<RepeatedField<LOWERCASE> >(arena_); \
290 } else { \ 318 } else { \
291 GOOGLE_DCHECK_TYPE(*extension, REPEATED, UPPERCASE); \ 319 GOOGLE_DCHECK_TYPE(*extension, REPEATED, UPPERCASE); \
292 GOOGLE_DCHECK_EQ(extension->is_packed, packed); \ 320 GOOGLE_DCHECK_EQ(extension->is_packed, packed); \
293 } \ 321 } \
294 extension->repeated_##LOWERCASE##_value->Add(value); \ 322 extension->repeated_##LOWERCASE##_value->Add(value); \
295 } 323 }
296 324
297 PRIMITIVE_ACCESSORS( INT32, int32, Int32) 325 PRIMITIVE_ACCESSORS( INT32, int32, Int32)
298 PRIMITIVE_ACCESSORS( INT64, int64, Int64) 326 PRIMITIVE_ACCESSORS( INT64, int64, Int64)
299 PRIMITIVE_ACCESSORS(UINT32, uint32, UInt32) 327 PRIMITIVE_ACCESSORS(UINT32, uint32, UInt32)
300 PRIMITIVE_ACCESSORS(UINT64, uint64, UInt64) 328 PRIMITIVE_ACCESSORS(UINT64, uint64, UInt64)
301 PRIMITIVE_ACCESSORS( FLOAT, float, Float) 329 PRIMITIVE_ACCESSORS( FLOAT, float, Float)
302 PRIMITIVE_ACCESSORS(DOUBLE, double, Double) 330 PRIMITIVE_ACCESSORS(DOUBLE, double, Double)
303 PRIMITIVE_ACCESSORS( BOOL, bool, Bool) 331 PRIMITIVE_ACCESSORS( BOOL, bool, Bool)
304 332
305 #undef PRIMITIVE_ACCESSORS 333 #undef PRIMITIVE_ACCESSORS
306 334
307 void* ExtensionSet::MutableRawRepeatedField(int number) { 335 const void* ExtensionSet::GetRawRepeatedField(int number,
336 const void* default_value) const {
337 map<int, Extension>::const_iterator iter = extensions_.find(number);
338 if (iter == extensions_.end()) {
339 return default_value;
340 }
308 // We assume that all the RepeatedField<>* pointers have the same 341 // We assume that all the RepeatedField<>* pointers have the same
309 // size and alignment within the anonymous union in Extension. 342 // size and alignment within the anonymous union in Extension.
310 map<int, Extension>::const_iterator iter = extensions_.find(number);
311 GOOGLE_CHECK(iter != extensions_.end()) << "no extension numbered " << number;
312 return iter->second.repeated_int32_value; 343 return iter->second.repeated_int32_value;
313 } 344 }
314 345
346 void* ExtensionSet::MutableRawRepeatedField(int number, FieldType field_type,
347 bool packed,
348 const FieldDescriptor* desc) {
349 Extension* extension;
350
351 // We instantiate an empty Repeated{,Ptr}Field if one doesn't exist for this
352 // extension.
353 if (MaybeNewExtension(number, desc, &extension)) {
354 extension->is_repeated = true;
355 extension->type = field_type;
356 extension->is_packed = packed;
357
358 switch (WireFormatLite::FieldTypeToCppType(
359 static_cast<WireFormatLite::FieldType>(field_type))) {
360 case WireFormatLite::CPPTYPE_INT32:
361 extension->repeated_int32_value =
362 Arena::CreateMessage<RepeatedField<int32> >(arena_);
363 break;
364 case WireFormatLite::CPPTYPE_INT64:
365 extension->repeated_int64_value =
366 Arena::CreateMessage<RepeatedField<int64> >(arena_);
367 break;
368 case WireFormatLite::CPPTYPE_UINT32:
369 extension->repeated_uint32_value =
370 Arena::CreateMessage<RepeatedField<uint32> >(arena_);
371 break;
372 case WireFormatLite::CPPTYPE_UINT64:
373 extension->repeated_uint64_value =
374 Arena::CreateMessage<RepeatedField<uint64> >(arena_);
375 break;
376 case WireFormatLite::CPPTYPE_DOUBLE:
377 extension->repeated_double_value =
378 Arena::CreateMessage<RepeatedField<double> >(arena_);
379 break;
380 case WireFormatLite::CPPTYPE_FLOAT:
381 extension->repeated_float_value =
382 Arena::CreateMessage<RepeatedField<float> >(arena_);
383 break;
384 case WireFormatLite::CPPTYPE_BOOL:
385 extension->repeated_bool_value =
386 Arena::CreateMessage<RepeatedField<bool> >(arena_);
387 break;
388 case WireFormatLite::CPPTYPE_ENUM:
389 extension->repeated_enum_value =
390 Arena::CreateMessage<RepeatedField<int> >(arena_);
391 break;
392 case WireFormatLite::CPPTYPE_STRING:
393 extension->repeated_string_value =
394 Arena::CreateMessage<RepeatedPtrField< ::std::string> >(arena_);
395 break;
396 case WireFormatLite::CPPTYPE_MESSAGE:
397 extension->repeated_message_value =
398 Arena::CreateMessage<RepeatedPtrField<MessageLite> >(arena_);
399 break;
400 }
401 }
402
403 // We assume that all the RepeatedField<>* pointers have the same
404 // size and alignment within the anonymous union in Extension.
405 return extension->repeated_int32_value;
406 }
407
408 // Compatible version using old call signature. Does not create extensions when
409 // the don't already exist; instead, just GOOGLE_CHECK-fails.
410 void* ExtensionSet::MutableRawRepeatedField(int number) {
411 map<int, Extension>::iterator iter = extensions_.find(number);
412 GOOGLE_CHECK(iter == extensions_.end()) << "Extension not found.";
413 // We assume that all the RepeatedField<>* pointers have the same
414 // size and alignment within the anonymous union in Extension.
415 return iter->second.repeated_int32_value;
416 }
417
418
315 // ------------------------------------------------------------------- 419 // -------------------------------------------------------------------
316 // Enums 420 // Enums
317 421
318 int ExtensionSet::GetEnum(int number, int default_value) const { 422 int ExtensionSet::GetEnum(int number, int default_value) const {
319 map<int, Extension>::const_iterator iter = extensions_.find(number); 423 map<int, Extension>::const_iterator iter = extensions_.find(number);
320 if (iter == extensions_.end() || iter->second.is_cleared) { 424 if (iter == extensions_.end() || iter->second.is_cleared) {
321 // Not present. Return the default value. 425 // Not present. Return the default value.
322 return default_value; 426 return default_value;
323 } else { 427 } else {
324 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, ENUM); 428 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, ENUM);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 460
357 void ExtensionSet::AddEnum(int number, FieldType type, 461 void ExtensionSet::AddEnum(int number, FieldType type,
358 bool packed, int value, 462 bool packed, int value,
359 const FieldDescriptor* descriptor) { 463 const FieldDescriptor* descriptor) {
360 Extension* extension; 464 Extension* extension;
361 if (MaybeNewExtension(number, descriptor, &extension)) { 465 if (MaybeNewExtension(number, descriptor, &extension)) {
362 extension->type = type; 466 extension->type = type;
363 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM); 467 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM);
364 extension->is_repeated = true; 468 extension->is_repeated = true;
365 extension->is_packed = packed; 469 extension->is_packed = packed;
366 extension->repeated_enum_value = new RepeatedField<int>(); 470 extension->repeated_enum_value =
471 Arena::CreateMessage<RepeatedField<int> >(arena_);
367 } else { 472 } else {
368 GOOGLE_DCHECK_TYPE(*extension, REPEATED, ENUM); 473 GOOGLE_DCHECK_TYPE(*extension, REPEATED, ENUM);
369 GOOGLE_DCHECK_EQ(extension->is_packed, packed); 474 GOOGLE_DCHECK_EQ(extension->is_packed, packed);
370 } 475 }
371 extension->repeated_enum_value->Add(value); 476 extension->repeated_enum_value->Add(value);
372 } 477 }
373 478
374 // ------------------------------------------------------------------- 479 // -------------------------------------------------------------------
375 // Strings 480 // Strings
376 481
377 const string& ExtensionSet::GetString(int number, 482 const string& ExtensionSet::GetString(int number,
378 const string& default_value) const { 483 const string& default_value) const {
379 map<int, Extension>::const_iterator iter = extensions_.find(number); 484 map<int, Extension>::const_iterator iter = extensions_.find(number);
380 if (iter == extensions_.end() || iter->second.is_cleared) { 485 if (iter == extensions_.end() || iter->second.is_cleared) {
381 // Not present. Return the default value. 486 // Not present. Return the default value.
382 return default_value; 487 return default_value;
383 } else { 488 } else {
384 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, STRING); 489 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, STRING);
385 return *iter->second.string_value; 490 return *iter->second.string_value;
386 } 491 }
387 } 492 }
388 493
389 string* ExtensionSet::MutableString(int number, FieldType type, 494 string* ExtensionSet::MutableString(int number, FieldType type,
390 const FieldDescriptor* descriptor) { 495 const FieldDescriptor* descriptor) {
391 Extension* extension; 496 Extension* extension;
392 if (MaybeNewExtension(number, descriptor, &extension)) { 497 if (MaybeNewExtension(number, descriptor, &extension)) {
393 extension->type = type; 498 extension->type = type;
394 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING); 499 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);
395 extension->is_repeated = false; 500 extension->is_repeated = false;
396 extension->string_value = new string; 501 extension->string_value = Arena::Create<string>(arena_);
397 } else { 502 } else {
398 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, STRING); 503 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, STRING);
399 } 504 }
400 extension->is_cleared = false; 505 extension->is_cleared = false;
401 return extension->string_value; 506 return extension->string_value;
402 } 507 }
403 508
404 const string& ExtensionSet::GetRepeatedString(int number, int index) const { 509 const string& ExtensionSet::GetRepeatedString(int number, int index) const {
405 map<int, Extension>::const_iterator iter = extensions_.find(number); 510 map<int, Extension>::const_iterator iter = extensions_.find(number);
406 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 511 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
407 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING); 512 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);
408 return iter->second.repeated_string_value->Get(index); 513 return iter->second.repeated_string_value->Get(index);
409 } 514 }
410 515
411 string* ExtensionSet::MutableRepeatedString(int number, int index) { 516 string* ExtensionSet::MutableRepeatedString(int number, int index) {
412 map<int, Extension>::iterator iter = extensions_.find(number); 517 map<int, Extension>::iterator iter = extensions_.find(number);
413 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 518 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
414 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING); 519 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);
415 return iter->second.repeated_string_value->Mutable(index); 520 return iter->second.repeated_string_value->Mutable(index);
416 } 521 }
417 522
418 string* ExtensionSet::AddString(int number, FieldType type, 523 string* ExtensionSet::AddString(int number, FieldType type,
419 const FieldDescriptor* descriptor) { 524 const FieldDescriptor* descriptor) {
420 Extension* extension; 525 Extension* extension;
421 if (MaybeNewExtension(number, descriptor, &extension)) { 526 if (MaybeNewExtension(number, descriptor, &extension)) {
422 extension->type = type; 527 extension->type = type;
423 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING); 528 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);
424 extension->is_repeated = true; 529 extension->is_repeated = true;
425 extension->is_packed = false; 530 extension->is_packed = false;
426 extension->repeated_string_value = new RepeatedPtrField<string>(); 531 extension->repeated_string_value =
532 Arena::CreateMessage<RepeatedPtrField<string> >(arena_);
427 } else { 533 } else {
428 GOOGLE_DCHECK_TYPE(*extension, REPEATED, STRING); 534 GOOGLE_DCHECK_TYPE(*extension, REPEATED, STRING);
429 } 535 }
430 return extension->repeated_string_value->Add(); 536 return extension->repeated_string_value->Add();
431 } 537 }
432 538
433 // ------------------------------------------------------------------- 539 // -------------------------------------------------------------------
434 // Messages 540 // Messages
435 541
436 const MessageLite& ExtensionSet::GetMessage( 542 const MessageLite& ExtensionSet::GetMessage(
(...skipping 19 matching lines...) Expand all
456 562
457 MessageLite* ExtensionSet::MutableMessage(int number, FieldType type, 563 MessageLite* ExtensionSet::MutableMessage(int number, FieldType type,
458 const MessageLite& prototype, 564 const MessageLite& prototype,
459 const FieldDescriptor* descriptor) { 565 const FieldDescriptor* descriptor) {
460 Extension* extension; 566 Extension* extension;
461 if (MaybeNewExtension(number, descriptor, &extension)) { 567 if (MaybeNewExtension(number, descriptor, &extension)) {
462 extension->type = type; 568 extension->type = type;
463 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE) ; 569 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE) ;
464 extension->is_repeated = false; 570 extension->is_repeated = false;
465 extension->is_lazy = false; 571 extension->is_lazy = false;
466 extension->message_value = prototype.New(); 572 extension->message_value = prototype.New(arena_);
467 extension->is_cleared = false; 573 extension->is_cleared = false;
468 return extension->message_value; 574 return extension->message_value;
469 } else { 575 } else {
470 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE); 576 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE);
471 extension->is_cleared = false; 577 extension->is_cleared = false;
472 if (extension->is_lazy) { 578 if (extension->is_lazy) {
473 return extension->lazymessage_value->MutableMessage(prototype); 579 return extension->lazymessage_value->MutableMessage(prototype);
474 } else { 580 } else {
475 return extension->message_value; 581 return extension->message_value;
476 } 582 }
477 } 583 }
478 } 584 }
479 585
480 // Defined in extension_set_heavy.cc. 586 // Defined in extension_set_heavy.cc.
481 // MessageLite* ExtensionSet::MutableMessage(int number, FieldType type, 587 // MessageLite* ExtensionSet::MutableMessage(int number, FieldType type,
482 // const Descriptor* message_type, 588 // const Descriptor* message_type,
483 // MessageFactory* factory) 589 // MessageFactory* factory)
484 590
485 void ExtensionSet::SetAllocatedMessage(int number, FieldType type, 591 void ExtensionSet::SetAllocatedMessage(int number, FieldType type,
486 const FieldDescriptor* descriptor, 592 const FieldDescriptor* descriptor,
487 MessageLite* message) { 593 MessageLite* message) {
488 if (message == NULL) { 594 if (message == NULL) {
489 ClearExtension(number); 595 ClearExtension(number);
490 return; 596 return;
491 } 597 }
598 ::google::protobuf::Arena* message_arena = message->GetArena();
599 Extension* extension;
600 if (MaybeNewExtension(number, descriptor, &extension)) {
601 extension->type = type;
602 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE) ;
603 extension->is_repeated = false;
604 extension->is_lazy = false;
605 if (message_arena == arena_) {
606 extension->message_value = message;
607 } else if (message_arena == NULL) {
608 extension->message_value = message;
609 arena_->Own(message); // not NULL because not equal to message_arena
610 } else {
611 extension->message_value = message->New(arena_);
612 extension->message_value->CheckTypeAndMergeFrom(*message);
613 }
614 } else {
615 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE);
616 if (extension->is_lazy) {
617 extension->lazymessage_value->SetAllocatedMessage(message);
618 } else {
619 if (arena_ == NULL) {
620 delete extension->message_value;
621 }
622 if (message_arena == arena_) {
623 extension->message_value = message;
624 } else if (message_arena == NULL) {
625 extension->message_value = message;
626 arena_->Own(message); // not NULL because not equal to message_arena
627 } else {
628 extension->message_value = message->New(arena_);
629 extension->message_value->CheckTypeAndMergeFrom(*message);
630 }
631 }
632 }
633 extension->is_cleared = false;
634 }
635
636 void ExtensionSet::UnsafeArenaSetAllocatedMessage(
637 int number, FieldType type, const FieldDescriptor* descriptor,
638 MessageLite* message) {
639 if (message == NULL) {
640 ClearExtension(number);
641 return;
642 }
492 Extension* extension; 643 Extension* extension;
493 if (MaybeNewExtension(number, descriptor, &extension)) { 644 if (MaybeNewExtension(number, descriptor, &extension)) {
494 extension->type = type; 645 extension->type = type;
495 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE) ; 646 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE) ;
496 extension->is_repeated = false; 647 extension->is_repeated = false;
497 extension->is_lazy = false; 648 extension->is_lazy = false;
498 extension->message_value = message; 649 extension->message_value = message;
499 } else { 650 } else {
500 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE); 651 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE);
501 if (extension->is_lazy) { 652 if (extension->is_lazy) {
502 extension->lazymessage_value->SetAllocatedMessage(message); 653 extension->lazymessage_value->UnsafeArenaSetAllocatedMessage(message);
503 } else { 654 } else {
504 delete extension->message_value; 655 if (arena_ == NULL) {
656 delete extension->message_value;
657 }
505 extension->message_value = message; 658 extension->message_value = message;
506 } 659 }
507 } 660 }
508 extension->is_cleared = false; 661 extension->is_cleared = false;
509 } 662 }
510 663
664
511 MessageLite* ExtensionSet::ReleaseMessage(int number, 665 MessageLite* ExtensionSet::ReleaseMessage(int number,
512 const MessageLite& prototype) { 666 const MessageLite& prototype) {
513 map<int, Extension>::iterator iter = extensions_.find(number); 667 map<int, Extension>::iterator iter = extensions_.find(number);
514 if (iter == extensions_.end()) { 668 if (iter == extensions_.end()) {
515 // Not present. Return NULL. 669 // Not present. Return NULL.
516 return NULL; 670 return NULL;
517 } else { 671 } else {
518 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); 672 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);
519 MessageLite* ret = NULL; 673 MessageLite* ret = NULL;
520 if (iter->second.is_lazy) { 674 if (iter->second.is_lazy) {
521 ret = iter->second.lazymessage_value->ReleaseMessage(prototype); 675 ret = iter->second.lazymessage_value->ReleaseMessage(prototype);
522 delete iter->second.lazymessage_value; 676 if (arena_ == NULL) {
677 delete iter->second.lazymessage_value;
678 }
679 } else {
680 if (arena_ == NULL) {
681 ret = iter->second.message_value;
682 } else {
683 // 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 ret = (iter->second.message_value)->New();
686 ret->CheckTypeAndMergeFrom(*iter->second.message_value);
687 }
688 }
689 extensions_.erase(number);
690 return ret;
691 }
692 }
693
694 MessageLite* ExtensionSet::UnsafeArenaReleaseMessage(
695 int number, const MessageLite& prototype) {
696 map<int, Extension>::iterator iter = extensions_.find(number);
697 if (iter == extensions_.end()) {
698 // Not present. Return NULL.
699 return NULL;
700 } else {
701 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);
702 MessageLite* ret = NULL;
703 if (iter->second.is_lazy) {
704 ret =
705 iter->second.lazymessage_value->UnsafeArenaReleaseMessage(prototype);
706 if (arena_ == NULL) {
707 delete iter->second.lazymessage_value;
708 }
523 } else { 709 } else {
524 ret = iter->second.message_value; 710 ret = iter->second.message_value;
525 } 711 }
526 extensions_.erase(number); 712 extensions_.erase(number);
527 return ret; 713 return ret;
528 } 714 }
529 } 715 }
530 716
531 // Defined in extension_set_heavy.cc. 717 // Defined in extension_set_heavy.cc.
532 // MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor, 718 // MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor,
(...skipping 16 matching lines...) Expand all
549 735
550 MessageLite* ExtensionSet::AddMessage(int number, FieldType type, 736 MessageLite* ExtensionSet::AddMessage(int number, FieldType type,
551 const MessageLite& prototype, 737 const MessageLite& prototype,
552 const FieldDescriptor* descriptor) { 738 const FieldDescriptor* descriptor) {
553 Extension* extension; 739 Extension* extension;
554 if (MaybeNewExtension(number, descriptor, &extension)) { 740 if (MaybeNewExtension(number, descriptor, &extension)) {
555 extension->type = type; 741 extension->type = type;
556 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE) ; 742 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE) ;
557 extension->is_repeated = true; 743 extension->is_repeated = true;
558 extension->repeated_message_value = 744 extension->repeated_message_value =
559 new RepeatedPtrField<MessageLite>(); 745 Arena::CreateMessage<RepeatedPtrField<MessageLite> >(arena_);
560 } else { 746 } else {
561 GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE); 747 GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE);
562 } 748 }
563 749
564 // RepeatedPtrField<MessageLite> does not know how to Add() since it cannot 750 // RepeatedPtrField<MessageLite> does not know how to Add() since it cannot
565 // allocate an abstract object, so we have to be tricky. 751 // allocate an abstract object, so we have to be tricky.
566 MessageLite* result = extension->repeated_message_value 752 MessageLite* result = extension->repeated_message_value
567 ->AddFromCleared<GenericTypeHandler<MessageLite> >(); 753 ->AddFromCleared<GenericTypeHandler<MessageLite> >();
568 if (result == NULL) { 754 if (result == NULL) {
569 result = prototype.New(); 755 result = prototype.New(arena_);
570 extension->repeated_message_value->AddAllocated(result); 756 extension->repeated_message_value->AddAllocated(result);
571 } 757 }
572 return result; 758 return result;
573 } 759 }
574 760
575 // Defined in extension_set_heavy.cc. 761 // Defined in extension_set_heavy.cc.
576 // MessageLite* ExtensionSet::AddMessage(int number, FieldType type, 762 // MessageLite* ExtensionSet::AddMessage(int number, FieldType type,
577 // const Descriptor* message_type, 763 // const Descriptor* message_type,
578 // MessageFactory* factory) 764 // MessageFactory* factory)
579 765
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
677 for (map<int, Extension>::iterator iter = extensions_.begin(); 863 for (map<int, Extension>::iterator iter = extensions_.begin();
678 iter != extensions_.end(); ++iter) { 864 iter != extensions_.end(); ++iter) {
679 iter->second.Clear(); 865 iter->second.Clear();
680 } 866 }
681 } 867 }
682 868
683 void ExtensionSet::MergeFrom(const ExtensionSet& other) { 869 void ExtensionSet::MergeFrom(const ExtensionSet& other) {
684 for (map<int, Extension>::const_iterator iter = other.extensions_.begin(); 870 for (map<int, Extension>::const_iterator iter = other.extensions_.begin();
685 iter != other.extensions_.end(); ++iter) { 871 iter != other.extensions_.end(); ++iter) {
686 const Extension& other_extension = iter->second; 872 const Extension& other_extension = iter->second;
873 InternalExtensionMergeFrom(iter->first, other_extension);
874 }
875 }
687 876
688 if (other_extension.is_repeated) { 877 void ExtensionSet::InternalExtensionMergeFrom(
689 Extension* extension; 878 int number, const Extension& other_extension) {
690 bool is_new = MaybeNewExtension(iter->first, other_extension.descriptor, 879 if (other_extension.is_repeated) {
691 &extension); 880 Extension* extension;
692 if (is_new) { 881 bool is_new = MaybeNewExtension(number, other_extension.descriptor,
693 // Extension did not already exist in set. 882 &extension);
694 extension->type = other_extension.type; 883 if (is_new) {
695 extension->is_packed = other_extension.is_packed; 884 // Extension did not already exist in set.
696 extension->is_repeated = true; 885 extension->type = other_extension.type;
697 } else { 886 extension->is_packed = other_extension.is_packed;
698 GOOGLE_DCHECK_EQ(extension->type, other_extension.type); 887 extension->is_repeated = true;
699 GOOGLE_DCHECK_EQ(extension->is_packed, other_extension.is_packed); 888 } else {
700 GOOGLE_DCHECK(extension->is_repeated); 889 GOOGLE_DCHECK_EQ(extension->type, other_extension.type);
701 } 890 GOOGLE_DCHECK_EQ(extension->is_packed, other_extension.is_packed);
891 GOOGLE_DCHECK(extension->is_repeated);
892 }
702 893
894 switch (cpp_type(other_extension.type)) {
895 #define HANDLE_TYPE(UPPERCASE, LOWERCASE, REPEATED_TYPE) \
896 case WireFormatLite::CPPTYPE_##UPPERCASE: \
897 if (is_new) { \
898 extension->repeated_##LOWERCASE##_value = \
899 Arena::CreateMessage<REPEATED_TYPE >(arena_); \
900 } \
901 extension->repeated_##LOWERCASE##_value->MergeFrom( \
902 *other_extension.repeated_##LOWERCASE##_value); \
903 break;
904
905 HANDLE_TYPE( INT32, int32, RepeatedField < int32>);
906 HANDLE_TYPE( INT64, int64, RepeatedField < int64>);
907 HANDLE_TYPE( UINT32, uint32, RepeatedField < uint32>);
908 HANDLE_TYPE( UINT64, uint64, RepeatedField < uint64>);
909 HANDLE_TYPE( FLOAT, float, RepeatedField < float>);
910 HANDLE_TYPE( DOUBLE, double, RepeatedField < double>);
911 HANDLE_TYPE( BOOL, bool, RepeatedField < bool>);
912 HANDLE_TYPE( ENUM, enum, RepeatedField < int>);
913 HANDLE_TYPE( STRING, string, RepeatedPtrField< string>);
914 #undef HANDLE_TYPE
915
916 case WireFormatLite::CPPTYPE_MESSAGE:
917 if (is_new) {
918 extension->repeated_message_value =
919 Arena::CreateMessage<RepeatedPtrField<MessageLite> >(arena_);
920 }
921 // We can't call RepeatedPtrField<MessageLite>::MergeFrom() because
922 // it would attempt to allocate new objects.
923 RepeatedPtrField<MessageLite>* other_repeated_message =
924 other_extension.repeated_message_value;
925 for (int i = 0; i < other_repeated_message->size(); i++) {
926 const MessageLite& other_message = other_repeated_message->Get(i);
927 MessageLite* target = extension->repeated_message_value
928 ->AddFromCleared<GenericTypeHandler<MessageLite> >();
929 if (target == NULL) {
930 target = other_message.New(arena_);
931 extension->repeated_message_value->AddAllocated(target);
932 }
933 target->CheckTypeAndMergeFrom(other_message);
934 }
935 break;
936 }
937 } else {
938 if (!other_extension.is_cleared) {
703 switch (cpp_type(other_extension.type)) { 939 switch (cpp_type(other_extension.type)) {
704 #define HANDLE_TYPE(UPPERCASE, LOWERCASE, REPEATED_TYPE) \ 940 #define HANDLE_TYPE(UPPERCASE, LOWERCASE, CAMELCASE) \
705 case WireFormatLite::CPPTYPE_##UPPERCASE: \ 941 case WireFormatLite::CPPTYPE_##UPPERCASE: \
706 if (is_new) { \ 942 Set##CAMELCASE(number, other_extension.type, \
707 extension->repeated_##LOWERCASE##_value = \ 943 other_extension.LOWERCASE##_value, \
708 new REPEATED_TYPE; \ 944 other_extension.descriptor); \
709 } \
710 extension->repeated_##LOWERCASE##_value->MergeFrom( \
711 *other_extension.repeated_##LOWERCASE##_value); \
712 break; 945 break;
713 946
714 HANDLE_TYPE( INT32, int32, RepeatedField < int32>); 947 HANDLE_TYPE( INT32, int32, Int32);
715 HANDLE_TYPE( INT64, int64, RepeatedField < int64>); 948 HANDLE_TYPE( INT64, int64, Int64);
716 HANDLE_TYPE( UINT32, uint32, RepeatedField < uint32>); 949 HANDLE_TYPE(UINT32, uint32, UInt32);
717 HANDLE_TYPE( UINT64, uint64, RepeatedField < uint64>); 950 HANDLE_TYPE(UINT64, uint64, UInt64);
718 HANDLE_TYPE( FLOAT, float, RepeatedField < float>); 951 HANDLE_TYPE( FLOAT, float, Float);
719 HANDLE_TYPE( DOUBLE, double, RepeatedField < double>); 952 HANDLE_TYPE(DOUBLE, double, Double);
720 HANDLE_TYPE( BOOL, bool, RepeatedField < bool>); 953 HANDLE_TYPE( BOOL, bool, Bool);
721 HANDLE_TYPE( ENUM, enum, RepeatedField < int>); 954 HANDLE_TYPE( ENUM, enum, Enum);
722 HANDLE_TYPE( STRING, string, RepeatedPtrField< string>);
723 #undef HANDLE_TYPE 955 #undef HANDLE_TYPE
724 956 case WireFormatLite::CPPTYPE_STRING:
725 case WireFormatLite::CPPTYPE_MESSAGE: 957 SetString(number, other_extension.type,
958 *other_extension.string_value,
959 other_extension.descriptor);
960 break;
961 case WireFormatLite::CPPTYPE_MESSAGE: {
962 Extension* extension;
963 bool is_new = MaybeNewExtension(number,
964 other_extension.descriptor,
965 &extension);
726 if (is_new) { 966 if (is_new) {
727 extension->repeated_message_value = 967 extension->type = other_extension.type;
728 new RepeatedPtrField<MessageLite>(); 968 extension->is_packed = other_extension.is_packed;
729 } 969 extension->is_repeated = false;
730 // We can't call RepeatedPtrField<MessageLite>::MergeFrom() because 970 if (other_extension.is_lazy) {
731 // it would attempt to allocate new objects. 971 extension->is_lazy = true;
732 RepeatedPtrField<MessageLite>* other_repeated_message = 972 extension->lazymessage_value =
733 other_extension.repeated_message_value; 973 other_extension.lazymessage_value->New(arena_);
734 for (int i = 0; i < other_repeated_message->size(); i++) { 974 extension->lazymessage_value->MergeFrom(
735 const MessageLite& other_message = other_repeated_message->Get(i); 975 *other_extension.lazymessage_value);
736 MessageLite* target = extension->repeated_message_value 976 } else {
737 ->AddFromCleared<GenericTypeHandler<MessageLite> >(); 977 extension->is_lazy = false;
738 if (target == NULL) { 978 extension->message_value =
739 target = other_message.New(); 979 other_extension.message_value->New(arena_);
740 extension->repeated_message_value->AddAllocated(target); 980 extension->message_value->CheckTypeAndMergeFrom(
981 *other_extension.message_value);
741 } 982 }
742 target->CheckTypeAndMergeFrom(other_message); 983 } else {
743 } 984 GOOGLE_DCHECK_EQ(extension->type, other_extension.type);
744 break; 985 GOOGLE_DCHECK_EQ(extension->is_packed,other_extension.is_packed);
745 } 986 GOOGLE_DCHECK(!extension->is_repeated);
746 } else { 987 if (other_extension.is_lazy) {
747 if (!other_extension.is_cleared) { 988 if (extension->is_lazy) {
748 switch (cpp_type(other_extension.type)) {
749 #define HANDLE_TYPE(UPPERCASE, LOWERCASE, CAMELCASE) \
750 case WireFormatLite::CPPTYPE_##UPPERCASE: \
751 Set##CAMELCASE(iter->first, other_extension.type, \
752 other_extension.LOWERCASE##_value, \
753 other_extension.descriptor); \
754 break;
755
756 HANDLE_TYPE( INT32, int32, Int32);
757 HANDLE_TYPE( INT64, int64, Int64);
758 HANDLE_TYPE(UINT32, uint32, UInt32);
759 HANDLE_TYPE(UINT64, uint64, UInt64);
760 HANDLE_TYPE( FLOAT, float, Float);
761 HANDLE_TYPE(DOUBLE, double, Double);
762 HANDLE_TYPE( BOOL, bool, Bool);
763 HANDLE_TYPE( ENUM, enum, Enum);
764 #undef HANDLE_TYPE
765 case WireFormatLite::CPPTYPE_STRING:
766 SetString(iter->first, other_extension.type,
767 *other_extension.string_value,
768 other_extension.descriptor);
769 break;
770 case WireFormatLite::CPPTYPE_MESSAGE: {
771 Extension* extension;
772 bool is_new = MaybeNewExtension(iter->first,
773 other_extension.descriptor,
774 &extension);
775 if (is_new) {
776 extension->type = other_extension.type;
777 extension->is_packed = other_extension.is_packed;
778 extension->is_repeated = false;
779 if (other_extension.is_lazy) {
780 extension->is_lazy = true;
781 extension->lazymessage_value =
782 other_extension.lazymessage_value->New();
783 extension->lazymessage_value->MergeFrom( 989 extension->lazymessage_value->MergeFrom(
784 *other_extension.lazymessage_value); 990 *other_extension.lazymessage_value);
785 } else { 991 } else {
786 extension->is_lazy = false; 992 extension->message_value->CheckTypeAndMergeFrom(
787 extension->message_value = 993 other_extension.lazymessage_value->GetMessage(
788 other_extension.message_value->New(); 994 *extension->message_value));
995 }
996 } else {
997 if (extension->is_lazy) {
998 extension->lazymessage_value->MutableMessage(
999 *other_extension.message_value)->CheckTypeAndMergeFrom(
1000 *other_extension.message_value);
1001 } else {
789 extension->message_value->CheckTypeAndMergeFrom( 1002 extension->message_value->CheckTypeAndMergeFrom(
790 *other_extension.message_value); 1003 *other_extension.message_value);
791 } 1004 }
792 } else {
793 GOOGLE_DCHECK_EQ(extension->type, other_extension.type);
794 GOOGLE_DCHECK_EQ(extension->is_packed,other_extension.is_packed);
795 GOOGLE_DCHECK(!extension->is_repeated);
796 if (other_extension.is_lazy) {
797 if (extension->is_lazy) {
798 extension->lazymessage_value->MergeFrom(
799 *other_extension.lazymessage_value);
800 } else {
801 extension->message_value->CheckTypeAndMergeFrom(
802 other_extension.lazymessage_value->GetMessage(
803 *extension->message_value));
804 }
805 } else {
806 if (extension->is_lazy) {
807 extension->lazymessage_value->MutableMessage(
808 *other_extension.message_value)->CheckTypeAndMergeFrom(
809 *other_extension.message_value);
810 } else {
811 extension->message_value->CheckTypeAndMergeFrom(
812 *other_extension.message_value);
813 }
814 }
815 } 1005 }
816 extension->is_cleared = false;
817 break;
818 } 1006 }
1007 extension->is_cleared = false;
1008 break;
819 } 1009 }
820 } 1010 }
821 } 1011 }
822 } 1012 }
823 } 1013 }
824 1014
825 void ExtensionSet::Swap(ExtensionSet* x) { 1015 void ExtensionSet::Swap(ExtensionSet* x) {
826 extensions_.swap(x->extensions_); 1016 if (GetArenaNoVirtual() == x->GetArenaNoVirtual()) {
1017 extensions_.swap(x->extensions_);
1018 } else {
1019 // TODO(cfallin, rohananil): We maybe able to optimize a case where we are
1020 // swapping from heap to arena-allocated extension set, by just Own()'ing
1021 // the extensions.
1022 ExtensionSet extension_set;
1023 extension_set.MergeFrom(*x);
1024 x->Clear();
1025 x->MergeFrom(*this);
1026 Clear();
1027 MergeFrom(extension_set);
1028 }
1029 }
1030
1031 void ExtensionSet::SwapExtension(ExtensionSet* other,
1032 int number) {
1033 if (this == other) return;
1034 map<int, Extension>::iterator this_iter = extensions_.find(number);
1035 map<int, Extension>::iterator other_iter = other->extensions_.find(number);
1036
1037 if (this_iter == extensions_.end() &&
1038 other_iter == other->extensions_.end()) {
1039 return;
1040 }
1041
1042 if (this_iter != extensions_.end() &&
1043 other_iter != other->extensions_.end()) {
1044 if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
1045 using std::swap;
1046 swap(this_iter->second, other_iter->second);
1047 } else {
1048 // TODO(cfallin, rohananil): We could further optimize these cases,
1049 // especially avoid creation of ExtensionSet, and move MergeFrom logic
1050 // into Extensions itself (which takes arena as an argument).
1051 // We do it this way to reuse the copy-across-arenas logic already
1052 // implemented in ExtensionSet's MergeFrom.
1053 ExtensionSet temp;
1054 temp.InternalExtensionMergeFrom(number, other_iter->second);
1055 map<int, Extension>::iterator temp_iter = temp.extensions_.find(number);
1056 other_iter->second.Clear();
1057 other->InternalExtensionMergeFrom(number, this_iter->second);
1058 this_iter->second.Clear();
1059 InternalExtensionMergeFrom(number, temp_iter->second);
1060 }
1061 return;
1062 }
1063
1064 if (this_iter == extensions_.end()) {
1065 if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
1066 extensions_.insert(std::make_pair(number, other_iter->second));
1067 } else {
1068 InternalExtensionMergeFrom(number, other_iter->second);
1069 }
1070 other->extensions_.erase(number);
1071 return;
1072 }
1073
1074 if (other_iter == other->extensions_.end()) {
1075 if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
1076 other->extensions_.insert(std::make_pair(number, this_iter->second));
1077 } else {
1078 other->InternalExtensionMergeFrom(number, this_iter->second);
1079 }
1080 extensions_.erase(number);
1081 return;
1082 }
827 } 1083 }
828 1084
829 bool ExtensionSet::IsInitialized() const { 1085 bool ExtensionSet::IsInitialized() const {
830 // Extensions are never required. However, we need to check that all 1086 // Extensions are never required. However, we need to check that all
831 // embedded messages are initialized. 1087 // embedded messages are initialized.
832 for (map<int, Extension>::const_iterator iter = extensions_.begin(); 1088 for (map<int, Extension>::const_iterator iter = extensions_.begin();
833 iter != extensions_.end(); ++iter) { 1089 iter != extensions_.end(); ++iter) {
834 const Extension& extension = iter->second; 1090 const Extension& extension = iter->second;
835 if (cpp_type(extension.type) == WireFormatLite::CPPTYPE_MESSAGE) { 1091 if (cpp_type(extension.type) == WireFormatLite::CPPTYPE_MESSAGE) {
836 if (extension.is_repeated) { 1092 if (extension.is_repeated) {
(...skipping 11 matching lines...) Expand all
848 } 1104 }
849 } 1105 }
850 } 1106 }
851 } 1107 }
852 } 1108 }
853 1109
854 return true; 1110 return true;
855 } 1111 }
856 1112
857 bool ExtensionSet::FindExtensionInfoFromTag( 1113 bool ExtensionSet::FindExtensionInfoFromTag(
858 uint32 tag, ExtensionFinder* extension_finder, 1114 uint32 tag, ExtensionFinder* extension_finder, int* field_number,
859 int* field_number, ExtensionInfo* extension) { 1115 ExtensionInfo* extension, bool* was_packed_on_wire) {
860 *field_number = WireFormatLite::GetTagFieldNumber(tag); 1116 *field_number = WireFormatLite::GetTagFieldNumber(tag);
861 WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag); 1117 WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag);
1118 return FindExtensionInfoFromFieldNumber(wire_type, *field_number,
1119 extension_finder, extension,
1120 was_packed_on_wire);
1121 }
862 1122
863 bool is_unknown; 1123 bool ExtensionSet::FindExtensionInfoFromFieldNumber(
864 if (!extension_finder->Find(*field_number, extension)) { 1124 int wire_type, int field_number, ExtensionFinder* extension_finder,
865 is_unknown = true; 1125 ExtensionInfo* extension, bool* was_packed_on_wire) {
866 } else if (extension->is_packed) { 1126 if (!extension_finder->Find(field_number, extension)) {
867 is_unknown = (wire_type != WireFormatLite::WIRETYPE_LENGTH_DELIMITED); 1127 return false;
868 } else {
869 WireFormatLite::WireType expected_wire_type =
870 WireFormatLite::WireTypeForFieldType(real_type(extension->type));
871 is_unknown = (wire_type != expected_wire_type);
872 } 1128 }
873 return !is_unknown; 1129
1130 WireFormatLite::WireType expected_wire_type =
1131 WireFormatLite::WireTypeForFieldType(real_type(extension->type));
1132
1133 // Check if this is a packed field.
1134 *was_packed_on_wire = false;
1135 if (extension->is_repeated &&
1136 wire_type == WireFormatLite::WIRETYPE_LENGTH_DELIMITED &&
1137 is_packable(expected_wire_type)) {
1138 *was_packed_on_wire = true;
1139 return true;
1140 }
1141 // Otherwise the wire type must match.
1142 return expected_wire_type == wire_type;
874 } 1143 }
875 1144
876 bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, 1145 bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
877 ExtensionFinder* extension_finder, 1146 ExtensionFinder* extension_finder,
878 FieldSkipper* field_skipper) { 1147 FieldSkipper* field_skipper) {
879 int number; 1148 int number;
1149 bool was_packed_on_wire;
880 ExtensionInfo extension; 1150 ExtensionInfo extension;
881 if (!FindExtensionInfoFromTag(tag, extension_finder, &number, &extension)) { 1151 if (!FindExtensionInfoFromTag(
1152 tag, extension_finder, &number, &extension, &was_packed_on_wire)) {
882 return field_skipper->SkipField(input, tag); 1153 return field_skipper->SkipField(input, tag);
883 } else { 1154 } else {
884 return ParseFieldWithExtensionInfo(number, extension, input, field_skipper); 1155 return ParseFieldWithExtensionInfo(
1156 number, was_packed_on_wire, extension, input, field_skipper);
885 } 1157 }
886 } 1158 }
887 1159
888 bool ExtensionSet::ParseFieldWithExtensionInfo( 1160 bool ExtensionSet::ParseFieldWithExtensionInfo(
889 int number, const ExtensionInfo& extension, 1161 int number, bool was_packed_on_wire, const ExtensionInfo& extension,
890 io::CodedInputStream* input, 1162 io::CodedInputStream* input,
891 FieldSkipper* field_skipper) { 1163 FieldSkipper* field_skipper) {
892 if (extension.is_packed) { 1164 // Explicitly not read extension.is_packed, instead check whether the field
1165 // was encoded in packed form on the wire.
1166 if (was_packed_on_wire) {
893 uint32 size; 1167 uint32 size;
894 if (!input->ReadVarint32(&size)) return false; 1168 if (!input->ReadVarint32(&size)) return false;
895 io::CodedInputStream::Limit limit = input->PushLimit(size); 1169 io::CodedInputStream::Limit limit = input->PushLimit(size);
896 1170
897 switch (extension.type) { 1171 switch (extension.type) {
898 #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \ 1172 #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \
899 case WireFormatLite::TYPE_##UPPERCASE: \ 1173 case WireFormatLite::TYPE_##UPPERCASE: \
900 while (input->BytesUntilLimit() > 0) { \ 1174 while (input->BytesUntilLimit() > 0) { \
901 CPP_LOWERCASE value; \ 1175 CPP_LOWERCASE value; \
902 if (!WireFormatLite::ReadPrimitive< \ 1176 if (!WireFormatLite::ReadPrimitive< \
903 CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>( \ 1177 CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>( \
904 input, &value)) return false; \ 1178 input, &value)) return false; \
905 Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \ 1179 Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \
906 true, value, extension.descriptor); \ 1180 extension.is_packed, value, \
1181 extension.descriptor); \
907 } \ 1182 } \
908 break 1183 break
909 1184
910 HANDLE_TYPE( INT32, Int32, int32); 1185 HANDLE_TYPE( INT32, Int32, int32);
911 HANDLE_TYPE( INT64, Int64, int64); 1186 HANDLE_TYPE( INT64, Int64, int64);
912 HANDLE_TYPE( UINT32, UInt32, uint32); 1187 HANDLE_TYPE( UINT32, UInt32, uint32);
913 HANDLE_TYPE( UINT64, UInt64, uint64); 1188 HANDLE_TYPE( UINT64, UInt64, uint64);
914 HANDLE_TYPE( SINT32, Int32, int32); 1189 HANDLE_TYPE( SINT32, Int32, int32);
915 HANDLE_TYPE( SINT64, Int64, int64); 1190 HANDLE_TYPE( SINT64, Int64, int64);
916 HANDLE_TYPE( FIXED32, UInt32, uint32); 1191 HANDLE_TYPE( FIXED32, UInt32, uint32);
917 HANDLE_TYPE( FIXED64, UInt64, uint64); 1192 HANDLE_TYPE( FIXED64, UInt64, uint64);
918 HANDLE_TYPE(SFIXED32, Int32, int32); 1193 HANDLE_TYPE(SFIXED32, Int32, int32);
919 HANDLE_TYPE(SFIXED64, Int64, int64); 1194 HANDLE_TYPE(SFIXED64, Int64, int64);
920 HANDLE_TYPE( FLOAT, Float, float); 1195 HANDLE_TYPE( FLOAT, Float, float);
921 HANDLE_TYPE( DOUBLE, Double, double); 1196 HANDLE_TYPE( DOUBLE, Double, double);
922 HANDLE_TYPE( BOOL, Bool, bool); 1197 HANDLE_TYPE( BOOL, Bool, bool);
923 #undef HANDLE_TYPE 1198 #undef HANDLE_TYPE
924 1199
925 case WireFormatLite::TYPE_ENUM: 1200 case WireFormatLite::TYPE_ENUM:
926 while (input->BytesUntilLimit() > 0) { 1201 while (input->BytesUntilLimit() > 0) {
927 int value; 1202 int value;
928 if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>( 1203 if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
929 input, &value)) return false; 1204 input, &value)) return false;
930 if (extension.enum_validity_check.func( 1205 if (extension.enum_validity_check.func(
931 extension.enum_validity_check.arg, value)) { 1206 extension.enum_validity_check.arg, value)) {
932 AddEnum(number, WireFormatLite::TYPE_ENUM, true, value, 1207 AddEnum(number, WireFormatLite::TYPE_ENUM, extension.is_packed,
933 extension.descriptor); 1208 value, extension.descriptor);
1209 } else {
1210 // Invalid value. Treat as unknown.
1211 field_skipper->SkipUnknownEnum(number, value);
934 } 1212 }
935 } 1213 }
936 break; 1214 break;
937 1215
938 case WireFormatLite::TYPE_STRING: 1216 case WireFormatLite::TYPE_STRING:
939 case WireFormatLite::TYPE_BYTES: 1217 case WireFormatLite::TYPE_BYTES:
940 case WireFormatLite::TYPE_GROUP: 1218 case WireFormatLite::TYPE_GROUP:
941 case WireFormatLite::TYPE_MESSAGE: 1219 case WireFormatLite::TYPE_MESSAGE:
942 GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; 1220 GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed.";
943 break; 1221 break;
944 } 1222 }
945 1223
946 input->PopLimit(limit); 1224 input->PopLimit(limit);
947 } else { 1225 } else {
948 switch (extension.type) { 1226 switch (extension.type) {
949 #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \ 1227 #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \
950 case WireFormatLite::TYPE_##UPPERCASE: { \ 1228 case WireFormatLite::TYPE_##UPPERCASE: { \
951 CPP_LOWERCASE value; \ 1229 CPP_LOWERCASE value; \
952 if (!WireFormatLite::ReadPrimitive< \ 1230 if (!WireFormatLite::ReadPrimitive< \
953 CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>( \ 1231 CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>( \
954 input, &value)) return false; \ 1232 input, &value)) return false; \
955 if (extension.is_repeated) { \ 1233 if (extension.is_repeated) { \
956 Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \ 1234 Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \
957 false, value, extension.descriptor); \ 1235 extension.is_packed, value, \
1236 extension.descriptor); \
958 } else { \ 1237 } else { \
959 Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value, \ 1238 Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value, \
960 extension.descriptor); \ 1239 extension.descriptor); \
961 } \ 1240 } \
962 } break 1241 } break
963 1242
964 HANDLE_TYPE( INT32, Int32, int32); 1243 HANDLE_TYPE( INT32, Int32, int32);
965 HANDLE_TYPE( INT64, Int64, int64); 1244 HANDLE_TYPE( INT64, Int64, int64);
966 HANDLE_TYPE( UINT32, UInt32, uint32); 1245 HANDLE_TYPE( UINT32, UInt32, uint32);
967 HANDLE_TYPE( UINT64, UInt64, uint64); 1246 HANDLE_TYPE( UINT64, UInt64, uint64);
(...skipping 11 matching lines...) Expand all
979 case WireFormatLite::TYPE_ENUM: { 1258 case WireFormatLite::TYPE_ENUM: {
980 int value; 1259 int value;
981 if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>( 1260 if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
982 input, &value)) return false; 1261 input, &value)) return false;
983 1262
984 if (!extension.enum_validity_check.func( 1263 if (!extension.enum_validity_check.func(
985 extension.enum_validity_check.arg, value)) { 1264 extension.enum_validity_check.arg, value)) {
986 // Invalid value. Treat as unknown. 1265 // Invalid value. Treat as unknown.
987 field_skipper->SkipUnknownEnum(number, value); 1266 field_skipper->SkipUnknownEnum(number, value);
988 } else if (extension.is_repeated) { 1267 } else if (extension.is_repeated) {
989 AddEnum(number, WireFormatLite::TYPE_ENUM, false, value, 1268 AddEnum(number, WireFormatLite::TYPE_ENUM, extension.is_packed, value,
990 extension.descriptor); 1269 extension.descriptor);
991 } else { 1270 } else {
992 SetEnum(number, WireFormatLite::TYPE_ENUM, value, 1271 SetEnum(number, WireFormatLite::TYPE_ENUM, value,
993 extension.descriptor); 1272 extension.descriptor);
994 } 1273 }
995 break; 1274 break;
996 } 1275 }
997 1276
998 case WireFormatLite::TYPE_STRING: { 1277 case WireFormatLite::TYPE_STRING: {
999 string* value = extension.is_repeated ? 1278 string* value = extension.is_repeated ?
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 if (!WireFormatLite::ReadMessage(input, value)) return false; 1311 if (!WireFormatLite::ReadMessage(input, value)) return false;
1033 break; 1312 break;
1034 } 1313 }
1035 } 1314 }
1036 } 1315 }
1037 1316
1038 return true; 1317 return true;
1039 } 1318 }
1040 1319
1041 bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, 1320 bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
1321 const MessageLite* containing_type) {
1322 FieldSkipper skipper;
1323 GeneratedExtensionFinder finder(containing_type);
1324 return ParseField(tag, input, &finder, &skipper);
1325 }
1326
1327 bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
1042 const MessageLite* containing_type, 1328 const MessageLite* containing_type,
1043 UnknownFieldSet* unknown_fields) { 1329 io::CodedOutputStream* unknown_fields) {
1044 FieldSkipper skipper(unknown_fields); 1330 CodedOutputStreamFieldSkipper skipper(unknown_fields);
1045 GeneratedExtensionFinder finder(containing_type); 1331 GeneratedExtensionFinder finder(containing_type);
1046 return ParseField(tag, input, &finder, &skipper); 1332 return ParseField(tag, input, &finder, &skipper);
1047 } 1333 }
1048 1334
1049 // Defined in extension_set_heavy.cc. 1335 // Defined in extension_set_heavy.cc.
1050 // bool ExtensionSet::ParseFieldHeavy(uint32 tag, io::CodedInputStream* input, 1336 // bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
1051 // const Message* containing_type, 1337 // const MessageLite* containing_type,
1052 // UnknownFieldSet* unknown_fields) 1338 // UnknownFieldSet* unknown_fields)
1053 1339
1054 // Defined in extension_set_heavy.cc. 1340 // Defined in extension_set_heavy.cc.
1055 // bool ExtensionSet::ParseMessageSetHeavy(io::CodedInputStream* input, 1341 // bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input,
1056 // const Message* containing_type, 1342 // const MessageLite* containing_type,
1057 // UnknownFieldSet* unknown_fields); 1343 // UnknownFieldSet* unknown_fields);
1058 1344
1059 void ExtensionSet::SerializeWithCachedSizes( 1345 void ExtensionSet::SerializeWithCachedSizes(
1060 int start_field_number, int end_field_number, 1346 int start_field_number, int end_field_number,
1061 io::CodedOutputStream* output) const { 1347 io::CodedOutputStream* output) const {
1062 map<int, Extension>::const_iterator iter; 1348 map<int, Extension>::const_iterator iter;
1063 for (iter = extensions_.lower_bound(start_field_number); 1349 for (iter = extensions_.lower_bound(start_field_number);
1064 iter != extensions_.end() && iter->first < end_field_number; 1350 iter != extensions_.end() && iter->first < end_field_number;
1065 ++iter) { 1351 ++iter) {
1066 iter->second.SerializeFieldWithCachedSizes(iter->first, output); 1352 iter->second.SerializeFieldWithCachedSizes(iter->first, output);
1067 } 1353 }
(...skipping 10 matching lines...) Expand all
1078 return total_size; 1364 return total_size;
1079 } 1365 }
1080 1366
1081 // Defined in extension_set_heavy.cc. 1367 // Defined in extension_set_heavy.cc.
1082 // int ExtensionSet::SpaceUsedExcludingSelf() const 1368 // int ExtensionSet::SpaceUsedExcludingSelf() const
1083 1369
1084 bool ExtensionSet::MaybeNewExtension(int number, 1370 bool ExtensionSet::MaybeNewExtension(int number,
1085 const FieldDescriptor* descriptor, 1371 const FieldDescriptor* descriptor,
1086 Extension** result) { 1372 Extension** result) {
1087 pair<map<int, Extension>::iterator, bool> insert_result = 1373 pair<map<int, Extension>::iterator, bool> insert_result =
1088 extensions_.insert(make_pair(number, Extension())); 1374 extensions_.insert(std::make_pair(number, Extension()));
1089 *result = &insert_result.first->second; 1375 *result = &insert_result.first->second;
1090 (*result)->descriptor = descriptor; 1376 (*result)->descriptor = descriptor;
1091 return insert_result.second; 1377 return insert_result.second;
1092 } 1378 }
1093 1379
1094 // =================================================================== 1380 // ===================================================================
1095 // Methods of ExtensionSet::Extension 1381 // Methods of ExtensionSet::Extension
1096 1382
1097 void ExtensionSet::Extension::Clear() { 1383 void ExtensionSet::Extension::Clear() {
1098 if (is_repeated) { 1384 if (is_repeated) {
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
1409 HANDLE_TYPE( ENUM, enum); 1695 HANDLE_TYPE( ENUM, enum);
1410 HANDLE_TYPE( STRING, string); 1696 HANDLE_TYPE( STRING, string);
1411 HANDLE_TYPE(MESSAGE, message); 1697 HANDLE_TYPE(MESSAGE, message);
1412 #undef HANDLE_TYPE 1698 #undef HANDLE_TYPE
1413 } 1699 }
1414 1700
1415 GOOGLE_LOG(FATAL) << "Can't get here."; 1701 GOOGLE_LOG(FATAL) << "Can't get here.";
1416 return 0; 1702 return 0;
1417 } 1703 }
1418 1704
1705 // This function deletes all allocated objects. This function should be only
1706 // called if the Extension was created with an arena.
1419 void ExtensionSet::Extension::Free() { 1707 void ExtensionSet::Extension::Free() {
1420 if (is_repeated) { 1708 if (is_repeated) {
1421 switch (cpp_type(type)) { 1709 switch (cpp_type(type)) {
1422 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 1710 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
1423 case WireFormatLite::CPPTYPE_##UPPERCASE: \ 1711 case WireFormatLite::CPPTYPE_##UPPERCASE: \
1424 delete repeated_##LOWERCASE##_value; \ 1712 delete repeated_##LOWERCASE##_value; \
1425 break 1713 break
1426 1714
1427 HANDLE_TYPE( INT32, int32); 1715 HANDLE_TYPE( INT32, int32);
1428 HANDLE_TYPE( INT64, int64); 1716 HANDLE_TYPE( INT64, int64);
(...skipping 21 matching lines...) Expand all
1450 break; 1738 break;
1451 default: 1739 default:
1452 break; 1740 break;
1453 } 1741 }
1454 } 1742 }
1455 } 1743 }
1456 1744
1457 // Defined in extension_set_heavy.cc. 1745 // Defined in extension_set_heavy.cc.
1458 // int ExtensionSet::Extension::SpaceUsedExcludingSelf() const 1746 // int ExtensionSet::Extension::SpaceUsedExcludingSelf() const
1459 1747
1748 // ==================================================================
1749 // Default repeated field instances for iterator-compatible accessors
1750
1751 GOOGLE_PROTOBUF_DECLARE_ONCE(repeated_primitive_generic_type_traits_once_init_);
1752 GOOGLE_PROTOBUF_DECLARE_ONCE(repeated_string_type_traits_once_init_);
1753 GOOGLE_PROTOBUF_DECLARE_ONCE(repeated_message_generic_type_traits_once_init_);
1754
1755 void RepeatedPrimitiveGenericTypeTraits::InitializeDefaultRepeatedFields() {
1756 default_repeated_field_int32_ = new RepeatedField<int32>;
1757 default_repeated_field_int64_ = new RepeatedField<int64>;
1758 default_repeated_field_uint32_ = new RepeatedField<uint32>;
1759 default_repeated_field_uint64_ = new RepeatedField<uint64>;
1760 default_repeated_field_double_ = new RepeatedField<double>;
1761 default_repeated_field_float_ = new RepeatedField<float>;
1762 default_repeated_field_bool_ = new RepeatedField<bool>;
1763 OnShutdown(&DestroyDefaultRepeatedFields);
1764 }
1765
1766 void RepeatedPrimitiveGenericTypeTraits::DestroyDefaultRepeatedFields() {
1767 delete default_repeated_field_int32_;
1768 delete default_repeated_field_int64_;
1769 delete default_repeated_field_uint32_;
1770 delete default_repeated_field_uint64_;
1771 delete default_repeated_field_double_;
1772 delete default_repeated_field_float_;
1773 delete default_repeated_field_bool_;
1774 }
1775
1776 void RepeatedStringTypeTraits::InitializeDefaultRepeatedFields() {
1777 default_repeated_field_ = new RepeatedFieldType;
1778 OnShutdown(&DestroyDefaultRepeatedFields);
1779 }
1780
1781 void RepeatedStringTypeTraits::DestroyDefaultRepeatedFields() {
1782 delete default_repeated_field_;
1783 }
1784
1785 void RepeatedMessageGenericTypeTraits::InitializeDefaultRepeatedFields() {
1786 default_repeated_field_ = new RepeatedFieldType;
1787 OnShutdown(&DestroyDefaultRepeatedFields);
1788 }
1789
1790 void RepeatedMessageGenericTypeTraits::DestroyDefaultRepeatedFields() {
1791 delete default_repeated_field_;
1792 }
1793
1794 const RepeatedField<int32>*
1795 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int32_ = NULL;
1796 const RepeatedField<int64>*
1797 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int64_ = NULL;
1798 const RepeatedField<uint32>*
1799 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint32_ = NULL;
1800 const RepeatedField<uint64>*
1801 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint64_ = NULL;
1802 const RepeatedField<double>*
1803 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_double_ = NULL;
1804 const RepeatedField<float>*
1805 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_float_ = NULL;
1806 const RepeatedField<bool>*
1807 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_ = NULL;
1808 const RepeatedStringTypeTraits::RepeatedFieldType*
1809 RepeatedStringTypeTraits::default_repeated_field_ = NULL;
1810 const RepeatedMessageGenericTypeTraits::RepeatedFieldType*
1811 RepeatedMessageGenericTypeTraits::default_repeated_field_ = NULL;
1812
1460 } // namespace internal 1813 } // namespace internal
1461 } // namespace protobuf 1814 } // namespace protobuf
1462 } // namespace google 1815 } // namespace google
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698