1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // https://developers.google.com/protocol-buffers/ 4 // 5 // Redistribution and use in source and binary forms, with or without 6 // modification, are permitted provided that the following conditions are 7 // met: 8 // 9 // * Redistributions of source code must retain the above copyright 10 // notice, this list of conditions and the following disclaimer. 11 // * Redistributions in binary form must reproduce the above 12 // copyright notice, this list of conditions and the following disclaimer 13 // in the documentation and/or other materials provided with the 14 // distribution. 15 // * Neither the name of Google Inc. nor the names of its 16 // contributors may be used to endorse or promote products derived from 17 // this software without specific prior written permission. 18 // 19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31 // Author: kenton (at) google.com (Kenton Varda) 32 // Based on original Protocol Buffers design by 33 // Sanjay Ghemawat, Jeff Dean, and others. 34 35 #include <google/protobuf/stubs/hash.h> 36 #include <google/protobuf/stubs/common.h> 37 #include <google/protobuf/stubs/once.h> 38 #include <google/protobuf/extension_set.h> 39 #include <google/protobuf/message_lite.h> 40 #include <google/protobuf/io/coded_stream.h> 41 #include <google/protobuf/wire_format_lite_inl.h> 42 #include <google/protobuf/repeated_field.h> 43 #include <google/protobuf/stubs/map_util.h> 44 45 namespace google { 46 namespace protobuf { 47 namespace internal { 48 49 namespace { 50 51 inline WireFormatLite::FieldType real_type(FieldType type) { 52 GOOGLE_DCHECK(type > 0 && type <= WireFormatLite::MAX_FIELD_TYPE); 53 return static_cast<WireFormatLite::FieldType>(type); 54 } 55 56 inline WireFormatLite::CppType cpp_type(FieldType type) { 57 return WireFormatLite::FieldTypeToCppType(real_type(type)); 58 } 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 } 75 76 // Registry stuff. 77 typedef hash_map<pair<const MessageLite*, int>, 78 ExtensionInfo> ExtensionRegistry; 79 ExtensionRegistry* registry_ = NULL; 80 GOOGLE_PROTOBUF_DECLARE_ONCE(registry_init_); 81 82 void DeleteRegistry() { 83 delete registry_; 84 registry_ = NULL; 85 } 86 87 void InitRegistry() { 88 registry_ = new ExtensionRegistry; 89 OnShutdown(&DeleteRegistry); 90 } 91 92 // This function is only called at startup, so there is no need for thread- 93 // safety. 94 void Register(const MessageLite* containing_type, 95 int number, ExtensionInfo info) { 96 ::google::protobuf::GoogleOnceInit(®istry_init_, &InitRegistry); 97 98 if (!InsertIfNotPresent(registry_, make_pair(containing_type, number), 99 info)) { 100 GOOGLE_LOG(FATAL) << "Multiple extension registrations for type \"" 101 << containing_type->GetTypeName() 102 << "\", field number " << number << "."; 103 } 104 } 105 106 const ExtensionInfo* FindRegisteredExtension( 107 const MessageLite* containing_type, int number) { 108 return (registry_ == NULL) ? NULL : 109 FindOrNull(*registry_, make_pair(containing_type, number)); 110 } 111 112 } // namespace 113 114 ExtensionFinder::~ExtensionFinder() {} 115 116 bool GeneratedExtensionFinder::Find(int number, ExtensionInfo* output) { 117 const ExtensionInfo* extension = 118 FindRegisteredExtension(containing_type_, number); 119 if (extension == NULL) { 120 return false; 121 } else { 122 *output = *extension; 123 return true; 124 } 125 } 126 127 void ExtensionSet::RegisterExtension(const MessageLite* containing_type, 128 int number, FieldType type, 129 bool is_repeated, bool is_packed) { 130 GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_ENUM); 131 GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_MESSAGE); 132 GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_GROUP); 133 ExtensionInfo info(type, is_repeated, is_packed); 134 Register(containing_type, number, info); 135 } 136 137 static bool CallNoArgValidityFunc(const void* arg, int number) { 138 // Note: Must use C-style cast here rather than reinterpret_cast because 139 // the C++ standard at one point did not allow casts between function and 140 // data pointers and some compilers enforce this for C++-style casts. No 141 // compiler enforces it for C-style casts since lots of C-style code has 142 // relied on these kinds of casts for a long time, despite being 143 // technically undefined. See: 144 // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#195 145 // Also note: Some compilers do not allow function pointers to be "const". 146 // Which makes sense, I suppose, because it's meaningless. 147 return ((EnumValidityFunc*)arg)(number); 148 } 149 150 void ExtensionSet::RegisterEnumExtension(const MessageLite* containing_type, 151 int number, FieldType type, 152 bool is_repeated, bool is_packed, 153 EnumValidityFunc* is_valid) { 154 GOOGLE_CHECK_EQ(type, WireFormatLite::TYPE_ENUM); 155 ExtensionInfo info(type, is_repeated, is_packed); 156 info.enum_validity_check.func = CallNoArgValidityFunc; 157 // See comment in CallNoArgValidityFunc() about why we use a c-style cast. 158 info.enum_validity_check.arg = (void*)is_valid; 159 Register(containing_type, number, info); 160 } 161 162 void ExtensionSet::RegisterMessageExtension(const MessageLite* containing_type, 163 int number, FieldType type, 164 bool is_repeated, bool is_packed, 165 const MessageLite* prototype) { 166 GOOGLE_CHECK(type == WireFormatLite::TYPE_MESSAGE || 167 type == WireFormatLite::TYPE_GROUP); 168 ExtensionInfo info(type, is_repeated, is_packed); 169 info.message_prototype = prototype; 170 Register(containing_type, number, info); 171 } 172 173 174 // =================================================================== 175 // Constructors and basic methods. 176 177 ExtensionSet::ExtensionSet() {} 178 179 ExtensionSet::~ExtensionSet() { 180 for (map<int, Extension>::iterator iter = extensions_.begin(); 181 iter != extensions_.end(); ++iter) { 182 iter->second.Free(); 183 } 184 } 185 186 // Defined in extension_set_heavy.cc. 187 // void ExtensionSet::AppendToList(const Descriptor* containing_type, 188 // const DescriptorPool* pool, 189 // vector<const FieldDescriptor*>* output) const 190 191 bool ExtensionSet::Has(int number) const { 192 map<int, Extension>::const_iterator iter = extensions_.find(number); 193 if (iter == extensions_.end()) return false; 194 GOOGLE_DCHECK(!iter->second.is_repeated); 195 return !iter->second.is_cleared; 196 } 197 198 int ExtensionSet::NumExtensions() const { 199 int result = 0; 200 for (map<int, Extension>::const_iterator iter = extensions_.begin(); 201 iter != extensions_.end(); ++iter) { 202 if (!iter->second.is_cleared) { 203 ++result; 204 } 205 } 206 return result; 207 } 208 209 int ExtensionSet::ExtensionSize(int number) const { 210 map<int, Extension>::const_iterator iter = extensions_.find(number); 211 if (iter == extensions_.end()) return false; 212 return iter->second.GetSize(); 213 } 214 215 FieldType ExtensionSet::ExtensionType(int number) const { 216 map<int, Extension>::const_iterator iter = extensions_.find(number); 217 if (iter == extensions_.end()) { 218 GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present (1). "; 219 return 0; 220 } 221 if (iter->second.is_cleared) { 222 GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present (2). "; 223 } 224 return iter->second.type; 225 } 226 227 void ExtensionSet::ClearExtension(int number) { 228 map<int, Extension>::iterator iter = extensions_.find(number); 229 if (iter == extensions_.end()) return; 230 iter->second.Clear(); 231 } 232 233 // =================================================================== 234 // Field accessors 235 236 namespace { 237 238 enum Cardinality { 239 REPEATED, 240 OPTIONAL 241 }; 242 243 } // namespace 244 245 #define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE) \ 246 GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? REPEATED : OPTIONAL, LABEL); \ 247 GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), WireFormatLite::CPPTYPE_##CPPTYPE) 248 249 // ------------------------------------------------------------------- 250 // Primitives 251 252 #define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE) \ 253 \ 254 LOWERCASE ExtensionSet::Get##CAMELCASE(int number, \ 255 LOWERCASE default_value) const { \ 256 map<int, Extension>::const_iterator iter = extensions_.find(number); \ 257 if (iter == extensions_.end() || iter->second.is_cleared) { \ 258 return default_value; \ 259 } else { \ 260 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, UPPERCASE); \ 261 return iter->second.LOWERCASE##_value; \ 262 } \ 263 } \ 264 \ 265 void ExtensionSet::Set##CAMELCASE(int number, FieldType type, \ 266 LOWERCASE value, \ 267 const FieldDescriptor* descriptor) { \ 268 Extension* extension; \ 269 if (MaybeNewExtension(number, descriptor, &extension)) { \ 270 extension->type = type; \ 271 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \ 272 extension->is_repeated = false; \ 273 } else { \ 274 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, UPPERCASE); \ 275 } \ 276 extension->is_cleared = false; \ 277 extension->LOWERCASE##_value = value; \ 278 } \ 279 \ 280 LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) const { \ 281 map<int, Extension>::const_iterator iter = extensions_.find(number); \ 282 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; \ 283 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \ 284 return iter->second.repeated_##LOWERCASE##_value->Get(index); \ 285 } \ 286 \ 287 void ExtensionSet::SetRepeated##CAMELCASE( \ 288 int number, int index, LOWERCASE value) { \ 289 map<int, Extension>::iterator iter = extensions_.find(number); \ 290 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; \ 291 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \ 292 iter->second.repeated_##LOWERCASE##_value->Set(index, value); \ 293 } \ 294 \ 295 void ExtensionSet::Add##CAMELCASE(int number, FieldType type, \ 296 bool packed, LOWERCASE value, \ 297 const FieldDescriptor* descriptor) { \ 298 Extension* extension; \ 299 if (MaybeNewExtension(number, descriptor, &extension)) { \ 300 extension->type = type; \ 301 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \ 302 extension->is_repeated = true; \ 303 extension->is_packed = packed; \ 304 extension->repeated_##LOWERCASE##_value = new RepeatedField<LOWERCASE>(); \ 305 } else { \ 306 GOOGLE_DCHECK_TYPE(*extension, REPEATED, UPPERCASE); \ 307 GOOGLE_DCHECK_EQ(extension->is_packed, packed); \ 308 } \ 309 extension->repeated_##LOWERCASE##_value->Add(value); \ 310 } 311 312 PRIMITIVE_ACCESSORS( INT32, int32, Int32) 313 PRIMITIVE_ACCESSORS( INT64, int64, Int64) 314 PRIMITIVE_ACCESSORS(UINT32, uint32, UInt32) 315 PRIMITIVE_ACCESSORS(UINT64, uint64, UInt64) 316 PRIMITIVE_ACCESSORS( FLOAT, float, Float) 317 PRIMITIVE_ACCESSORS(DOUBLE, double, Double) 318 PRIMITIVE_ACCESSORS( BOOL, bool, Bool) 319 320 #undef PRIMITIVE_ACCESSORS 321 322 const void* ExtensionSet::GetRawRepeatedField(int number, 323 const void* default_value) const { 324 map<int, Extension>::const_iterator iter = extensions_.find(number); 325 if (iter == extensions_.end()) { 326 return default_value; 327 } 328 // We assume that all the RepeatedField<>* pointers have the same 329 // size and alignment within the anonymous union in Extension. 330 return iter->second.repeated_int32_value; 331 } 332 333 void* ExtensionSet::MutableRawRepeatedField(int number, FieldType field_type, 334 bool packed, 335 const FieldDescriptor* desc) { 336 Extension* extension; 337 338 // We instantiate an empty Repeated{,Ptr}Field if one doesn't exist for this 339 // extension. 340 if (MaybeNewExtension(number, desc, &extension)) { 341 extension->is_repeated = true; 342 extension->type = field_type; 343 extension->is_packed = packed; 344 345 switch (WireFormatLite::FieldTypeToCppType( 346 static_cast<WireFormatLite::FieldType>(field_type))) { 347 case WireFormatLite::CPPTYPE_INT32: 348 extension->repeated_int32_value = new RepeatedField<int32>(); 349 break; 350 case WireFormatLite::CPPTYPE_INT64: 351 extension->repeated_int64_value = new RepeatedField<int64>(); 352 break; 353 case WireFormatLite::CPPTYPE_UINT32: 354 extension->repeated_uint32_value = new RepeatedField<uint32>(); 355 break; 356 case WireFormatLite::CPPTYPE_UINT64: 357 extension->repeated_uint64_value = new RepeatedField<uint64>(); 358 break; 359 case WireFormatLite::CPPTYPE_DOUBLE: 360 extension->repeated_double_value = new RepeatedField<double>(); 361 break; 362 case WireFormatLite::CPPTYPE_FLOAT: 363 extension->repeated_float_value = new RepeatedField<float>(); 364 break; 365 case WireFormatLite::CPPTYPE_BOOL: 366 extension->repeated_bool_value = new RepeatedField<bool>(); 367 break; 368 case WireFormatLite::CPPTYPE_ENUM: 369 extension->repeated_enum_value = new RepeatedField<int>(); 370 break; 371 case WireFormatLite::CPPTYPE_STRING: 372 extension->repeated_string_value = new RepeatedPtrField< ::std::string>(); 373 break; 374 case WireFormatLite::CPPTYPE_MESSAGE: 375 extension->repeated_message_value = new RepeatedPtrField<MessageLite>(); 376 break; 377 } 378 } 379 380 // We assume that all the RepeatedField<>* pointers have the same 381 // size and alignment within the anonymous union in Extension. 382 return extension->repeated_int32_value; 383 } 384 385 // Compatible version using old call signature. Does not create extensions when 386 // the don't already exist; instead, just GOOGLE_CHECK-fails. 387 void* ExtensionSet::MutableRawRepeatedField(int number) { 388 map<int, Extension>::iterator iter = extensions_.find(number); 389 GOOGLE_CHECK(iter == extensions_.end()) << "Extension not found."; 390 // We assume that all the RepeatedField<>* pointers have the same 391 // size and alignment within the anonymous union in Extension. 392 return iter->second.repeated_int32_value; 393 } 394 395 396 // ------------------------------------------------------------------- 397 // Enums 398 399 int ExtensionSet::GetEnum(int number, int default_value) const { 400 map<int, Extension>::const_iterator iter = extensions_.find(number); 401 if (iter == extensions_.end() || iter->second.is_cleared) { 402 // Not present. Return the default value. 403 return default_value; 404 } else { 405 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, ENUM); 406 return iter->second.enum_value; 407 } 408 } 409 410 void ExtensionSet::SetEnum(int number, FieldType type, int value, 411 const FieldDescriptor* descriptor) { 412 Extension* extension; 413 if (MaybeNewExtension(number, descriptor, &extension)) { 414 extension->type = type; 415 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM); 416 extension->is_repeated = false; 417 } else { 418 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, ENUM); 419 } 420 extension->is_cleared = false; 421 extension->enum_value = value; 422 } 423 424 int ExtensionSet::GetRepeatedEnum(int number, int index) const { 425 map<int, Extension>::const_iterator iter = extensions_.find(number); 426 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; 427 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM); 428 return iter->second.repeated_enum_value->Get(index); 429 } 430 431 void ExtensionSet::SetRepeatedEnum(int number, int index, int value) { 432 map<int, Extension>::iterator iter = extensions_.find(number); 433 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; 434 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM); 435 iter->second.repeated_enum_value->Set(index, value); 436 } 437 438 void ExtensionSet::AddEnum(int number, FieldType type, 439 bool packed, int value, 440 const FieldDescriptor* descriptor) { 441 Extension* extension; 442 if (MaybeNewExtension(number, descriptor, &extension)) { 443 extension->type = type; 444 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM); 445 extension->is_repeated = true; 446 extension->is_packed = packed; 447 extension->repeated_enum_value = new RepeatedField<int>(); 448 } else { 449 GOOGLE_DCHECK_TYPE(*extension, REPEATED, ENUM); 450 GOOGLE_DCHECK_EQ(extension->is_packed, packed); 451 } 452 extension->repeated_enum_value->Add(value); 453 } 454 455 // ------------------------------------------------------------------- 456 // Strings 457 458 const string& ExtensionSet::GetString(int number, 459 const string& default_value) const { 460 map<int, Extension>::const_iterator iter = extensions_.find(number); 461 if (iter == extensions_.end() || iter->second.is_cleared) { 462 // Not present. Return the default value. 463 return default_value; 464 } else { 465 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, STRING); 466 return *iter->second.string_value; 467 } 468 } 469 470 string* ExtensionSet::MutableString(int number, FieldType type, 471 const FieldDescriptor* descriptor) { 472 Extension* extension; 473 if (MaybeNewExtension(number, descriptor, &extension)) { 474 extension->type = type; 475 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING); 476 extension->is_repeated = false; 477 extension->string_value = new string; 478 } else { 479 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, STRING); 480 } 481 extension->is_cleared = false; 482 return extension->string_value; 483 } 484 485 const string& ExtensionSet::GetRepeatedString(int number, int index) const { 486 map<int, Extension>::const_iterator iter = extensions_.find(number); 487 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; 488 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING); 489 return iter->second.repeated_string_value->Get(index); 490 } 491 492 string* ExtensionSet::MutableRepeatedString(int number, int index) { 493 map<int, Extension>::iterator iter = extensions_.find(number); 494 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; 495 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING); 496 return iter->second.repeated_string_value->Mutable(index); 497 } 498 499 string* ExtensionSet::AddString(int number, FieldType type, 500 const FieldDescriptor* descriptor) { 501 Extension* extension; 502 if (MaybeNewExtension(number, descriptor, &extension)) { 503 extension->type = type; 504 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING); 505 extension->is_repeated = true; 506 extension->is_packed = false; 507 extension->repeated_string_value = new RepeatedPtrField<string>(); 508 } else { 509 GOOGLE_DCHECK_TYPE(*extension, REPEATED, STRING); 510 } 511 return extension->repeated_string_value->Add(); 512 } 513 514 // ------------------------------------------------------------------- 515 // Messages 516 517 const MessageLite& ExtensionSet::GetMessage( 518 int number, const MessageLite& default_value) const { 519 map<int, Extension>::const_iterator iter = extensions_.find(number); 520 if (iter == extensions_.end()) { 521 // Not present. Return the default value. 522 return default_value; 523 } else { 524 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); 525 if (iter->second.is_lazy) { 526 return iter->second.lazymessage_value->GetMessage(default_value); 527 } else { 528 return *iter->second.message_value; 529 } 530 } 531 } 532 533 // Defined in extension_set_heavy.cc. 534 // const MessageLite& ExtensionSet::GetMessage(int number, 535 // const Descriptor* message_type, 536 // MessageFactory* factory) const 537 538 MessageLite* ExtensionSet::MutableMessage(int number, FieldType type, 539 const MessageLite& prototype, 540 const FieldDescriptor* descriptor) { 541 Extension* extension; 542 if (MaybeNewExtension(number, descriptor, &extension)) { 543 extension->type = type; 544 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE); 545 extension->is_repeated = false; 546 extension->is_lazy = false; 547 extension->message_value = prototype.New(); 548 extension->is_cleared = false; 549 return extension->message_value; 550 } else { 551 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE); 552 extension->is_cleared = false; 553 if (extension->is_lazy) { 554 return extension->lazymessage_value->MutableMessage(prototype); 555 } else { 556 return extension->message_value; 557 } 558 } 559 } 560 561 // Defined in extension_set_heavy.cc. 562 // MessageLite* ExtensionSet::MutableMessage(int number, FieldType type, 563 // const Descriptor* message_type, 564 // MessageFactory* factory) 565 566 void ExtensionSet::SetAllocatedMessage(int number, FieldType type, 567 const FieldDescriptor* descriptor, 568 MessageLite* message) { 569 if (message == NULL) { 570 ClearExtension(number); 571 return; 572 } 573 Extension* extension; 574 if (MaybeNewExtension(number, descriptor, &extension)) { 575 extension->type = type; 576 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE); 577 extension->is_repeated = false; 578 extension->is_lazy = false; 579 extension->message_value = message; 580 } else { 581 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE); 582 if (extension->is_lazy) { 583 extension->lazymessage_value->SetAllocatedMessage(message); 584 } else { 585 delete extension->message_value; 586 extension->message_value = message; 587 } 588 } 589 extension->is_cleared = false; 590 } 591 592 MessageLite* ExtensionSet::ReleaseMessage(int number, 593 const MessageLite& prototype) { 594 map<int, Extension>::iterator iter = extensions_.find(number); 595 if (iter == extensions_.end()) { 596 // Not present. Return NULL. 597 return NULL; 598 } else { 599 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); 600 MessageLite* ret = NULL; 601 if (iter->second.is_lazy) { 602 ret = iter->second.lazymessage_value->ReleaseMessage(prototype); 603 delete iter->second.lazymessage_value; 604 } else { 605 ret = iter->second.message_value; 606 } 607 extensions_.erase(number); 608 return ret; 609 } 610 } 611 612 // Defined in extension_set_heavy.cc. 613 // MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor, 614 // MessageFactory* factory); 615 616 const MessageLite& ExtensionSet::GetRepeatedMessage( 617 int number, int index) const { 618 map<int, Extension>::const_iterator iter = extensions_.find(number); 619 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; 620 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE); 621 return iter->second.repeated_message_value->Get(index); 622 } 623 624 MessageLite* ExtensionSet::MutableRepeatedMessage(int number, int index) { 625 map<int, Extension>::iterator iter = extensions_.find(number); 626 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; 627 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE); 628 return iter->second.repeated_message_value->Mutable(index); 629 } 630 631 MessageLite* ExtensionSet::AddMessage(int number, FieldType type, 632 const MessageLite& prototype, 633 const FieldDescriptor* descriptor) { 634 Extension* extension; 635 if (MaybeNewExtension(number, descriptor, &extension)) { 636 extension->type = type; 637 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE); 638 extension->is_repeated = true; 639 extension->repeated_message_value = 640 new RepeatedPtrField<MessageLite>(); 641 } else { 642 GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE); 643 } 644 645 // RepeatedPtrField<MessageLite> does not know how to Add() since it cannot 646 // allocate an abstract object, so we have to be tricky. 647 MessageLite* result = extension->repeated_message_value 648 ->AddFromCleared<GenericTypeHandler<MessageLite> >(); 649 if (result == NULL) { 650 result = prototype.New(); 651 extension->repeated_message_value->AddAllocated(result); 652 } 653 return result; 654 } 655 656 // Defined in extension_set_heavy.cc. 657 // MessageLite* ExtensionSet::AddMessage(int number, FieldType type, 658 // const Descriptor* message_type, 659 // MessageFactory* factory) 660 661 #undef GOOGLE_DCHECK_TYPE 662 663 void ExtensionSet::RemoveLast(int number) { 664 map<int, Extension>::iterator iter = extensions_.find(number); 665 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; 666 667 Extension* extension = &iter->second; 668 GOOGLE_DCHECK(extension->is_repeated); 669 670 switch(cpp_type(extension->type)) { 671 case WireFormatLite::CPPTYPE_INT32: 672 extension->repeated_int32_value->RemoveLast(); 673 break; 674 case WireFormatLite::CPPTYPE_INT64: 675 extension->repeated_int64_value->RemoveLast(); 676 break; 677 case WireFormatLite::CPPTYPE_UINT32: 678 extension->repeated_uint32_value->RemoveLast(); 679 break; 680 case WireFormatLite::CPPTYPE_UINT64: 681 extension->repeated_uint64_value->RemoveLast(); 682 break; 683 case WireFormatLite::CPPTYPE_FLOAT: 684 extension->repeated_float_value->RemoveLast(); 685 break; 686 case WireFormatLite::CPPTYPE_DOUBLE: 687 extension->repeated_double_value->RemoveLast(); 688 break; 689 case WireFormatLite::CPPTYPE_BOOL: 690 extension->repeated_bool_value->RemoveLast(); 691 break; 692 case WireFormatLite::CPPTYPE_ENUM: 693 extension->repeated_enum_value->RemoveLast(); 694 break; 695 case WireFormatLite::CPPTYPE_STRING: 696 extension->repeated_string_value->RemoveLast(); 697 break; 698 case WireFormatLite::CPPTYPE_MESSAGE: 699 extension->repeated_message_value->RemoveLast(); 700 break; 701 } 702 } 703 704 MessageLite* ExtensionSet::ReleaseLast(int number) { 705 map<int, Extension>::iterator iter = extensions_.find(number); 706 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; 707 708 Extension* extension = &iter->second; 709 GOOGLE_DCHECK(extension->is_repeated); 710 GOOGLE_DCHECK(cpp_type(extension->type) == WireFormatLite::CPPTYPE_MESSAGE); 711 return extension->repeated_message_value->ReleaseLast(); 712 } 713 714 void ExtensionSet::SwapElements(int number, int index1, int index2) { 715 map<int, Extension>::iterator iter = extensions_.find(number); 716 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; 717 718 Extension* extension = &iter->second; 719 GOOGLE_DCHECK(extension->is_repeated); 720 721 switch(cpp_type(extension->type)) { 722 case WireFormatLite::CPPTYPE_INT32: 723 extension->repeated_int32_value->SwapElements(index1, index2); 724 break; 725 case WireFormatLite::CPPTYPE_INT64: 726 extension->repeated_int64_value->SwapElements(index1, index2); 727 break; 728 case WireFormatLite::CPPTYPE_UINT32: 729 extension->repeated_uint32_value->SwapElements(index1, index2); 730 break; 731 case WireFormatLite::CPPTYPE_UINT64: 732 extension->repeated_uint64_value->SwapElements(index1, index2); 733 break; 734 case WireFormatLite::CPPTYPE_FLOAT: 735 extension->repeated_float_value->SwapElements(index1, index2); 736 break; 737 case WireFormatLite::CPPTYPE_DOUBLE: 738 extension->repeated_double_value->SwapElements(index1, index2); 739 break; 740 case WireFormatLite::CPPTYPE_BOOL: 741 extension->repeated_bool_value->SwapElements(index1, index2); 742 break; 743 case WireFormatLite::CPPTYPE_ENUM: 744 extension->repeated_enum_value->SwapElements(index1, index2); 745 break; 746 case WireFormatLite::CPPTYPE_STRING: 747 extension->repeated_string_value->SwapElements(index1, index2); 748 break; 749 case WireFormatLite::CPPTYPE_MESSAGE: 750 extension->repeated_message_value->SwapElements(index1, index2); 751 break; 752 } 753 } 754 755 // =================================================================== 756 757 void ExtensionSet::Clear() { 758 for (map<int, Extension>::iterator iter = extensions_.begin(); 759 iter != extensions_.end(); ++iter) { 760 iter->second.Clear(); 761 } 762 } 763 764 void ExtensionSet::MergeFrom(const ExtensionSet& other) { 765 for (map<int, Extension>::const_iterator iter = other.extensions_.begin(); 766 iter != other.extensions_.end(); ++iter) { 767 const Extension& other_extension = iter->second; 768 769 if (other_extension.is_repeated) { 770 Extension* extension; 771 bool is_new = MaybeNewExtension(iter->first, other_extension.descriptor, 772 &extension); 773 if (is_new) { 774 // Extension did not already exist in set. 775 extension->type = other_extension.type; 776 extension->is_packed = other_extension.is_packed; 777 extension->is_repeated = true; 778 } else { 779 GOOGLE_DCHECK_EQ(extension->type, other_extension.type); 780 GOOGLE_DCHECK_EQ(extension->is_packed, other_extension.is_packed); 781 GOOGLE_DCHECK(extension->is_repeated); 782 } 783 784 switch (cpp_type(other_extension.type)) { 785 #define HANDLE_TYPE(UPPERCASE, LOWERCASE, REPEATED_TYPE) \ 786 case WireFormatLite::CPPTYPE_##UPPERCASE: \ 787 if (is_new) { \ 788 extension->repeated_##LOWERCASE##_value = \ 789 new REPEATED_TYPE; \ 790 } \ 791 extension->repeated_##LOWERCASE##_value->MergeFrom( \ 792 *other_extension.repeated_##LOWERCASE##_value); \ 793 break; 794 795 HANDLE_TYPE( INT32, int32, RepeatedField < int32>); 796 HANDLE_TYPE( INT64, int64, RepeatedField < int64>); 797 HANDLE_TYPE( UINT32, uint32, RepeatedField < uint32>); 798 HANDLE_TYPE( UINT64, uint64, RepeatedField < uint64>); 799 HANDLE_TYPE( FLOAT, float, RepeatedField < float>); 800 HANDLE_TYPE( DOUBLE, double, RepeatedField < double>); 801 HANDLE_TYPE( BOOL, bool, RepeatedField < bool>); 802 HANDLE_TYPE( ENUM, enum, RepeatedField < int>); 803 HANDLE_TYPE( STRING, string, RepeatedPtrField< string>); 804 #undef HANDLE_TYPE 805 806 case WireFormatLite::CPPTYPE_MESSAGE: 807 if (is_new) { 808 extension->repeated_message_value = 809 new RepeatedPtrField<MessageLite>(); 810 } 811 // We can't call RepeatedPtrField<MessageLite>::MergeFrom() because 812 // it would attempt to allocate new objects. 813 RepeatedPtrField<MessageLite>* other_repeated_message = 814 other_extension.repeated_message_value; 815 for (int i = 0; i < other_repeated_message->size(); i++) { 816 const MessageLite& other_message = other_repeated_message->Get(i); 817 MessageLite* target = extension->repeated_message_value 818 ->AddFromCleared<GenericTypeHandler<MessageLite> >(); 819 if (target == NULL) { 820 target = other_message.New(); 821 extension->repeated_message_value->AddAllocated(target); 822 } 823 target->CheckTypeAndMergeFrom(other_message); 824 } 825 break; 826 } 827 } else { 828 if (!other_extension.is_cleared) { 829 switch (cpp_type(other_extension.type)) { 830 #define HANDLE_TYPE(UPPERCASE, LOWERCASE, CAMELCASE) \ 831 case WireFormatLite::CPPTYPE_##UPPERCASE: \ 832 Set##CAMELCASE(iter->first, other_extension.type, \ 833 other_extension.LOWERCASE##_value, \ 834 other_extension.descriptor); \ 835 break; 836 837 HANDLE_TYPE( INT32, int32, Int32); 838 HANDLE_TYPE( INT64, int64, Int64); 839 HANDLE_TYPE(UINT32, uint32, UInt32); 840 HANDLE_TYPE(UINT64, uint64, UInt64); 841 HANDLE_TYPE( FLOAT, float, Float); 842 HANDLE_TYPE(DOUBLE, double, Double); 843 HANDLE_TYPE( BOOL, bool, Bool); 844 HANDLE_TYPE( ENUM, enum, Enum); 845 #undef HANDLE_TYPE 846 case WireFormatLite::CPPTYPE_STRING: 847 SetString(iter->first, other_extension.type, 848 *other_extension.string_value, 849 other_extension.descriptor); 850 break; 851 case WireFormatLite::CPPTYPE_MESSAGE: { 852 Extension* extension; 853 bool is_new = MaybeNewExtension(iter->first, 854 other_extension.descriptor, 855 &extension); 856 if (is_new) { 857 extension->type = other_extension.type; 858 extension->is_packed = other_extension.is_packed; 859 extension->is_repeated = false; 860 if (other_extension.is_lazy) { 861 extension->is_lazy = true; 862 extension->lazymessage_value = 863 other_extension.lazymessage_value->New(); 864 extension->lazymessage_value->MergeFrom( 865 *other_extension.lazymessage_value); 866 } else { 867 extension->is_lazy = false; 868 extension->message_value = 869 other_extension.message_value->New(); 870 extension->message_value->CheckTypeAndMergeFrom( 871 *other_extension.message_value); 872 } 873 } else { 874 GOOGLE_DCHECK_EQ(extension->type, other_extension.type); 875 GOOGLE_DCHECK_EQ(extension->is_packed,other_extension.is_packed); 876 GOOGLE_DCHECK(!extension->is_repeated); 877 if (other_extension.is_lazy) { 878 if (extension->is_lazy) { 879 extension->lazymessage_value->MergeFrom( 880 *other_extension.lazymessage_value); 881 } else { 882 extension->message_value->CheckTypeAndMergeFrom( 883 other_extension.lazymessage_value->GetMessage( 884 *extension->message_value)); 885 } 886 } else { 887 if (extension->is_lazy) { 888 extension->lazymessage_value->MutableMessage( 889 *other_extension.message_value)->CheckTypeAndMergeFrom( 890 *other_extension.message_value); 891 } else { 892 extension->message_value->CheckTypeAndMergeFrom( 893 *other_extension.message_value); 894 } 895 } 896 } 897 extension->is_cleared = false; 898 break; 899 } 900 } 901 } 902 } 903 } 904 } 905 906 void ExtensionSet::Swap(ExtensionSet* x) { 907 extensions_.swap(x->extensions_); 908 } 909 910 void ExtensionSet::SwapExtension(ExtensionSet* other, 911 int number) { 912 if (this == other) return; 913 map<int, Extension>::iterator this_iter = extensions_.find(number); 914 map<int, Extension>::iterator other_iter = other->extensions_.find(number); 915 916 if (this_iter == extensions_.end() && 917 other_iter == other->extensions_.end()) { 918 return; 919 } 920 921 if (this_iter != extensions_.end() && 922 other_iter != other->extensions_.end()) { 923 std::swap(this_iter->second, other_iter->second); 924 return; 925 } 926 927 if (this_iter == extensions_.end()) { 928 extensions_.insert(make_pair(number, other_iter->second)); 929 other->extensions_.erase(number); 930 return; 931 } 932 933 if (other_iter == other->extensions_.end()) { 934 other->extensions_.insert(make_pair(number, this_iter->second)); 935 extensions_.erase(number); 936 return; 937 } 938 } 939 940 bool ExtensionSet::IsInitialized() const { 941 // Extensions are never required. However, we need to check that all 942 // embedded messages are initialized. 943 for (map<int, Extension>::const_iterator iter = extensions_.begin(); 944 iter != extensions_.end(); ++iter) { 945 const Extension& extension = iter->second; 946 if (cpp_type(extension.type) == WireFormatLite::CPPTYPE_MESSAGE) { 947 if (extension.is_repeated) { 948 for (int i = 0; i < extension.repeated_message_value->size(); i++) { 949 if (!extension.repeated_message_value->Get(i).IsInitialized()) { 950 return false; 951 } 952 } 953 } else { 954 if (!extension.is_cleared) { 955 if (extension.is_lazy) { 956 if (!extension.lazymessage_value->IsInitialized()) return false; 957 } else { 958 if (!extension.message_value->IsInitialized()) return false; 959 } 960 } 961 } 962 } 963 } 964 965 return true; 966 } 967 968 bool ExtensionSet::FindExtensionInfoFromTag( 969 uint32 tag, ExtensionFinder* extension_finder, int* field_number, 970 ExtensionInfo* extension, bool* was_packed_on_wire) { 971 *field_number = WireFormatLite::GetTagFieldNumber(tag); 972 WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag); 973 return FindExtensionInfoFromFieldNumber(wire_type, *field_number, 974 extension_finder, extension, 975 was_packed_on_wire); 976 } 977 978 bool ExtensionSet::FindExtensionInfoFromFieldNumber( 979 int wire_type, int field_number, ExtensionFinder* extension_finder, 980 ExtensionInfo* extension, bool* was_packed_on_wire) { 981 if (!extension_finder->Find(field_number, extension)) { 982 return false; 983 } 984 985 WireFormatLite::WireType expected_wire_type = 986 WireFormatLite::WireTypeForFieldType(real_type(extension->type)); 987 988 // Check if this is a packed field. 989 *was_packed_on_wire = false; 990 if (extension->is_repeated && 991 wire_type == WireFormatLite::WIRETYPE_LENGTH_DELIMITED && 992 is_packable(expected_wire_type)) { 993 *was_packed_on_wire = true; 994 return true; 995 } 996 // Otherwise the wire type must match. 997 return expected_wire_type == wire_type; 998 } 999 1000 bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, 1001 ExtensionFinder* extension_finder, 1002 FieldSkipper* field_skipper) { 1003 int number; 1004 bool was_packed_on_wire; 1005 ExtensionInfo extension; 1006 if (!FindExtensionInfoFromTag( 1007 tag, extension_finder, &number, &extension, &was_packed_on_wire)) { 1008 return field_skipper->SkipField(input, tag); 1009 } else { 1010 return ParseFieldWithExtensionInfo( 1011 number, was_packed_on_wire, extension, input, field_skipper); 1012 } 1013 } 1014 1015 bool ExtensionSet::ParseFieldWithExtensionInfo( 1016 int number, bool was_packed_on_wire, const ExtensionInfo& extension, 1017 io::CodedInputStream* input, 1018 FieldSkipper* field_skipper) { 1019 // Explicitly not read extension.is_packed, instead check whether the field 1020 // was encoded in packed form on the wire. 1021 if (was_packed_on_wire) { 1022 uint32 size; 1023 if (!input->ReadVarint32(&size)) return false; 1024 io::CodedInputStream::Limit limit = input->PushLimit(size); 1025 1026 switch (extension.type) { 1027 #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \ 1028 case WireFormatLite::TYPE_##UPPERCASE: \ 1029 while (input->BytesUntilLimit() > 0) { \ 1030 CPP_LOWERCASE value; \ 1031 if (!WireFormatLite::ReadPrimitive< \ 1032 CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>( \ 1033 input, &value)) return false; \ 1034 Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \ 1035 extension.is_packed, value, \ 1036 extension.descriptor); \ 1037 } \ 1038 break 1039 1040 HANDLE_TYPE( INT32, Int32, int32); 1041 HANDLE_TYPE( INT64, Int64, int64); 1042 HANDLE_TYPE( UINT32, UInt32, uint32); 1043 HANDLE_TYPE( UINT64, UInt64, uint64); 1044 HANDLE_TYPE( SINT32, Int32, int32); 1045 HANDLE_TYPE( SINT64, Int64, int64); 1046 HANDLE_TYPE( FIXED32, UInt32, uint32); 1047 HANDLE_TYPE( FIXED64, UInt64, uint64); 1048 HANDLE_TYPE(SFIXED32, Int32, int32); 1049 HANDLE_TYPE(SFIXED64, Int64, int64); 1050 HANDLE_TYPE( FLOAT, Float, float); 1051 HANDLE_TYPE( DOUBLE, Double, double); 1052 HANDLE_TYPE( BOOL, Bool, bool); 1053 #undef HANDLE_TYPE 1054 1055 case WireFormatLite::TYPE_ENUM: 1056 while (input->BytesUntilLimit() > 0) { 1057 int value; 1058 if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>( 1059 input, &value)) return false; 1060 if (extension.enum_validity_check.func( 1061 extension.enum_validity_check.arg, value)) { 1062 AddEnum(number, WireFormatLite::TYPE_ENUM, extension.is_packed, 1063 value, extension.descriptor); 1064 } 1065 } 1066 break; 1067 1068 case WireFormatLite::TYPE_STRING: 1069 case WireFormatLite::TYPE_BYTES: 1070 case WireFormatLite::TYPE_GROUP: 1071 case WireFormatLite::TYPE_MESSAGE: 1072 GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; 1073 break; 1074 } 1075 1076 input->PopLimit(limit); 1077 } else { 1078 switch (extension.type) { 1079 #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \ 1080 case WireFormatLite::TYPE_##UPPERCASE: { \ 1081 CPP_LOWERCASE value; \ 1082 if (!WireFormatLite::ReadPrimitive< \ 1083 CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>( \ 1084 input, &value)) return false; \ 1085 if (extension.is_repeated) { \ 1086 Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \ 1087 extension.is_packed, value, \ 1088 extension.descriptor); \ 1089 } else { \ 1090 Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value, \ 1091 extension.descriptor); \ 1092 } \ 1093 } break 1094 1095 HANDLE_TYPE( INT32, Int32, int32); 1096 HANDLE_TYPE( INT64, Int64, int64); 1097 HANDLE_TYPE( UINT32, UInt32, uint32); 1098 HANDLE_TYPE( UINT64, UInt64, uint64); 1099 HANDLE_TYPE( SINT32, Int32, int32); 1100 HANDLE_TYPE( SINT64, Int64, int64); 1101 HANDLE_TYPE( FIXED32, UInt32, uint32); 1102 HANDLE_TYPE( FIXED64, UInt64, uint64); 1103 HANDLE_TYPE(SFIXED32, Int32, int32); 1104 HANDLE_TYPE(SFIXED64, Int64, int64); 1105 HANDLE_TYPE( FLOAT, Float, float); 1106 HANDLE_TYPE( DOUBLE, Double, double); 1107 HANDLE_TYPE( BOOL, Bool, bool); 1108 #undef HANDLE_TYPE 1109 1110 case WireFormatLite::TYPE_ENUM: { 1111 int value; 1112 if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>( 1113 input, &value)) return false; 1114 1115 if (!extension.enum_validity_check.func( 1116 extension.enum_validity_check.arg, value)) { 1117 // Invalid value. Treat as unknown. 1118 field_skipper->SkipUnknownEnum(number, value); 1119 } else if (extension.is_repeated) { 1120 AddEnum(number, WireFormatLite::TYPE_ENUM, extension.is_packed, value, 1121 extension.descriptor); 1122 } else { 1123 SetEnum(number, WireFormatLite::TYPE_ENUM, value, 1124 extension.descriptor); 1125 } 1126 break; 1127 } 1128 1129 case WireFormatLite::TYPE_STRING: { 1130 string* value = extension.is_repeated ? 1131 AddString(number, WireFormatLite::TYPE_STRING, extension.descriptor) : 1132 MutableString(number, WireFormatLite::TYPE_STRING, 1133 extension.descriptor); 1134 if (!WireFormatLite::ReadString(input, value)) return false; 1135 break; 1136 } 1137 1138 case WireFormatLite::TYPE_BYTES: { 1139 string* value = extension.is_repeated ? 1140 AddString(number, WireFormatLite::TYPE_BYTES, extension.descriptor) : 1141 MutableString(number, WireFormatLite::TYPE_BYTES, 1142 extension.descriptor); 1143 if (!WireFormatLite::ReadBytes(input, value)) return false; 1144 break; 1145 } 1146 1147 case WireFormatLite::TYPE_GROUP: { 1148 MessageLite* value = extension.is_repeated ? 1149 AddMessage(number, WireFormatLite::TYPE_GROUP, 1150 *extension.message_prototype, extension.descriptor) : 1151 MutableMessage(number, WireFormatLite::TYPE_GROUP, 1152 *extension.message_prototype, extension.descriptor); 1153 if (!WireFormatLite::ReadGroup(number, input, value)) return false; 1154 break; 1155 } 1156 1157 case WireFormatLite::TYPE_MESSAGE: { 1158 MessageLite* value = extension.is_repeated ? 1159 AddMessage(number, WireFormatLite::TYPE_MESSAGE, 1160 *extension.message_prototype, extension.descriptor) : 1161 MutableMessage(number, WireFormatLite::TYPE_MESSAGE, 1162 *extension.message_prototype, extension.descriptor); 1163 if (!WireFormatLite::ReadMessage(input, value)) return false; 1164 break; 1165 } 1166 } 1167 } 1168 1169 return true; 1170 } 1171 1172 bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, 1173 const MessageLite* containing_type) { 1174 FieldSkipper skipper; 1175 GeneratedExtensionFinder finder(containing_type); 1176 return ParseField(tag, input, &finder, &skipper); 1177 } 1178 1179 bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, 1180 const MessageLite* containing_type, 1181 io::CodedOutputStream* unknown_fields) { 1182 CodedOutputStreamFieldSkipper skipper(unknown_fields); 1183 GeneratedExtensionFinder finder(containing_type); 1184 return ParseField(tag, input, &finder, &skipper); 1185 } 1186 1187 // Defined in extension_set_heavy.cc. 1188 // bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, 1189 // const MessageLite* containing_type, 1190 // UnknownFieldSet* unknown_fields) 1191 1192 // Defined in extension_set_heavy.cc. 1193 // bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, 1194 // const MessageLite* containing_type, 1195 // UnknownFieldSet* unknown_fields); 1196 1197 void ExtensionSet::SerializeWithCachedSizes( 1198 int start_field_number, int end_field_number, 1199 io::CodedOutputStream* output) const { 1200 map<int, Extension>::const_iterator iter; 1201 for (iter = extensions_.lower_bound(start_field_number); 1202 iter != extensions_.end() && iter->first < end_field_number; 1203 ++iter) { 1204 iter->second.SerializeFieldWithCachedSizes(iter->first, output); 1205 } 1206 } 1207 1208 int ExtensionSet::ByteSize() const { 1209 int total_size = 0; 1210 1211 for (map<int, Extension>::const_iterator iter = extensions_.begin(); 1212 iter != extensions_.end(); ++iter) { 1213 total_size += iter->second.ByteSize(iter->first); 1214 } 1215 1216 return total_size; 1217 } 1218 1219 // Defined in extension_set_heavy.cc. 1220 // int ExtensionSet::SpaceUsedExcludingSelf() const 1221 1222 bool ExtensionSet::MaybeNewExtension(int number, 1223 const FieldDescriptor* descriptor, 1224 Extension** result) { 1225 pair<map<int, Extension>::iterator, bool> insert_result = 1226 extensions_.insert(make_pair(number, Extension())); 1227 *result = &insert_result.first->second; 1228 (*result)->descriptor = descriptor; 1229 return insert_result.second; 1230 } 1231 1232 // =================================================================== 1233 // Methods of ExtensionSet::Extension 1234 1235 void ExtensionSet::Extension::Clear() { 1236 if (is_repeated) { 1237 switch (cpp_type(type)) { 1238 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 1239 case WireFormatLite::CPPTYPE_##UPPERCASE: \ 1240 repeated_##LOWERCASE##_value->Clear(); \ 1241 break 1242 1243 HANDLE_TYPE( INT32, int32); 1244 HANDLE_TYPE( INT64, int64); 1245 HANDLE_TYPE( UINT32, uint32); 1246 HANDLE_TYPE( UINT64, uint64); 1247 HANDLE_TYPE( FLOAT, float); 1248 HANDLE_TYPE( DOUBLE, double); 1249 HANDLE_TYPE( BOOL, bool); 1250 HANDLE_TYPE( ENUM, enum); 1251 HANDLE_TYPE( STRING, string); 1252 HANDLE_TYPE(MESSAGE, message); 1253 #undef HANDLE_TYPE 1254 } 1255 } else { 1256 if (!is_cleared) { 1257 switch (cpp_type(type)) { 1258 case WireFormatLite::CPPTYPE_STRING: 1259 string_value->clear(); 1260 break; 1261 case WireFormatLite::CPPTYPE_MESSAGE: 1262 if (is_lazy) { 1263 lazymessage_value->Clear(); 1264 } else { 1265 message_value->Clear(); 1266 } 1267 break; 1268 default: 1269 // No need to do anything. Get*() will return the default value 1270 // as long as is_cleared is true and Set*() will overwrite the 1271 // previous value. 1272 break; 1273 } 1274 1275 is_cleared = true; 1276 } 1277 } 1278 } 1279 1280 void ExtensionSet::Extension::SerializeFieldWithCachedSizes( 1281 int number, 1282 io::CodedOutputStream* output) const { 1283 if (is_repeated) { 1284 if (is_packed) { 1285 if (cached_size == 0) return; 1286 1287 WireFormatLite::WriteTag(number, 1288 WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); 1289 output->WriteVarint32(cached_size); 1290 1291 switch (real_type(type)) { 1292 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1293 case WireFormatLite::TYPE_##UPPERCASE: \ 1294 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ 1295 WireFormatLite::Write##CAMELCASE##NoTag( \ 1296 repeated_##LOWERCASE##_value->Get(i), output); \ 1297 } \ 1298 break 1299 1300 HANDLE_TYPE( INT32, Int32, int32); 1301 HANDLE_TYPE( INT64, Int64, int64); 1302 HANDLE_TYPE( UINT32, UInt32, uint32); 1303 HANDLE_TYPE( UINT64, UInt64, uint64); 1304 HANDLE_TYPE( SINT32, SInt32, int32); 1305 HANDLE_TYPE( SINT64, SInt64, int64); 1306 HANDLE_TYPE( FIXED32, Fixed32, uint32); 1307 HANDLE_TYPE( FIXED64, Fixed64, uint64); 1308 HANDLE_TYPE(SFIXED32, SFixed32, int32); 1309 HANDLE_TYPE(SFIXED64, SFixed64, int64); 1310 HANDLE_TYPE( FLOAT, Float, float); 1311 HANDLE_TYPE( DOUBLE, Double, double); 1312 HANDLE_TYPE( BOOL, Bool, bool); 1313 HANDLE_TYPE( ENUM, Enum, enum); 1314 #undef HANDLE_TYPE 1315 1316 case WireFormatLite::TYPE_STRING: 1317 case WireFormatLite::TYPE_BYTES: 1318 case WireFormatLite::TYPE_GROUP: 1319 case WireFormatLite::TYPE_MESSAGE: 1320 GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; 1321 break; 1322 } 1323 } else { 1324 switch (real_type(type)) { 1325 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1326 case WireFormatLite::TYPE_##UPPERCASE: \ 1327 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ 1328 WireFormatLite::Write##CAMELCASE(number, \ 1329 repeated_##LOWERCASE##_value->Get(i), output); \ 1330 } \ 1331 break 1332 1333 HANDLE_TYPE( INT32, Int32, int32); 1334 HANDLE_TYPE( INT64, Int64, int64); 1335 HANDLE_TYPE( UINT32, UInt32, uint32); 1336 HANDLE_TYPE( UINT64, UInt64, uint64); 1337 HANDLE_TYPE( SINT32, SInt32, int32); 1338 HANDLE_TYPE( SINT64, SInt64, int64); 1339 HANDLE_TYPE( FIXED32, Fixed32, uint32); 1340 HANDLE_TYPE( FIXED64, Fixed64, uint64); 1341 HANDLE_TYPE(SFIXED32, SFixed32, int32); 1342 HANDLE_TYPE(SFIXED64, SFixed64, int64); 1343 HANDLE_TYPE( FLOAT, Float, float); 1344 HANDLE_TYPE( DOUBLE, Double, double); 1345 HANDLE_TYPE( BOOL, Bool, bool); 1346 HANDLE_TYPE( STRING, String, string); 1347 HANDLE_TYPE( BYTES, Bytes, string); 1348 HANDLE_TYPE( ENUM, Enum, enum); 1349 HANDLE_TYPE( GROUP, Group, message); 1350 HANDLE_TYPE( MESSAGE, Message, message); 1351 #undef HANDLE_TYPE 1352 } 1353 } 1354 } else if (!is_cleared) { 1355 switch (real_type(type)) { 1356 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE) \ 1357 case WireFormatLite::TYPE_##UPPERCASE: \ 1358 WireFormatLite::Write##CAMELCASE(number, VALUE, output); \ 1359 break 1360 1361 HANDLE_TYPE( INT32, Int32, int32_value); 1362 HANDLE_TYPE( INT64, Int64, int64_value); 1363 HANDLE_TYPE( UINT32, UInt32, uint32_value); 1364 HANDLE_TYPE( UINT64, UInt64, uint64_value); 1365 HANDLE_TYPE( SINT32, SInt32, int32_value); 1366 HANDLE_TYPE( SINT64, SInt64, int64_value); 1367 HANDLE_TYPE( FIXED32, Fixed32, uint32_value); 1368 HANDLE_TYPE( FIXED64, Fixed64, uint64_value); 1369 HANDLE_TYPE(SFIXED32, SFixed32, int32_value); 1370 HANDLE_TYPE(SFIXED64, SFixed64, int64_value); 1371 HANDLE_TYPE( FLOAT, Float, float_value); 1372 HANDLE_TYPE( DOUBLE, Double, double_value); 1373 HANDLE_TYPE( BOOL, Bool, bool_value); 1374 HANDLE_TYPE( STRING, String, *string_value); 1375 HANDLE_TYPE( BYTES, Bytes, *string_value); 1376 HANDLE_TYPE( ENUM, Enum, enum_value); 1377 HANDLE_TYPE( GROUP, Group, *message_value); 1378 #undef HANDLE_TYPE 1379 case WireFormatLite::TYPE_MESSAGE: 1380 if (is_lazy) { 1381 lazymessage_value->WriteMessage(number, output); 1382 } else { 1383 WireFormatLite::WriteMessage(number, *message_value, output); 1384 } 1385 break; 1386 } 1387 } 1388 } 1389 1390 int ExtensionSet::Extension::ByteSize(int number) const { 1391 int result = 0; 1392 1393 if (is_repeated) { 1394 if (is_packed) { 1395 switch (real_type(type)) { 1396 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1397 case WireFormatLite::TYPE_##UPPERCASE: \ 1398 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ 1399 result += WireFormatLite::CAMELCASE##Size( \ 1400 repeated_##LOWERCASE##_value->Get(i)); \ 1401 } \ 1402 break 1403 1404 HANDLE_TYPE( INT32, Int32, int32); 1405 HANDLE_TYPE( INT64, Int64, int64); 1406 HANDLE_TYPE( UINT32, UInt32, uint32); 1407 HANDLE_TYPE( UINT64, UInt64, uint64); 1408 HANDLE_TYPE( SINT32, SInt32, int32); 1409 HANDLE_TYPE( SINT64, SInt64, int64); 1410 HANDLE_TYPE( ENUM, Enum, enum); 1411 #undef HANDLE_TYPE 1412 1413 // Stuff with fixed size. 1414 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1415 case WireFormatLite::TYPE_##UPPERCASE: \ 1416 result += WireFormatLite::k##CAMELCASE##Size * \ 1417 repeated_##LOWERCASE##_value->size(); \ 1418 break 1419 HANDLE_TYPE( FIXED32, Fixed32, uint32); 1420 HANDLE_TYPE( FIXED64, Fixed64, uint64); 1421 HANDLE_TYPE(SFIXED32, SFixed32, int32); 1422 HANDLE_TYPE(SFIXED64, SFixed64, int64); 1423 HANDLE_TYPE( FLOAT, Float, float); 1424 HANDLE_TYPE( DOUBLE, Double, double); 1425 HANDLE_TYPE( BOOL, Bool, bool); 1426 #undef HANDLE_TYPE 1427 1428 case WireFormatLite::TYPE_STRING: 1429 case WireFormatLite::TYPE_BYTES: 1430 case WireFormatLite::TYPE_GROUP: 1431 case WireFormatLite::TYPE_MESSAGE: 1432 GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; 1433 break; 1434 } 1435 1436 cached_size = result; 1437 if (result > 0) { 1438 result += io::CodedOutputStream::VarintSize32(result); 1439 result += io::CodedOutputStream::VarintSize32( 1440 WireFormatLite::MakeTag(number, 1441 WireFormatLite::WIRETYPE_LENGTH_DELIMITED)); 1442 } 1443 } else { 1444 int tag_size = WireFormatLite::TagSize(number, real_type(type)); 1445 1446 switch (real_type(type)) { 1447 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1448 case WireFormatLite::TYPE_##UPPERCASE: \ 1449 result += tag_size * repeated_##LOWERCASE##_value->size(); \ 1450 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ 1451 result += WireFormatLite::CAMELCASE##Size( \ 1452 repeated_##LOWERCASE##_value->Get(i)); \ 1453 } \ 1454 break 1455 1456 HANDLE_TYPE( INT32, Int32, int32); 1457 HANDLE_TYPE( INT64, Int64, int64); 1458 HANDLE_TYPE( UINT32, UInt32, uint32); 1459 HANDLE_TYPE( UINT64, UInt64, uint64); 1460 HANDLE_TYPE( SINT32, SInt32, int32); 1461 HANDLE_TYPE( SINT64, SInt64, int64); 1462 HANDLE_TYPE( STRING, String, string); 1463 HANDLE_TYPE( BYTES, Bytes, string); 1464 HANDLE_TYPE( ENUM, Enum, enum); 1465 HANDLE_TYPE( GROUP, Group, message); 1466 HANDLE_TYPE( MESSAGE, Message, message); 1467 #undef HANDLE_TYPE 1468 1469 // Stuff with fixed size. 1470 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1471 case WireFormatLite::TYPE_##UPPERCASE: \ 1472 result += (tag_size + WireFormatLite::k##CAMELCASE##Size) * \ 1473 repeated_##LOWERCASE##_value->size(); \ 1474 break 1475 HANDLE_TYPE( FIXED32, Fixed32, uint32); 1476 HANDLE_TYPE( FIXED64, Fixed64, uint64); 1477 HANDLE_TYPE(SFIXED32, SFixed32, int32); 1478 HANDLE_TYPE(SFIXED64, SFixed64, int64); 1479 HANDLE_TYPE( FLOAT, Float, float); 1480 HANDLE_TYPE( DOUBLE, Double, double); 1481 HANDLE_TYPE( BOOL, Bool, bool); 1482 #undef HANDLE_TYPE 1483 } 1484 } 1485 } else if (!is_cleared) { 1486 result += WireFormatLite::TagSize(number, real_type(type)); 1487 switch (real_type(type)) { 1488 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1489 case WireFormatLite::TYPE_##UPPERCASE: \ 1490 result += WireFormatLite::CAMELCASE##Size(LOWERCASE); \ 1491 break 1492 1493 HANDLE_TYPE( INT32, Int32, int32_value); 1494 HANDLE_TYPE( INT64, Int64, int64_value); 1495 HANDLE_TYPE( UINT32, UInt32, uint32_value); 1496 HANDLE_TYPE( UINT64, UInt64, uint64_value); 1497 HANDLE_TYPE( SINT32, SInt32, int32_value); 1498 HANDLE_TYPE( SINT64, SInt64, int64_value); 1499 HANDLE_TYPE( STRING, String, *string_value); 1500 HANDLE_TYPE( BYTES, Bytes, *string_value); 1501 HANDLE_TYPE( ENUM, Enum, enum_value); 1502 HANDLE_TYPE( GROUP, Group, *message_value); 1503 #undef HANDLE_TYPE 1504 case WireFormatLite::TYPE_MESSAGE: { 1505 if (is_lazy) { 1506 int size = lazymessage_value->ByteSize(); 1507 result += io::CodedOutputStream::VarintSize32(size) + size; 1508 } else { 1509 result += WireFormatLite::MessageSize(*message_value); 1510 } 1511 break; 1512 } 1513 1514 // Stuff with fixed size. 1515 #define HANDLE_TYPE(UPPERCASE, CAMELCASE) \ 1516 case WireFormatLite::TYPE_##UPPERCASE: \ 1517 result += WireFormatLite::k##CAMELCASE##Size; \ 1518 break 1519 HANDLE_TYPE( FIXED32, Fixed32); 1520 HANDLE_TYPE( FIXED64, Fixed64); 1521 HANDLE_TYPE(SFIXED32, SFixed32); 1522 HANDLE_TYPE(SFIXED64, SFixed64); 1523 HANDLE_TYPE( FLOAT, Float); 1524 HANDLE_TYPE( DOUBLE, Double); 1525 HANDLE_TYPE( BOOL, Bool); 1526 #undef HANDLE_TYPE 1527 } 1528 } 1529 1530 return result; 1531 } 1532 1533 int ExtensionSet::Extension::GetSize() const { 1534 GOOGLE_DCHECK(is_repeated); 1535 switch (cpp_type(type)) { 1536 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 1537 case WireFormatLite::CPPTYPE_##UPPERCASE: \ 1538 return repeated_##LOWERCASE##_value->size() 1539 1540 HANDLE_TYPE( INT32, int32); 1541 HANDLE_TYPE( INT64, int64); 1542 HANDLE_TYPE( UINT32, uint32); 1543 HANDLE_TYPE( UINT64, uint64); 1544 HANDLE_TYPE( FLOAT, float); 1545 HANDLE_TYPE( DOUBLE, double); 1546 HANDLE_TYPE( BOOL, bool); 1547 HANDLE_TYPE( ENUM, enum); 1548 HANDLE_TYPE( STRING, string); 1549 HANDLE_TYPE(MESSAGE, message); 1550 #undef HANDLE_TYPE 1551 } 1552 1553 GOOGLE_LOG(FATAL) << "Can't get here."; 1554 return 0; 1555 } 1556 1557 void ExtensionSet::Extension::Free() { 1558 if (is_repeated) { 1559 switch (cpp_type(type)) { 1560 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 1561 case WireFormatLite::CPPTYPE_##UPPERCASE: \ 1562 delete repeated_##LOWERCASE##_value; \ 1563 break 1564 1565 HANDLE_TYPE( INT32, int32); 1566 HANDLE_TYPE( INT64, int64); 1567 HANDLE_TYPE( UINT32, uint32); 1568 HANDLE_TYPE( UINT64, uint64); 1569 HANDLE_TYPE( FLOAT, float); 1570 HANDLE_TYPE( DOUBLE, double); 1571 HANDLE_TYPE( BOOL, bool); 1572 HANDLE_TYPE( ENUM, enum); 1573 HANDLE_TYPE( STRING, string); 1574 HANDLE_TYPE(MESSAGE, message); 1575 #undef HANDLE_TYPE 1576 } 1577 } else { 1578 switch (cpp_type(type)) { 1579 case WireFormatLite::CPPTYPE_STRING: 1580 delete string_value; 1581 break; 1582 case WireFormatLite::CPPTYPE_MESSAGE: 1583 if (is_lazy) { 1584 delete lazymessage_value; 1585 } else { 1586 delete message_value; 1587 } 1588 break; 1589 default: 1590 break; 1591 } 1592 } 1593 } 1594 1595 // Defined in extension_set_heavy.cc. 1596 // int ExtensionSet::Extension::SpaceUsedExcludingSelf() const 1597 1598 // ================================================================== 1599 // Default repeated field instances for iterator-compatible accessors 1600 1601 const RepeatedStringTypeTraits::RepeatedFieldType* 1602 RepeatedStringTypeTraits::default_repeated_field_ = NULL; 1603 1604 const RepeatedMessageGenericTypeTraits::RepeatedFieldType* 1605 RepeatedMessageGenericTypeTraits::default_repeated_field_ = NULL; 1606 1607 #define PROTOBUF_DEFINE_DEFAULT_REPEATED(TYPE) \ 1608 const RepeatedField<TYPE>* \ 1609 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_##TYPE##_ = NULL; 1610 1611 PROTOBUF_DEFINE_DEFAULT_REPEATED(int32) 1612 PROTOBUF_DEFINE_DEFAULT_REPEATED(int64) 1613 PROTOBUF_DEFINE_DEFAULT_REPEATED(uint32) 1614 PROTOBUF_DEFINE_DEFAULT_REPEATED(uint64) 1615 PROTOBUF_DEFINE_DEFAULT_REPEATED(double) 1616 PROTOBUF_DEFINE_DEFAULT_REPEATED(float) 1617 PROTOBUF_DEFINE_DEFAULT_REPEATED(bool) 1618 1619 #undef PROTOBUF_DEFINE_DEFAULT_REPEATED 1620 1621 struct StaticDefaultRepeatedFieldsInitializer { 1622 StaticDefaultRepeatedFieldsInitializer() { 1623 InitializeDefaultRepeatedFields(); 1624 OnShutdown(&DestroyDefaultRepeatedFields); 1625 } 1626 } static_repeated_fields_initializer; 1627 1628 void InitializeDefaultRepeatedFields() { 1629 RepeatedStringTypeTraits::default_repeated_field_ = 1630 new RepeatedStringTypeTraits::RepeatedFieldType; 1631 RepeatedMessageGenericTypeTraits::default_repeated_field_ = 1632 new RepeatedMessageGenericTypeTraits::RepeatedFieldType; 1633 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int32_ = 1634 new RepeatedField<int32>; 1635 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int64_ = 1636 new RepeatedField<int64>; 1637 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint32_ = 1638 new RepeatedField<uint32>; 1639 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint64_ = 1640 new RepeatedField<uint64>; 1641 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_double_ = 1642 new RepeatedField<double>; 1643 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_float_ = 1644 new RepeatedField<float>; 1645 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_ = 1646 new RepeatedField<bool>; 1647 } 1648 1649 void DestroyDefaultRepeatedFields() { 1650 delete RepeatedStringTypeTraits::default_repeated_field_; 1651 delete RepeatedMessageGenericTypeTraits::default_repeated_field_; 1652 delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int32_; 1653 delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int64_; 1654 delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint32_; 1655 delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint64_; 1656 delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_double_; 1657 delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_float_; 1658 delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_; 1659 } 1660 1661 } // namespace internal 1662 } // namespace protobuf 1663 } // namespace google 1664