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 <algorithm> 36 #include <set> 37 38 #include <google/protobuf/stubs/logging.h> 39 #include <google/protobuf/stubs/common.h> 40 #include <google/protobuf/descriptor.pb.h> 41 #include <google/protobuf/descriptor.h> 42 #include <google/protobuf/extension_set.h> 43 #include <google/protobuf/generated_message_reflection.h> 44 #include <google/protobuf/generated_message_util.h> 45 #include <google/protobuf/map_field.h> 46 #include <google/protobuf/repeated_field.h> 47 48 49 #define GOOGLE_PROTOBUF_HAS_ONEOF 50 51 namespace google { 52 namespace protobuf { 53 namespace internal { 54 55 namespace { 56 bool IsMapFieldInApi(const FieldDescriptor* field) { 57 return field->is_map(); 58 } 59 } // anonymous namespace 60 61 bool ParseNamedEnum(const EnumDescriptor* descriptor, 62 const string& name, 63 int* value) { 64 const EnumValueDescriptor* d = descriptor->FindValueByName(name); 65 if (d == NULL) return false; 66 *value = d->number(); 67 return true; 68 } 69 70 const string& NameOfEnum(const EnumDescriptor* descriptor, int value) { 71 const EnumValueDescriptor* d = descriptor->FindValueByNumber(value); 72 return (d == NULL ? GetEmptyString() : d->name()); 73 } 74 75 namespace { 76 inline bool SupportsArenas(const Descriptor* descriptor) { 77 return descriptor->file()->options().cc_enable_arenas(); 78 } 79 } // anonymous namespace 80 81 // =================================================================== 82 // Helpers for reporting usage errors (e.g. trying to use GetInt32() on 83 // a string field). 84 85 namespace { 86 87 void ReportReflectionUsageError( 88 const Descriptor* descriptor, const FieldDescriptor* field, 89 const char* method, const char* description) { 90 GOOGLE_LOG(FATAL) 91 << "Protocol Buffer reflection usage error:\n" 92 " Method : google::protobuf::Reflection::" << method << "\n" 93 " Message type: " << descriptor->full_name() << "\n" 94 " Field : " << field->full_name() << "\n" 95 " Problem : " << description; 96 } 97 98 const char* cpptype_names_[FieldDescriptor::MAX_CPPTYPE + 1] = { 99 "INVALID_CPPTYPE", 100 "CPPTYPE_INT32", 101 "CPPTYPE_INT64", 102 "CPPTYPE_UINT32", 103 "CPPTYPE_UINT64", 104 "CPPTYPE_DOUBLE", 105 "CPPTYPE_FLOAT", 106 "CPPTYPE_BOOL", 107 "CPPTYPE_ENUM", 108 "CPPTYPE_STRING", 109 "CPPTYPE_MESSAGE" 110 }; 111 112 static void ReportReflectionUsageTypeError( 113 const Descriptor* descriptor, const FieldDescriptor* field, 114 const char* method, 115 FieldDescriptor::CppType expected_type) { 116 GOOGLE_LOG(FATAL) 117 << "Protocol Buffer reflection usage error:\n" 118 " Method : google::protobuf::Reflection::" << method << "\n" 119 " Message type: " << descriptor->full_name() << "\n" 120 " Field : " << field->full_name() << "\n" 121 " Problem : Field is not the right type for this message:\n" 122 " Expected : " << cpptype_names_[expected_type] << "\n" 123 " Field type: " << cpptype_names_[field->cpp_type()]; 124 } 125 126 static void ReportReflectionUsageEnumTypeError( 127 const Descriptor* descriptor, const FieldDescriptor* field, 128 const char* method, const EnumValueDescriptor* value) { 129 GOOGLE_LOG(FATAL) 130 << "Protocol Buffer reflection usage error:\n" 131 " Method : google::protobuf::Reflection::" << method << "\n" 132 " Message type: " << descriptor->full_name() << "\n" 133 " Field : " << field->full_name() << "\n" 134 " Problem : Enum value did not match field type:\n" 135 " Expected : " << field->enum_type()->full_name() << "\n" 136 " Actual : " << value->full_name(); 137 } 138 139 #define USAGE_CHECK(CONDITION, METHOD, ERROR_DESCRIPTION) \ 140 if (!(CONDITION)) \ 141 ReportReflectionUsageError(descriptor_, field, #METHOD, ERROR_DESCRIPTION) 142 #define USAGE_CHECK_EQ(A, B, METHOD, ERROR_DESCRIPTION) \ 143 USAGE_CHECK((A) == (B), METHOD, ERROR_DESCRIPTION) 144 #define USAGE_CHECK_NE(A, B, METHOD, ERROR_DESCRIPTION) \ 145 USAGE_CHECK((A) != (B), METHOD, ERROR_DESCRIPTION) 146 147 #define USAGE_CHECK_TYPE(METHOD, CPPTYPE) \ 148 if (field->cpp_type() != FieldDescriptor::CPPTYPE_##CPPTYPE) \ 149 ReportReflectionUsageTypeError(descriptor_, field, #METHOD, \ 150 FieldDescriptor::CPPTYPE_##CPPTYPE) 151 152 #define USAGE_CHECK_ENUM_VALUE(METHOD) \ 153 if (value->type() != field->enum_type()) \ 154 ReportReflectionUsageEnumTypeError(descriptor_, field, #METHOD, value) 155 156 #define USAGE_CHECK_MESSAGE_TYPE(METHOD) \ 157 USAGE_CHECK_EQ(field->containing_type(), descriptor_, \ 158 METHOD, "Field does not match message type."); 159 #define USAGE_CHECK_SINGULAR(METHOD) \ 160 USAGE_CHECK_NE(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \ 161 "Field is repeated; the method requires a singular field.") 162 #define USAGE_CHECK_REPEATED(METHOD) \ 163 USAGE_CHECK_EQ(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \ 164 "Field is singular; the method requires a repeated field.") 165 166 #define USAGE_CHECK_ALL(METHOD, LABEL, CPPTYPE) \ 167 USAGE_CHECK_MESSAGE_TYPE(METHOD); \ 168 USAGE_CHECK_##LABEL(METHOD); \ 169 USAGE_CHECK_TYPE(METHOD, CPPTYPE) 170 171 } // namespace 172 173 // =================================================================== 174 175 GeneratedMessageReflection::GeneratedMessageReflection( 176 const Descriptor* descriptor, 177 const Message* default_instance, 178 const int offsets[], 179 int has_bits_offset, 180 int unknown_fields_offset, 181 int extensions_offset, 182 const DescriptorPool* descriptor_pool, 183 MessageFactory* factory, 184 int object_size, 185 int arena_offset, 186 int is_default_instance_offset) 187 : descriptor_ (descriptor), 188 default_instance_ (default_instance), 189 offsets_ (offsets), 190 has_bits_offset_ (has_bits_offset), 191 unknown_fields_offset_(unknown_fields_offset), 192 extensions_offset_(extensions_offset), 193 arena_offset_ (arena_offset), 194 is_default_instance_offset_(is_default_instance_offset), 195 object_size_ (object_size), 196 descriptor_pool_ ((descriptor_pool == NULL) ? 197 DescriptorPool::generated_pool() : 198 descriptor_pool), 199 message_factory_ (factory) { 200 } 201 202 GeneratedMessageReflection::GeneratedMessageReflection( 203 const Descriptor* descriptor, 204 const Message* default_instance, 205 const int offsets[], 206 int has_bits_offset, 207 int unknown_fields_offset, 208 int extensions_offset, 209 const void* default_oneof_instance, 210 int oneof_case_offset, 211 const DescriptorPool* descriptor_pool, 212 MessageFactory* factory, 213 int object_size, 214 int arena_offset, 215 int is_default_instance_offset) 216 : descriptor_ (descriptor), 217 default_instance_ (default_instance), 218 default_oneof_instance_ (default_oneof_instance), 219 offsets_ (offsets), 220 has_bits_offset_ (has_bits_offset), 221 oneof_case_offset_(oneof_case_offset), 222 unknown_fields_offset_(unknown_fields_offset), 223 extensions_offset_(extensions_offset), 224 arena_offset_ (arena_offset), 225 is_default_instance_offset_(is_default_instance_offset), 226 object_size_ (object_size), 227 descriptor_pool_ ((descriptor_pool == NULL) ? 228 DescriptorPool::generated_pool() : 229 descriptor_pool), 230 message_factory_ (factory) { 231 } 232 233 GeneratedMessageReflection::~GeneratedMessageReflection() {} 234 235 namespace { 236 UnknownFieldSet* empty_unknown_field_set_ = NULL; 237 GOOGLE_PROTOBUF_DECLARE_ONCE(empty_unknown_field_set_once_); 238 239 void DeleteEmptyUnknownFieldSet() { 240 delete empty_unknown_field_set_; 241 empty_unknown_field_set_ = NULL; 242 } 243 244 void InitEmptyUnknownFieldSet() { 245 empty_unknown_field_set_ = new UnknownFieldSet; 246 internal::OnShutdown(&DeleteEmptyUnknownFieldSet); 247 } 248 249 const UnknownFieldSet& GetEmptyUnknownFieldSet() { 250 ::google::protobuf::GoogleOnceInit(&empty_unknown_field_set_once_, &InitEmptyUnknownFieldSet); 251 return *empty_unknown_field_set_; 252 } 253 } // namespace 254 255 const UnknownFieldSet& GeneratedMessageReflection::GetUnknownFields( 256 const Message& message) const { 257 if (descriptor_->file()->syntax() == FileDescriptor::SYNTAX_PROTO3) { 258 return GetEmptyUnknownFieldSet(); 259 } 260 if (unknown_fields_offset_ == kUnknownFieldSetInMetadata) { 261 return GetInternalMetadataWithArena(message).unknown_fields(); 262 } 263 const void* ptr = reinterpret_cast<const uint8*>(&message) + 264 unknown_fields_offset_; 265 return *reinterpret_cast<const UnknownFieldSet*>(ptr); 266 } 267 268 UnknownFieldSet* GeneratedMessageReflection::MutableUnknownFields( 269 Message* message) const { 270 if (unknown_fields_offset_ == kUnknownFieldSetInMetadata) { 271 return MutableInternalMetadataWithArena(message)-> 272 mutable_unknown_fields(); 273 } 274 void* ptr = reinterpret_cast<uint8*>(message) + unknown_fields_offset_; 275 return reinterpret_cast<UnknownFieldSet*>(ptr); 276 } 277 278 int GeneratedMessageReflection::SpaceUsed(const Message& message) const { 279 // object_size_ already includes the in-memory representation of each field 280 // in the message, so we only need to account for additional memory used by 281 // the fields. 282 int total_size = object_size_; 283 284 total_size += GetUnknownFields(message).SpaceUsedExcludingSelf(); 285 286 if (extensions_offset_ != -1) { 287 total_size += GetExtensionSet(message).SpaceUsedExcludingSelf(); 288 } 289 290 for (int i = 0; i < descriptor_->field_count(); i++) { 291 const FieldDescriptor* field = descriptor_->field(i); 292 293 if (field->is_repeated()) { 294 switch (field->cpp_type()) { 295 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 296 case FieldDescriptor::CPPTYPE_##UPPERCASE : \ 297 total_size += GetRaw<RepeatedField<LOWERCASE> >(message, field) \ 298 .SpaceUsedExcludingSelf(); \ 299 break 300 301 HANDLE_TYPE( INT32, int32); 302 HANDLE_TYPE( INT64, int64); 303 HANDLE_TYPE(UINT32, uint32); 304 HANDLE_TYPE(UINT64, uint64); 305 HANDLE_TYPE(DOUBLE, double); 306 HANDLE_TYPE( FLOAT, float); 307 HANDLE_TYPE( BOOL, bool); 308 HANDLE_TYPE( ENUM, int); 309 #undef HANDLE_TYPE 310 311 case FieldDescriptor::CPPTYPE_STRING: 312 switch (field->options().ctype()) { 313 default: // TODO(kenton): Support other string reps. 314 case FieldOptions::STRING: 315 total_size += GetRaw<RepeatedPtrField<string> >(message, field) 316 .SpaceUsedExcludingSelf(); 317 break; 318 } 319 break; 320 321 case FieldDescriptor::CPPTYPE_MESSAGE: 322 if (IsMapFieldInApi(field)) { 323 total_size += 324 GetRaw<MapFieldBase>(message, field).SpaceUsedExcludingSelf(); 325 } else { 326 // We don't know which subclass of RepeatedPtrFieldBase the type is, 327 // so we use RepeatedPtrFieldBase directly. 328 total_size += 329 GetRaw<RepeatedPtrFieldBase>(message, field) 330 .SpaceUsedExcludingSelf<GenericTypeHandler<Message> >(); 331 } 332 333 break; 334 } 335 } else { 336 if (field->containing_oneof() && !HasOneofField(message, field)) { 337 continue; 338 } 339 switch (field->cpp_type()) { 340 case FieldDescriptor::CPPTYPE_INT32 : 341 case FieldDescriptor::CPPTYPE_INT64 : 342 case FieldDescriptor::CPPTYPE_UINT32: 343 case FieldDescriptor::CPPTYPE_UINT64: 344 case FieldDescriptor::CPPTYPE_DOUBLE: 345 case FieldDescriptor::CPPTYPE_FLOAT : 346 case FieldDescriptor::CPPTYPE_BOOL : 347 case FieldDescriptor::CPPTYPE_ENUM : 348 // Field is inline, so we've already counted it. 349 break; 350 351 case FieldDescriptor::CPPTYPE_STRING: { 352 switch (field->options().ctype()) { 353 default: // TODO(kenton): Support other string reps. 354 case FieldOptions::STRING: { 355 // Initially, the string points to the default value stored in 356 // the prototype. Only count the string if it has been changed 357 // from the default value. 358 const string* default_ptr = 359 &DefaultRaw<ArenaStringPtr>(field).Get(NULL); 360 const string* ptr = 361 &GetField<ArenaStringPtr>(message, field).Get(default_ptr); 362 363 if (ptr != default_ptr) { 364 // string fields are represented by just a pointer, so also 365 // include sizeof(string) as well. 366 total_size += sizeof(*ptr) + StringSpaceUsedExcludingSelf(*ptr); 367 } 368 break; 369 } 370 } 371 break; 372 } 373 374 case FieldDescriptor::CPPTYPE_MESSAGE: 375 if (&message == default_instance_) { 376 // For singular fields, the prototype just stores a pointer to the 377 // external type's prototype, so there is no extra memory usage. 378 } else { 379 const Message* sub_message = GetRaw<const Message*>(message, field); 380 if (sub_message != NULL) { 381 total_size += sub_message->SpaceUsed(); 382 } 383 } 384 break; 385 } 386 } 387 } 388 389 return total_size; 390 } 391 392 void GeneratedMessageReflection::SwapField( 393 Message* message1, 394 Message* message2, 395 const FieldDescriptor* field) const { 396 if (field->is_repeated()) { 397 switch (field->cpp_type()) { 398 #define SWAP_ARRAYS(CPPTYPE, TYPE) \ 399 case FieldDescriptor::CPPTYPE_##CPPTYPE: \ 400 MutableRaw<RepeatedField<TYPE> >(message1, field)->Swap( \ 401 MutableRaw<RepeatedField<TYPE> >(message2, field)); \ 402 break; 403 404 SWAP_ARRAYS(INT32 , int32 ); 405 SWAP_ARRAYS(INT64 , int64 ); 406 SWAP_ARRAYS(UINT32, uint32); 407 SWAP_ARRAYS(UINT64, uint64); 408 SWAP_ARRAYS(FLOAT , float ); 409 SWAP_ARRAYS(DOUBLE, double); 410 SWAP_ARRAYS(BOOL , bool ); 411 SWAP_ARRAYS(ENUM , int ); 412 #undef SWAP_ARRAYS 413 414 case FieldDescriptor::CPPTYPE_STRING: 415 switch (field->options().ctype()) { 416 default: // TODO(kenton): Support other string reps. 417 case FieldOptions::STRING: 418 MutableRaw<RepeatedPtrFieldBase>(message1, field)-> 419 Swap<GenericTypeHandler<string> >( 420 MutableRaw<RepeatedPtrFieldBase>(message2, field)); 421 break; 422 } 423 break; 424 case FieldDescriptor::CPPTYPE_MESSAGE: 425 if (IsMapFieldInApi(field)) { 426 MutableRaw<MapFieldBase>(message1, field)-> 427 MutableRepeatedField()-> 428 Swap<GenericTypeHandler<google::protobuf::Message> >( 429 MutableRaw<MapFieldBase>(message2, field)-> 430 MutableRepeatedField()); 431 } else { 432 MutableRaw<RepeatedPtrFieldBase>(message1, field)-> 433 Swap<GenericTypeHandler<google::protobuf::Message> >( 434 MutableRaw<RepeatedPtrFieldBase>(message2, field)); 435 } 436 break; 437 438 default: 439 GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type(); 440 } 441 } else { 442 switch (field->cpp_type()) { 443 #define SWAP_VALUES(CPPTYPE, TYPE) \ 444 case FieldDescriptor::CPPTYPE_##CPPTYPE: \ 445 std::swap(*MutableRaw<TYPE>(message1, field), \ 446 *MutableRaw<TYPE>(message2, field)); \ 447 break; 448 449 SWAP_VALUES(INT32 , int32 ); 450 SWAP_VALUES(INT64 , int64 ); 451 SWAP_VALUES(UINT32, uint32); 452 SWAP_VALUES(UINT64, uint64); 453 SWAP_VALUES(FLOAT , float ); 454 SWAP_VALUES(DOUBLE, double); 455 SWAP_VALUES(BOOL , bool ); 456 SWAP_VALUES(ENUM , int ); 457 #undef SWAP_VALUES 458 case FieldDescriptor::CPPTYPE_MESSAGE: 459 if (GetArena(message1) == GetArena(message2)) { 460 std::swap(*MutableRaw<Message*>(message1, field), 461 *MutableRaw<Message*>(message2, field)); 462 } else { 463 Message** sub_msg1 = MutableRaw<Message*>(message1, field); 464 Message** sub_msg2 = MutableRaw<Message*>(message2, field); 465 if (*sub_msg1 == NULL && *sub_msg2 == NULL) break; 466 if (*sub_msg1 && *sub_msg2) { 467 (*sub_msg1)->GetReflection()->Swap(*sub_msg1, *sub_msg2); 468 break; 469 } 470 if (*sub_msg1 == NULL) { 471 *sub_msg1 = (*sub_msg2)->New(message1->GetArena()); 472 (*sub_msg1)->CopyFrom(**sub_msg2); 473 ClearField(message2, field); 474 } else { 475 *sub_msg2 = (*sub_msg1)->New(message2->GetArena()); 476 (*sub_msg2)->CopyFrom(**sub_msg1); 477 ClearField(message1, field); 478 } 479 } 480 break; 481 482 case FieldDescriptor::CPPTYPE_STRING: 483 switch (field->options().ctype()) { 484 default: // TODO(kenton): Support other string reps. 485 case FieldOptions::STRING: 486 { 487 Arena* arena1 = GetArena(message1); 488 Arena* arena2 = GetArena(message2); 489 ArenaStringPtr* string1 = 490 MutableRaw<ArenaStringPtr>(message1, field); 491 ArenaStringPtr* string2 = 492 MutableRaw<ArenaStringPtr>(message2, field); 493 if (arena1 == arena2) { 494 string1->Swap(string2); 495 } else { 496 const string* default_ptr = 497 &DefaultRaw<ArenaStringPtr>(field).Get(NULL); 498 const string temp = string1->Get(default_ptr); 499 string1->Set(default_ptr, string2->Get(default_ptr), arena1); 500 string2->Set(default_ptr, temp, arena2); 501 } 502 } 503 break; 504 } 505 break; 506 507 default: 508 GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type(); 509 } 510 } 511 } 512 513 void GeneratedMessageReflection::SwapOneofField( 514 Message* message1, 515 Message* message2, 516 const OneofDescriptor* oneof_descriptor) const { 517 uint32 oneof_case1 = GetOneofCase(*message1, oneof_descriptor); 518 uint32 oneof_case2 = GetOneofCase(*message2, oneof_descriptor); 519 520 int32 temp_int32; 521 int64 temp_int64; 522 uint32 temp_uint32; 523 uint64 temp_uint64; 524 float temp_float; 525 double temp_double; 526 bool temp_bool; 527 int temp_int; 528 Message* temp_message = NULL; 529 string temp_string; 530 531 // Stores message1's oneof field to a temp variable. 532 const FieldDescriptor* field1 = NULL; 533 if (oneof_case1 > 0) { 534 field1 = descriptor_->FindFieldByNumber(oneof_case1); 535 //oneof_descriptor->field(oneof_case1); 536 switch (field1->cpp_type()) { 537 #define GET_TEMP_VALUE(CPPTYPE, TYPE) \ 538 case FieldDescriptor::CPPTYPE_##CPPTYPE: \ 539 temp_##TYPE = GetField<TYPE>(*message1, field1); \ 540 break; 541 542 GET_TEMP_VALUE(INT32 , int32 ); 543 GET_TEMP_VALUE(INT64 , int64 ); 544 GET_TEMP_VALUE(UINT32, uint32); 545 GET_TEMP_VALUE(UINT64, uint64); 546 GET_TEMP_VALUE(FLOAT , float ); 547 GET_TEMP_VALUE(DOUBLE, double); 548 GET_TEMP_VALUE(BOOL , bool ); 549 GET_TEMP_VALUE(ENUM , int ); 550 #undef GET_TEMP_VALUE 551 case FieldDescriptor::CPPTYPE_MESSAGE: 552 temp_message = ReleaseMessage(message1, field1); 553 break; 554 555 case FieldDescriptor::CPPTYPE_STRING: 556 temp_string = GetString(*message1, field1); 557 break; 558 559 default: 560 GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type(); 561 } 562 } 563 564 // Sets message1's oneof field from the message2's oneof field. 565 if (oneof_case2 > 0) { 566 const FieldDescriptor* field2 = 567 descriptor_->FindFieldByNumber(oneof_case2); 568 switch (field2->cpp_type()) { 569 #define SET_ONEOF_VALUE1(CPPTYPE, TYPE) \ 570 case FieldDescriptor::CPPTYPE_##CPPTYPE: \ 571 SetField<TYPE>(message1, field2, GetField<TYPE>(*message2, field2)); \ 572 break; 573 574 SET_ONEOF_VALUE1(INT32 , int32 ); 575 SET_ONEOF_VALUE1(INT64 , int64 ); 576 SET_ONEOF_VALUE1(UINT32, uint32); 577 SET_ONEOF_VALUE1(UINT64, uint64); 578 SET_ONEOF_VALUE1(FLOAT , float ); 579 SET_ONEOF_VALUE1(DOUBLE, double); 580 SET_ONEOF_VALUE1(BOOL , bool ); 581 SET_ONEOF_VALUE1(ENUM , int ); 582 #undef SET_ONEOF_VALUE1 583 case FieldDescriptor::CPPTYPE_MESSAGE: 584 SetAllocatedMessage(message1, 585 ReleaseMessage(message2, field2), 586 field2); 587 break; 588 589 case FieldDescriptor::CPPTYPE_STRING: 590 SetString(message1, field2, GetString(*message2, field2)); 591 break; 592 593 default: 594 GOOGLE_LOG(FATAL) << "Unimplemented type: " << field2->cpp_type(); 595 } 596 } else { 597 ClearOneof(message1, oneof_descriptor); 598 } 599 600 // Sets message2's oneof field from the temp variable. 601 if (oneof_case1 > 0) { 602 switch (field1->cpp_type()) { 603 #define SET_ONEOF_VALUE2(CPPTYPE, TYPE) \ 604 case FieldDescriptor::CPPTYPE_##CPPTYPE: \ 605 SetField<TYPE>(message2, field1, temp_##TYPE); \ 606 break; 607 608 SET_ONEOF_VALUE2(INT32 , int32 ); 609 SET_ONEOF_VALUE2(INT64 , int64 ); 610 SET_ONEOF_VALUE2(UINT32, uint32); 611 SET_ONEOF_VALUE2(UINT64, uint64); 612 SET_ONEOF_VALUE2(FLOAT , float ); 613 SET_ONEOF_VALUE2(DOUBLE, double); 614 SET_ONEOF_VALUE2(BOOL , bool ); 615 SET_ONEOF_VALUE2(ENUM , int ); 616 #undef SET_ONEOF_VALUE2 617 case FieldDescriptor::CPPTYPE_MESSAGE: 618 SetAllocatedMessage(message2, temp_message, field1); 619 break; 620 621 case FieldDescriptor::CPPTYPE_STRING: 622 SetString(message2, field1, temp_string); 623 break; 624 625 default: 626 GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type(); 627 } 628 } else { 629 ClearOneof(message2, oneof_descriptor); 630 } 631 } 632 633 void GeneratedMessageReflection::Swap( 634 Message* message1, 635 Message* message2) const { 636 if (message1 == message2) return; 637 638 // TODO(kenton): Other Reflection methods should probably check this too. 639 GOOGLE_CHECK_EQ(message1->GetReflection(), this) 640 << "First argument to Swap() (of type \"" 641 << message1->GetDescriptor()->full_name() 642 << "\") is not compatible with this reflection object (which is for type \"" 643 << descriptor_->full_name() 644 << "\"). Note that the exact same class is required; not just the same " 645 "descriptor."; 646 GOOGLE_CHECK_EQ(message2->GetReflection(), this) 647 << "Second argument to Swap() (of type \"" 648 << message2->GetDescriptor()->full_name() 649 << "\") is not compatible with this reflection object (which is for type \"" 650 << descriptor_->full_name() 651 << "\"). Note that the exact same class is required; not just the same " 652 "descriptor."; 653 654 // Check that both messages are in the same arena (or both on the heap). We 655 // need to copy all data if not, due to ownership semantics. 656 if (GetArena(message1) != GetArena(message2)) { 657 // Slow copy path. 658 // Use our arena as temp space, if available. 659 Message* temp = message1->New(GetArena(message1)); 660 temp->MergeFrom(*message1); 661 message1->CopyFrom(*message2); 662 message2->CopyFrom(*temp); 663 if (GetArena(message1) == NULL) { 664 delete temp; 665 } 666 return; 667 } 668 669 if (has_bits_offset_ != -1) { 670 uint32* has_bits1 = MutableHasBits(message1); 671 uint32* has_bits2 = MutableHasBits(message2); 672 int has_bits_size = (descriptor_->field_count() + 31) / 32; 673 674 for (int i = 0; i < has_bits_size; i++) { 675 std::swap(has_bits1[i], has_bits2[i]); 676 } 677 } 678 679 for (int i = 0; i < descriptor_->field_count(); i++) { 680 const FieldDescriptor* field = descriptor_->field(i); 681 if (!field->containing_oneof()) { 682 SwapField(message1, message2, field); 683 } 684 } 685 686 for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { 687 SwapOneofField(message1, message2, descriptor_->oneof_decl(i)); 688 } 689 690 if (extensions_offset_ != -1) { 691 MutableExtensionSet(message1)->Swap(MutableExtensionSet(message2)); 692 } 693 694 MutableUnknownFields(message1)->Swap(MutableUnknownFields(message2)); 695 } 696 697 void GeneratedMessageReflection::SwapFields( 698 Message* message1, 699 Message* message2, 700 const vector<const FieldDescriptor*>& fields) const { 701 if (message1 == message2) return; 702 703 // TODO(kenton): Other Reflection methods should probably check this too. 704 GOOGLE_CHECK_EQ(message1->GetReflection(), this) 705 << "First argument to SwapFields() (of type \"" 706 << message1->GetDescriptor()->full_name() 707 << "\") is not compatible with this reflection object (which is for type \"" 708 << descriptor_->full_name() 709 << "\"). Note that the exact same class is required; not just the same " 710 "descriptor."; 711 GOOGLE_CHECK_EQ(message2->GetReflection(), this) 712 << "Second argument to SwapFields() (of type \"" 713 << message2->GetDescriptor()->full_name() 714 << "\") is not compatible with this reflection object (which is for type \"" 715 << descriptor_->full_name() 716 << "\"). Note that the exact same class is required; not just the same " 717 "descriptor."; 718 719 std::set<int> swapped_oneof; 720 721 for (int i = 0; i < fields.size(); i++) { 722 const FieldDescriptor* field = fields[i]; 723 if (field->is_extension()) { 724 MutableExtensionSet(message1)->SwapExtension( 725 MutableExtensionSet(message2), 726 field->number()); 727 } else { 728 if (field->containing_oneof()) { 729 int oneof_index = field->containing_oneof()->index(); 730 // Only swap the oneof field once. 731 if (swapped_oneof.find(oneof_index) != swapped_oneof.end()) { 732 continue; 733 } 734 swapped_oneof.insert(oneof_index); 735 SwapOneofField(message1, message2, field->containing_oneof()); 736 } else { 737 // Swap has bit. 738 SwapBit(message1, message2, field); 739 // Swap field. 740 SwapField(message1, message2, field); 741 } 742 } 743 } 744 } 745 746 // ------------------------------------------------------------------- 747 748 bool GeneratedMessageReflection::HasField(const Message& message, 749 const FieldDescriptor* field) const { 750 USAGE_CHECK_MESSAGE_TYPE(HasField); 751 USAGE_CHECK_SINGULAR(HasField); 752 753 if (field->is_extension()) { 754 return GetExtensionSet(message).Has(field->number()); 755 } else { 756 if (field->containing_oneof()) { 757 return HasOneofField(message, field); 758 } else { 759 return HasBit(message, field); 760 } 761 } 762 } 763 764 int GeneratedMessageReflection::FieldSize(const Message& message, 765 const FieldDescriptor* field) const { 766 USAGE_CHECK_MESSAGE_TYPE(FieldSize); 767 USAGE_CHECK_REPEATED(FieldSize); 768 769 if (field->is_extension()) { 770 return GetExtensionSet(message).ExtensionSize(field->number()); 771 } else { 772 switch (field->cpp_type()) { 773 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 774 case FieldDescriptor::CPPTYPE_##UPPERCASE : \ 775 return GetRaw<RepeatedField<LOWERCASE> >(message, field).size() 776 777 HANDLE_TYPE( INT32, int32); 778 HANDLE_TYPE( INT64, int64); 779 HANDLE_TYPE(UINT32, uint32); 780 HANDLE_TYPE(UINT64, uint64); 781 HANDLE_TYPE(DOUBLE, double); 782 HANDLE_TYPE( FLOAT, float); 783 HANDLE_TYPE( BOOL, bool); 784 HANDLE_TYPE( ENUM, int); 785 #undef HANDLE_TYPE 786 787 case FieldDescriptor::CPPTYPE_STRING: 788 case FieldDescriptor::CPPTYPE_MESSAGE: 789 if (IsMapFieldInApi(field)) { 790 return GetRaw<MapFieldBase>(message, field).GetRepeatedField().size(); 791 } else { 792 return GetRaw<RepeatedPtrFieldBase>(message, field).size(); 793 } 794 } 795 796 GOOGLE_LOG(FATAL) << "Can't get here."; 797 return 0; 798 } 799 } 800 801 void GeneratedMessageReflection::ClearField( 802 Message* message, const FieldDescriptor* field) const { 803 USAGE_CHECK_MESSAGE_TYPE(ClearField); 804 805 if (field->is_extension()) { 806 MutableExtensionSet(message)->ClearExtension(field->number()); 807 } else if (!field->is_repeated()) { 808 if (field->containing_oneof()) { 809 ClearOneofField(message, field); 810 return; 811 } 812 813 if (HasBit(*message, field)) { 814 ClearBit(message, field); 815 816 // We need to set the field back to its default value. 817 switch (field->cpp_type()) { 818 #define CLEAR_TYPE(CPPTYPE, TYPE) \ 819 case FieldDescriptor::CPPTYPE_##CPPTYPE: \ 820 *MutableRaw<TYPE>(message, field) = \ 821 field->default_value_##TYPE(); \ 822 break; 823 824 CLEAR_TYPE(INT32 , int32 ); 825 CLEAR_TYPE(INT64 , int64 ); 826 CLEAR_TYPE(UINT32, uint32); 827 CLEAR_TYPE(UINT64, uint64); 828 CLEAR_TYPE(FLOAT , float ); 829 CLEAR_TYPE(DOUBLE, double); 830 CLEAR_TYPE(BOOL , bool ); 831 #undef CLEAR_TYPE 832 833 case FieldDescriptor::CPPTYPE_ENUM: 834 *MutableRaw<int>(message, field) = 835 field->default_value_enum()->number(); 836 break; 837 838 case FieldDescriptor::CPPTYPE_STRING: { 839 switch (field->options().ctype()) { 840 default: // TODO(kenton): Support other string reps. 841 case FieldOptions::STRING: { 842 const string* default_ptr = 843 &DefaultRaw<ArenaStringPtr>(field).Get(NULL); 844 MutableRaw<ArenaStringPtr>(message, field)->Destroy(default_ptr, 845 GetArena(message)); 846 break; 847 } 848 } 849 break; 850 } 851 852 case FieldDescriptor::CPPTYPE_MESSAGE: 853 if (has_bits_offset_ == -1) { 854 // Proto3 does not have has-bits and we need to set a message field 855 // to NULL in order to indicate its un-presence. 856 if (GetArena(message) == NULL) { 857 delete *MutableRaw<Message*>(message, field); 858 } 859 *MutableRaw<Message*>(message, field) = NULL; 860 } else { 861 (*MutableRaw<Message*>(message, field))->Clear(); 862 } 863 break; 864 } 865 } 866 } else { 867 switch (field->cpp_type()) { 868 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 869 case FieldDescriptor::CPPTYPE_##UPPERCASE : \ 870 MutableRaw<RepeatedField<LOWERCASE> >(message, field)->Clear(); \ 871 break 872 873 HANDLE_TYPE( INT32, int32); 874 HANDLE_TYPE( INT64, int64); 875 HANDLE_TYPE(UINT32, uint32); 876 HANDLE_TYPE(UINT64, uint64); 877 HANDLE_TYPE(DOUBLE, double); 878 HANDLE_TYPE( FLOAT, float); 879 HANDLE_TYPE( BOOL, bool); 880 HANDLE_TYPE( ENUM, int); 881 #undef HANDLE_TYPE 882 883 case FieldDescriptor::CPPTYPE_STRING: { 884 switch (field->options().ctype()) { 885 default: // TODO(kenton): Support other string reps. 886 case FieldOptions::STRING: 887 MutableRaw<RepeatedPtrField<string> >(message, field)->Clear(); 888 break; 889 } 890 break; 891 } 892 893 case FieldDescriptor::CPPTYPE_MESSAGE: { 894 if (IsMapFieldInApi(field)) { 895 MutableRaw<MapFieldBase>(message, field) 896 ->MutableRepeatedField() 897 ->Clear<GenericTypeHandler<Message> >(); 898 } else { 899 // We don't know which subclass of RepeatedPtrFieldBase the type is, 900 // so we use RepeatedPtrFieldBase directly. 901 MutableRaw<RepeatedPtrFieldBase>(message, field) 902 ->Clear<GenericTypeHandler<Message> >(); 903 } 904 break; 905 } 906 } 907 } 908 } 909 910 void GeneratedMessageReflection::RemoveLast( 911 Message* message, 912 const FieldDescriptor* field) const { 913 USAGE_CHECK_MESSAGE_TYPE(RemoveLast); 914 USAGE_CHECK_REPEATED(RemoveLast); 915 916 if (field->is_extension()) { 917 MutableExtensionSet(message)->RemoveLast(field->number()); 918 } else { 919 switch (field->cpp_type()) { 920 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 921 case FieldDescriptor::CPPTYPE_##UPPERCASE : \ 922 MutableRaw<RepeatedField<LOWERCASE> >(message, field)->RemoveLast(); \ 923 break 924 925 HANDLE_TYPE( INT32, int32); 926 HANDLE_TYPE( INT64, int64); 927 HANDLE_TYPE(UINT32, uint32); 928 HANDLE_TYPE(UINT64, uint64); 929 HANDLE_TYPE(DOUBLE, double); 930 HANDLE_TYPE( FLOAT, float); 931 HANDLE_TYPE( BOOL, bool); 932 HANDLE_TYPE( ENUM, int); 933 #undef HANDLE_TYPE 934 935 case FieldDescriptor::CPPTYPE_STRING: 936 switch (field->options().ctype()) { 937 default: // TODO(kenton): Support other string reps. 938 case FieldOptions::STRING: 939 MutableRaw<RepeatedPtrField<string> >(message, field)->RemoveLast(); 940 break; 941 } 942 break; 943 944 case FieldDescriptor::CPPTYPE_MESSAGE: 945 if (IsMapFieldInApi(field)) { 946 MutableRaw<MapFieldBase>(message, field) 947 ->MutableRepeatedField() 948 ->RemoveLast<GenericTypeHandler<Message> >(); 949 } else { 950 MutableRaw<RepeatedPtrFieldBase>(message, field) 951 ->RemoveLast<GenericTypeHandler<Message> >(); 952 } 953 break; 954 } 955 } 956 } 957 958 Message* GeneratedMessageReflection::ReleaseLast( 959 Message* message, 960 const FieldDescriptor* field) const { 961 USAGE_CHECK_ALL(ReleaseLast, REPEATED, MESSAGE); 962 963 if (field->is_extension()) { 964 return static_cast<Message*>( 965 MutableExtensionSet(message)->ReleaseLast(field->number())); 966 } else { 967 if (IsMapFieldInApi(field)) { 968 return MutableRaw<MapFieldBase>(message, field) 969 ->MutableRepeatedField() 970 ->ReleaseLast<GenericTypeHandler<Message> >(); 971 } else { 972 return MutableRaw<RepeatedPtrFieldBase>(message, field) 973 ->ReleaseLast<GenericTypeHandler<Message> >(); 974 } 975 } 976 } 977 978 void GeneratedMessageReflection::SwapElements( 979 Message* message, 980 const FieldDescriptor* field, 981 int index1, 982 int index2) const { 983 USAGE_CHECK_MESSAGE_TYPE(Swap); 984 USAGE_CHECK_REPEATED(Swap); 985 986 if (field->is_extension()) { 987 MutableExtensionSet(message)->SwapElements(field->number(), index1, index2); 988 } else { 989 switch (field->cpp_type()) { 990 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ 991 case FieldDescriptor::CPPTYPE_##UPPERCASE : \ 992 MutableRaw<RepeatedField<LOWERCASE> >(message, field) \ 993 ->SwapElements(index1, index2); \ 994 break 995 996 HANDLE_TYPE( INT32, int32); 997 HANDLE_TYPE( INT64, int64); 998 HANDLE_TYPE(UINT32, uint32); 999 HANDLE_TYPE(UINT64, uint64); 1000 HANDLE_TYPE(DOUBLE, double); 1001 HANDLE_TYPE( FLOAT, float); 1002 HANDLE_TYPE( BOOL, bool); 1003 HANDLE_TYPE( ENUM, int); 1004 #undef HANDLE_TYPE 1005 1006 case FieldDescriptor::CPPTYPE_STRING: 1007 case FieldDescriptor::CPPTYPE_MESSAGE: 1008 if (IsMapFieldInApi(field)) { 1009 MutableRaw<MapFieldBase>(message, field) 1010 ->MutableRepeatedField() 1011 ->SwapElements(index1, index2); 1012 } else { 1013 MutableRaw<RepeatedPtrFieldBase>(message, field) 1014 ->SwapElements(index1, index2); 1015 } 1016 break; 1017 } 1018 } 1019 } 1020 1021 namespace { 1022 // Comparison functor for sorting FieldDescriptors by field number. 1023 struct FieldNumberSorter { 1024 bool operator()(const FieldDescriptor* left, 1025 const FieldDescriptor* right) const { 1026 return left->number() < right->number(); 1027 } 1028 }; 1029 } // namespace 1030 1031 void GeneratedMessageReflection::ListFields( 1032 const Message& message, 1033 vector<const FieldDescriptor*>* output) const { 1034 output->clear(); 1035 1036 // Optimization: The default instance never has any fields set. 1037 if (&message == default_instance_) return; 1038 1039 output->reserve(descriptor_->field_count()); 1040 for (int i = 0; i < descriptor_->field_count(); i++) { 1041 const FieldDescriptor* field = descriptor_->field(i); 1042 if (field->is_repeated()) { 1043 if (FieldSize(message, field) > 0) { 1044 output->push_back(field); 1045 } 1046 } else { 1047 if (field->containing_oneof()) { 1048 if (HasOneofField(message, field)) { 1049 output->push_back(field); 1050 } 1051 } else if (HasBit(message, field)) { 1052 output->push_back(field); 1053 } 1054 } 1055 } 1056 1057 if (extensions_offset_ != -1) { 1058 GetExtensionSet(message).AppendToList(descriptor_, descriptor_pool_, 1059 output); 1060 } 1061 1062 // ListFields() must sort output by field number. 1063 std::sort(output->begin(), output->end(), FieldNumberSorter()); 1064 } 1065 1066 // ------------------------------------------------------------------- 1067 1068 #undef DEFINE_PRIMITIVE_ACCESSORS 1069 #define DEFINE_PRIMITIVE_ACCESSORS(TYPENAME, TYPE, PASSTYPE, CPPTYPE) \ 1070 PASSTYPE GeneratedMessageReflection::Get##TYPENAME( \ 1071 const Message& message, const FieldDescriptor* field) const { \ 1072 USAGE_CHECK_ALL(Get##TYPENAME, SINGULAR, CPPTYPE); \ 1073 if (field->is_extension()) { \ 1074 return GetExtensionSet(message).Get##TYPENAME( \ 1075 field->number(), field->default_value_##PASSTYPE()); \ 1076 } else { \ 1077 return GetField<TYPE>(message, field); \ 1078 } \ 1079 } \ 1080 \ 1081 void GeneratedMessageReflection::Set##TYPENAME( \ 1082 Message* message, const FieldDescriptor* field, \ 1083 PASSTYPE value) const { \ 1084 USAGE_CHECK_ALL(Set##TYPENAME, SINGULAR, CPPTYPE); \ 1085 if (field->is_extension()) { \ 1086 return MutableExtensionSet(message)->Set##TYPENAME( \ 1087 field->number(), field->type(), value, field); \ 1088 } else { \ 1089 SetField<TYPE>(message, field, value); \ 1090 } \ 1091 } \ 1092 \ 1093 PASSTYPE GeneratedMessageReflection::GetRepeated##TYPENAME( \ 1094 const Message& message, \ 1095 const FieldDescriptor* field, int index) const { \ 1096 USAGE_CHECK_ALL(GetRepeated##TYPENAME, REPEATED, CPPTYPE); \ 1097 if (field->is_extension()) { \ 1098 return GetExtensionSet(message).GetRepeated##TYPENAME( \ 1099 field->number(), index); \ 1100 } else { \ 1101 return GetRepeatedField<TYPE>(message, field, index); \ 1102 } \ 1103 } \ 1104 \ 1105 void GeneratedMessageReflection::SetRepeated##TYPENAME( \ 1106 Message* message, const FieldDescriptor* field, \ 1107 int index, PASSTYPE value) const { \ 1108 USAGE_CHECK_ALL(SetRepeated##TYPENAME, REPEATED, CPPTYPE); \ 1109 if (field->is_extension()) { \ 1110 MutableExtensionSet(message)->SetRepeated##TYPENAME( \ 1111 field->number(), index, value); \ 1112 } else { \ 1113 SetRepeatedField<TYPE>(message, field, index, value); \ 1114 } \ 1115 } \ 1116 \ 1117 void GeneratedMessageReflection::Add##TYPENAME( \ 1118 Message* message, const FieldDescriptor* field, \ 1119 PASSTYPE value) const { \ 1120 USAGE_CHECK_ALL(Add##TYPENAME, REPEATED, CPPTYPE); \ 1121 if (field->is_extension()) { \ 1122 MutableExtensionSet(message)->Add##TYPENAME( \ 1123 field->number(), field->type(), field->options().packed(), value, \ 1124 field); \ 1125 } else { \ 1126 AddField<TYPE>(message, field, value); \ 1127 } \ 1128 } 1129 1130 DEFINE_PRIMITIVE_ACCESSORS(Int32 , int32 , int32 , INT32 ) 1131 DEFINE_PRIMITIVE_ACCESSORS(Int64 , int64 , int64 , INT64 ) 1132 DEFINE_PRIMITIVE_ACCESSORS(UInt32, uint32, uint32, UINT32) 1133 DEFINE_PRIMITIVE_ACCESSORS(UInt64, uint64, uint64, UINT64) 1134 DEFINE_PRIMITIVE_ACCESSORS(Float , float , float , FLOAT ) 1135 DEFINE_PRIMITIVE_ACCESSORS(Double, double, double, DOUBLE) 1136 DEFINE_PRIMITIVE_ACCESSORS(Bool , bool , bool , BOOL ) 1137 #undef DEFINE_PRIMITIVE_ACCESSORS 1138 1139 // ------------------------------------------------------------------- 1140 1141 string GeneratedMessageReflection::GetString( 1142 const Message& message, const FieldDescriptor* field) const { 1143 USAGE_CHECK_ALL(GetString, SINGULAR, STRING); 1144 if (field->is_extension()) { 1145 return GetExtensionSet(message).GetString(field->number(), 1146 field->default_value_string()); 1147 } else { 1148 switch (field->options().ctype()) { 1149 default: // TODO(kenton): Support other string reps. 1150 case FieldOptions::STRING: { 1151 const string* default_ptr = 1152 &DefaultRaw<ArenaStringPtr>(field).Get(NULL); 1153 return GetField<ArenaStringPtr>(message, field).Get(default_ptr); 1154 } 1155 } 1156 1157 GOOGLE_LOG(FATAL) << "Can't get here."; 1158 return GetEmptyString(); // Make compiler happy. 1159 } 1160 } 1161 1162 const string& GeneratedMessageReflection::GetStringReference( 1163 const Message& message, 1164 const FieldDescriptor* field, string* scratch) const { 1165 USAGE_CHECK_ALL(GetStringReference, SINGULAR, STRING); 1166 if (field->is_extension()) { 1167 return GetExtensionSet(message).GetString(field->number(), 1168 field->default_value_string()); 1169 } else { 1170 switch (field->options().ctype()) { 1171 default: // TODO(kenton): Support other string reps. 1172 case FieldOptions::STRING: { 1173 const string* default_ptr = 1174 &DefaultRaw<ArenaStringPtr>(field).Get(NULL); 1175 return GetField<ArenaStringPtr>(message, field).Get(default_ptr); 1176 } 1177 } 1178 1179 GOOGLE_LOG(FATAL) << "Can't get here."; 1180 return GetEmptyString(); // Make compiler happy. 1181 } 1182 } 1183 1184 1185 void GeneratedMessageReflection::SetString( 1186 Message* message, const FieldDescriptor* field, 1187 const string& value) const { 1188 USAGE_CHECK_ALL(SetString, SINGULAR, STRING); 1189 if (field->is_extension()) { 1190 return MutableExtensionSet(message)->SetString(field->number(), 1191 field->type(), value, field); 1192 } else { 1193 switch (field->options().ctype()) { 1194 default: // TODO(kenton): Support other string reps. 1195 case FieldOptions::STRING: { 1196 const string* default_ptr = 1197 &DefaultRaw<ArenaStringPtr>(field).Get(NULL); 1198 if (field->containing_oneof() && !HasOneofField(*message, field)) { 1199 ClearOneof(message, field->containing_oneof()); 1200 MutableField<ArenaStringPtr>(message, field)->UnsafeSetDefault( 1201 default_ptr); 1202 } 1203 MutableField<ArenaStringPtr>(message, field)->Set(default_ptr, 1204 value, GetArena(message)); 1205 break; 1206 } 1207 } 1208 } 1209 } 1210 1211 1212 string GeneratedMessageReflection::GetRepeatedString( 1213 const Message& message, const FieldDescriptor* field, int index) const { 1214 USAGE_CHECK_ALL(GetRepeatedString, REPEATED, STRING); 1215 if (field->is_extension()) { 1216 return GetExtensionSet(message).GetRepeatedString(field->number(), index); 1217 } else { 1218 switch (field->options().ctype()) { 1219 default: // TODO(kenton): Support other string reps. 1220 case FieldOptions::STRING: 1221 return GetRepeatedPtrField<string>(message, field, index); 1222 } 1223 1224 GOOGLE_LOG(FATAL) << "Can't get here."; 1225 return GetEmptyString(); // Make compiler happy. 1226 } 1227 } 1228 1229 const string& GeneratedMessageReflection::GetRepeatedStringReference( 1230 const Message& message, const FieldDescriptor* field, 1231 int index, string* scratch) const { 1232 USAGE_CHECK_ALL(GetRepeatedStringReference, REPEATED, STRING); 1233 if (field->is_extension()) { 1234 return GetExtensionSet(message).GetRepeatedString(field->number(), index); 1235 } else { 1236 switch (field->options().ctype()) { 1237 default: // TODO(kenton): Support other string reps. 1238 case FieldOptions::STRING: 1239 return GetRepeatedPtrField<string>(message, field, index); 1240 } 1241 1242 GOOGLE_LOG(FATAL) << "Can't get here."; 1243 return GetEmptyString(); // Make compiler happy. 1244 } 1245 } 1246 1247 1248 void GeneratedMessageReflection::SetRepeatedString( 1249 Message* message, const FieldDescriptor* field, 1250 int index, const string& value) const { 1251 USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING); 1252 if (field->is_extension()) { 1253 MutableExtensionSet(message)->SetRepeatedString( 1254 field->number(), index, value); 1255 } else { 1256 switch (field->options().ctype()) { 1257 default: // TODO(kenton): Support other string reps. 1258 case FieldOptions::STRING: 1259 *MutableRepeatedField<string>(message, field, index) = value; 1260 break; 1261 } 1262 } 1263 } 1264 1265 1266 void GeneratedMessageReflection::AddString( 1267 Message* message, const FieldDescriptor* field, 1268 const string& value) const { 1269 USAGE_CHECK_ALL(AddString, REPEATED, STRING); 1270 if (field->is_extension()) { 1271 MutableExtensionSet(message)->AddString(field->number(), 1272 field->type(), value, field); 1273 } else { 1274 switch (field->options().ctype()) { 1275 default: // TODO(kenton): Support other string reps. 1276 case FieldOptions::STRING: 1277 *AddField<string>(message, field) = value; 1278 break; 1279 } 1280 } 1281 } 1282 1283 1284 // ------------------------------------------------------------------- 1285 1286 inline bool CreateUnknownEnumValues(const FileDescriptor* file) { 1287 return file->syntax() == FileDescriptor::SYNTAX_PROTO3; 1288 } 1289 1290 const EnumValueDescriptor* GeneratedMessageReflection::GetEnum( 1291 const Message& message, const FieldDescriptor* field) const { 1292 // Usage checked by GetEnumValue. 1293 int value = GetEnumValue(message, field); 1294 return field->enum_type()->FindValueByNumberCreatingIfUnknown(value); 1295 } 1296 1297 int GeneratedMessageReflection::GetEnumValue( 1298 const Message& message, const FieldDescriptor* field) const { 1299 USAGE_CHECK_ALL(GetEnumValue, SINGULAR, ENUM); 1300 1301 int32 value; 1302 if (field->is_extension()) { 1303 value = GetExtensionSet(message).GetEnum( 1304 field->number(), field->default_value_enum()->number()); 1305 } else { 1306 value = GetField<int>(message, field); 1307 } 1308 return value; 1309 } 1310 1311 void GeneratedMessageReflection::SetEnum( 1312 Message* message, const FieldDescriptor* field, 1313 const EnumValueDescriptor* value) const { 1314 // Usage checked by SetEnumValue. 1315 USAGE_CHECK_ENUM_VALUE(SetEnum); 1316 SetEnumValueInternal(message, field, value->number()); 1317 } 1318 1319 void GeneratedMessageReflection::SetEnumValue( 1320 Message* message, const FieldDescriptor* field, 1321 int value) const { 1322 USAGE_CHECK_ALL(SetEnumValue, SINGULAR, ENUM); 1323 if (!CreateUnknownEnumValues(descriptor_->file())) { 1324 // Check that the value is valid if we don't support direct storage of 1325 // unknown enum values. 1326 const EnumValueDescriptor* value_desc = 1327 field->enum_type()->FindValueByNumber(value); 1328 if (value_desc == NULL) { 1329 GOOGLE_LOG(DFATAL) << "SetEnumValue accepts only valid integer values: value " 1330 << value << " unexpected for field " << field->full_name(); 1331 // In production builds, DFATAL will not terminate the program, so we have 1332 // to do something reasonable: just set the default value. 1333 value = field->default_value_enum()->number(); 1334 } 1335 } 1336 SetEnumValueInternal(message, field, value); 1337 } 1338 1339 void GeneratedMessageReflection::SetEnumValueInternal( 1340 Message* message, const FieldDescriptor* field, 1341 int value) const { 1342 if (field->is_extension()) { 1343 MutableExtensionSet(message)->SetEnum(field->number(), field->type(), 1344 value, field); 1345 } else { 1346 SetField<int>(message, field, value); 1347 } 1348 } 1349 1350 const EnumValueDescriptor* GeneratedMessageReflection::GetRepeatedEnum( 1351 const Message& message, const FieldDescriptor* field, int index) const { 1352 // Usage checked by GetRepeatedEnumValue. 1353 int value = GetRepeatedEnumValue(message, field, index); 1354 return field->enum_type()->FindValueByNumberCreatingIfUnknown(value); 1355 } 1356 1357 int GeneratedMessageReflection::GetRepeatedEnumValue( 1358 const Message& message, const FieldDescriptor* field, int index) const { 1359 USAGE_CHECK_ALL(GetRepeatedEnumValue, REPEATED, ENUM); 1360 1361 int value; 1362 if (field->is_extension()) { 1363 value = GetExtensionSet(message).GetRepeatedEnum(field->number(), index); 1364 } else { 1365 value = GetRepeatedField<int>(message, field, index); 1366 } 1367 return value; 1368 } 1369 1370 void GeneratedMessageReflection::SetRepeatedEnum( 1371 Message* message, 1372 const FieldDescriptor* field, int index, 1373 const EnumValueDescriptor* value) const { 1374 // Usage checked by SetRepeatedEnumValue. 1375 USAGE_CHECK_ENUM_VALUE(SetRepeatedEnum); 1376 SetRepeatedEnumValueInternal(message, field, index, value->number()); 1377 } 1378 1379 void GeneratedMessageReflection::SetRepeatedEnumValue( 1380 Message* message, 1381 const FieldDescriptor* field, int index, 1382 int value) const { 1383 USAGE_CHECK_ALL(SetRepeatedEnum, REPEATED, ENUM); 1384 if (!CreateUnknownEnumValues(descriptor_->file())) { 1385 // Check that the value is valid if we don't support direct storage of 1386 // unknown enum values. 1387 const EnumValueDescriptor* value_desc = 1388 field->enum_type()->FindValueByNumber(value); 1389 if (value_desc == NULL) { 1390 GOOGLE_LOG(DFATAL) << "SetRepeatedEnumValue accepts only valid integer values: " 1391 << "value " << value << " unexpected for field " 1392 << field->full_name(); 1393 // In production builds, DFATAL will not terminate the program, so we have 1394 // to do something reasonable: just set the default value. 1395 value = field->default_value_enum()->number(); 1396 } 1397 } 1398 SetRepeatedEnumValueInternal(message, field, index, value); 1399 } 1400 1401 void GeneratedMessageReflection::SetRepeatedEnumValueInternal( 1402 Message* message, 1403 const FieldDescriptor* field, int index, 1404 int value) const { 1405 if (field->is_extension()) { 1406 MutableExtensionSet(message)->SetRepeatedEnum( 1407 field->number(), index, value); 1408 } else { 1409 SetRepeatedField<int>(message, field, index, value); 1410 } 1411 } 1412 1413 void GeneratedMessageReflection::AddEnum( 1414 Message* message, const FieldDescriptor* field, 1415 const EnumValueDescriptor* value) const { 1416 // Usage checked by AddEnumValue. 1417 USAGE_CHECK_ENUM_VALUE(AddEnum); 1418 AddEnumValueInternal(message, field, value->number()); 1419 } 1420 1421 void GeneratedMessageReflection::AddEnumValue( 1422 Message* message, const FieldDescriptor* field, 1423 int value) const { 1424 USAGE_CHECK_ALL(AddEnum, REPEATED, ENUM); 1425 if (!CreateUnknownEnumValues(descriptor_->file())) { 1426 // Check that the value is valid if we don't support direct storage of 1427 // unknown enum values. 1428 const EnumValueDescriptor* value_desc = 1429 field->enum_type()->FindValueByNumber(value); 1430 if (value_desc == NULL) { 1431 GOOGLE_LOG(DFATAL) << "AddEnumValue accepts only valid integer values: value " 1432 << value << " unexpected for field " << field->full_name(); 1433 // In production builds, DFATAL will not terminate the program, so we have 1434 // to do something reasonable: just set the default value. 1435 value = field->default_value_enum()->number(); 1436 } 1437 } 1438 AddEnumValueInternal(message, field, value); 1439 } 1440 1441 void GeneratedMessageReflection::AddEnumValueInternal( 1442 Message* message, const FieldDescriptor* field, 1443 int value) const { 1444 if (field->is_extension()) { 1445 MutableExtensionSet(message)->AddEnum(field->number(), field->type(), 1446 field->options().packed(), 1447 value, field); 1448 } else { 1449 AddField<int>(message, field, value); 1450 } 1451 } 1452 1453 // ------------------------------------------------------------------- 1454 1455 const Message& GeneratedMessageReflection::GetMessage( 1456 const Message& message, const FieldDescriptor* field, 1457 MessageFactory* factory) const { 1458 USAGE_CHECK_ALL(GetMessage, SINGULAR, MESSAGE); 1459 1460 if (factory == NULL) factory = message_factory_; 1461 1462 if (field->is_extension()) { 1463 return static_cast<const Message&>( 1464 GetExtensionSet(message).GetMessage( 1465 field->number(), field->message_type(), factory)); 1466 } else { 1467 const Message* result; 1468 result = GetRaw<const Message*>(message, field); 1469 if (result == NULL) { 1470 result = DefaultRaw<const Message*>(field); 1471 } 1472 return *result; 1473 } 1474 } 1475 1476 Message* GeneratedMessageReflection::MutableMessage( 1477 Message* message, const FieldDescriptor* field, 1478 MessageFactory* factory) const { 1479 USAGE_CHECK_ALL(MutableMessage, SINGULAR, MESSAGE); 1480 1481 if (factory == NULL) factory = message_factory_; 1482 1483 if (field->is_extension()) { 1484 return static_cast<Message*>( 1485 MutableExtensionSet(message)->MutableMessage(field, factory)); 1486 } else { 1487 Message* result; 1488 Message** result_holder = MutableRaw<Message*>(message, field); 1489 1490 if (field->containing_oneof()) { 1491 if (!HasOneofField(*message, field)) { 1492 ClearOneof(message, field->containing_oneof()); 1493 result_holder = MutableField<Message*>(message, field); 1494 const Message* default_message = DefaultRaw<const Message*>(field); 1495 *result_holder = default_message->New(message->GetArena()); 1496 } 1497 } else { 1498 SetBit(message, field); 1499 } 1500 1501 if (*result_holder == NULL) { 1502 const Message* default_message = DefaultRaw<const Message*>(field); 1503 *result_holder = default_message->New(message->GetArena()); 1504 } 1505 result = *result_holder; 1506 return result; 1507 } 1508 } 1509 1510 void GeneratedMessageReflection::UnsafeArenaSetAllocatedMessage( 1511 Message* message, 1512 Message* sub_message, 1513 const FieldDescriptor* field) const { 1514 USAGE_CHECK_ALL(SetAllocatedMessage, SINGULAR, MESSAGE); 1515 1516 if (field->is_extension()) { 1517 MutableExtensionSet(message)->SetAllocatedMessage( 1518 field->number(), field->type(), field, sub_message); 1519 } else { 1520 if (field->containing_oneof()) { 1521 if (sub_message == NULL) { 1522 ClearOneof(message, field->containing_oneof()); 1523 return; 1524 } 1525 ClearOneof(message, field->containing_oneof()); 1526 *MutableRaw<Message*>(message, field) = sub_message; 1527 SetOneofCase(message, field); 1528 return; 1529 } 1530 1531 if (sub_message == NULL) { 1532 ClearBit(message, field); 1533 } else { 1534 SetBit(message, field); 1535 } 1536 Message** sub_message_holder = MutableRaw<Message*>(message, field); 1537 if (GetArena(message) == NULL) { 1538 delete *sub_message_holder; 1539 } 1540 *sub_message_holder = sub_message; 1541 } 1542 } 1543 1544 void GeneratedMessageReflection::SetAllocatedMessage( 1545 Message* message, 1546 Message* sub_message, 1547 const FieldDescriptor* field) const { 1548 // If message and sub-message are in different memory ownership domains 1549 // (different arenas, or one is on heap and one is not), then we may need to 1550 // do a copy. 1551 if (sub_message != NULL && 1552 sub_message->GetArena() != message->GetArena()) { 1553 if (sub_message->GetArena() == NULL && message->GetArena() != NULL) { 1554 // Case 1: parent is on an arena and child is heap-allocated. We can add 1555 // the child to the arena's Own() list to free on arena destruction, then 1556 // set our pointer. 1557 message->GetArena()->Own(sub_message); 1558 UnsafeArenaSetAllocatedMessage(message, sub_message, field); 1559 } else { 1560 // Case 2: all other cases. We need to make a copy. MutableMessage() will 1561 // either get the existing message object, or instantiate a new one as 1562 // appropriate w.r.t. our arena. 1563 Message* sub_message_copy = MutableMessage(message, field); 1564 sub_message_copy->CopyFrom(*sub_message); 1565 } 1566 } else { 1567 // Same memory ownership domains. 1568 UnsafeArenaSetAllocatedMessage(message, sub_message, field); 1569 } 1570 } 1571 1572 Message* GeneratedMessageReflection::UnsafeArenaReleaseMessage( 1573 Message* message, 1574 const FieldDescriptor* field, 1575 MessageFactory* factory) const { 1576 USAGE_CHECK_ALL(ReleaseMessage, SINGULAR, MESSAGE); 1577 1578 if (factory == NULL) factory = message_factory_; 1579 1580 if (field->is_extension()) { 1581 return static_cast<Message*>( 1582 MutableExtensionSet(message)->ReleaseMessage(field, factory)); 1583 } else { 1584 ClearBit(message, field); 1585 if (field->containing_oneof()) { 1586 if (HasOneofField(*message, field)) { 1587 *MutableOneofCase(message, field->containing_oneof()) = 0; 1588 } else { 1589 return NULL; 1590 } 1591 } 1592 Message** result = MutableRaw<Message*>(message, field); 1593 Message* ret = *result; 1594 *result = NULL; 1595 return ret; 1596 } 1597 } 1598 1599 Message* GeneratedMessageReflection::ReleaseMessage( 1600 Message* message, 1601 const FieldDescriptor* field, 1602 MessageFactory* factory) const { 1603 Message* released = UnsafeArenaReleaseMessage(message, field, factory); 1604 if (GetArena(message) != NULL && released != NULL) { 1605 Message* copy_from_arena = released->New(); 1606 copy_from_arena->CopyFrom(*released); 1607 released = copy_from_arena; 1608 } 1609 return released; 1610 } 1611 1612 const Message& GeneratedMessageReflection::GetRepeatedMessage( 1613 const Message& message, const FieldDescriptor* field, int index) const { 1614 USAGE_CHECK_ALL(GetRepeatedMessage, REPEATED, MESSAGE); 1615 1616 if (field->is_extension()) { 1617 return static_cast<const Message&>( 1618 GetExtensionSet(message).GetRepeatedMessage(field->number(), index)); 1619 } else { 1620 if (IsMapFieldInApi(field)) { 1621 return GetRaw<MapFieldBase>(message, field) 1622 .GetRepeatedField() 1623 .Get<GenericTypeHandler<Message> >(index); 1624 } else { 1625 return GetRaw<RepeatedPtrFieldBase>(message, field) 1626 .Get<GenericTypeHandler<Message> >(index); 1627 } 1628 } 1629 } 1630 1631 Message* GeneratedMessageReflection::MutableRepeatedMessage( 1632 Message* message, const FieldDescriptor* field, int index) const { 1633 USAGE_CHECK_ALL(MutableRepeatedMessage, REPEATED, MESSAGE); 1634 1635 if (field->is_extension()) { 1636 return static_cast<Message*>( 1637 MutableExtensionSet(message)->MutableRepeatedMessage( 1638 field->number(), index)); 1639 } else { 1640 if (IsMapFieldInApi(field)) { 1641 return MutableRaw<MapFieldBase>(message, field) 1642 ->MutableRepeatedField() 1643 ->Mutable<GenericTypeHandler<Message> >(index); 1644 } else { 1645 return MutableRaw<RepeatedPtrFieldBase>(message, field) 1646 ->Mutable<GenericTypeHandler<Message> >(index); 1647 } 1648 } 1649 } 1650 1651 Message* GeneratedMessageReflection::AddMessage( 1652 Message* message, const FieldDescriptor* field, 1653 MessageFactory* factory) const { 1654 USAGE_CHECK_ALL(AddMessage, REPEATED, MESSAGE); 1655 1656 if (factory == NULL) factory = message_factory_; 1657 1658 if (field->is_extension()) { 1659 return static_cast<Message*>( 1660 MutableExtensionSet(message)->AddMessage(field, factory)); 1661 } else { 1662 Message* result = NULL; 1663 1664 // We can't use AddField<Message>() because RepeatedPtrFieldBase doesn't 1665 // know how to allocate one. 1666 RepeatedPtrFieldBase* repeated = NULL; 1667 if (IsMapFieldInApi(field)) { 1668 repeated = 1669 MutableRaw<MapFieldBase>(message, field)->MutableRepeatedField(); 1670 } else { 1671 repeated = MutableRaw<RepeatedPtrFieldBase>(message, field); 1672 } 1673 result = repeated->AddFromCleared<GenericTypeHandler<Message> >(); 1674 if (result == NULL) { 1675 // We must allocate a new object. 1676 const Message* prototype; 1677 if (repeated->size() == 0) { 1678 prototype = factory->GetPrototype(field->message_type()); 1679 } else { 1680 prototype = &repeated->Get<GenericTypeHandler<Message> >(0); 1681 } 1682 result = prototype->New(message->GetArena()); 1683 // We can guarantee here that repeated and result are either both heap 1684 // allocated or arena owned. So it is safe to call the unsafe version 1685 // of AddAllocated. 1686 repeated->UnsafeArenaAddAllocated<GenericTypeHandler<Message> >(result); 1687 } 1688 1689 return result; 1690 } 1691 } 1692 1693 void GeneratedMessageReflection::AddAllocatedMessage( 1694 Message* message, const FieldDescriptor* field, 1695 Message* new_entry) const { 1696 USAGE_CHECK_ALL(AddAllocatedMessage, REPEATED, MESSAGE); 1697 1698 if (field->is_extension()) { 1699 MutableExtensionSet(message)->AddAllocatedMessage(field, new_entry); 1700 } else { 1701 RepeatedPtrFieldBase* repeated = NULL; 1702 if (IsMapFieldInApi(field)) { 1703 repeated = 1704 MutableRaw<MapFieldBase>(message, field)->MutableRepeatedField(); 1705 } else { 1706 repeated = MutableRaw<RepeatedPtrFieldBase>(message, field); 1707 } 1708 repeated->AddAllocated<GenericTypeHandler<Message> >(new_entry); 1709 } 1710 } 1711 1712 void* GeneratedMessageReflection::MutableRawRepeatedField( 1713 Message* message, const FieldDescriptor* field, 1714 FieldDescriptor::CppType cpptype, 1715 int ctype, const Descriptor* desc) const { 1716 USAGE_CHECK_REPEATED("MutableRawRepeatedField"); 1717 if (field->cpp_type() != cpptype) 1718 ReportReflectionUsageTypeError(descriptor_, 1719 field, "MutableRawRepeatedField", cpptype); 1720 if (ctype >= 0) 1721 GOOGLE_CHECK_EQ(field->options().ctype(), ctype) << "subtype mismatch"; 1722 if (desc != NULL) 1723 GOOGLE_CHECK_EQ(field->message_type(), desc) << "wrong submessage type"; 1724 if (field->is_extension()) { 1725 return MutableExtensionSet(message)->MutableRawRepeatedField( 1726 field->number(), field->type(), field->is_packed(), field); 1727 } else { 1728 // Trigger transform for MapField 1729 if (IsMapFieldInApi(field)) { 1730 return reinterpret_cast<MapFieldBase*>(reinterpret_cast<uint8*>(message) + 1731 offsets_[field->index()]) 1732 ->MutableRepeatedField(); 1733 } 1734 return reinterpret_cast<uint8*>(message) + offsets_[field->index()]; 1735 } 1736 } 1737 1738 const void* GeneratedMessageReflection::GetRawRepeatedField( 1739 const Message& message, const FieldDescriptor* field, 1740 FieldDescriptor::CppType cpptype, 1741 int ctype, const Descriptor* desc) const { 1742 USAGE_CHECK_REPEATED("GetRawRepeatedField"); 1743 if (field->cpp_type() != cpptype) 1744 ReportReflectionUsageTypeError(descriptor_, 1745 field, "GetRawRepeatedField", cpptype); 1746 if (ctype >= 0) 1747 GOOGLE_CHECK_EQ(field->options().ctype(), ctype) << "subtype mismatch"; 1748 if (desc != NULL) 1749 GOOGLE_CHECK_EQ(field->message_type(), desc) << "wrong submessage type"; 1750 if (field->is_extension()) { 1751 // Should use extension_set::GetRawRepeatedField. However, the required 1752 // parameter "default repeated value" is not very easy to get here. 1753 // Map is not supported in extensions, it is acceptable to use 1754 // extension_set::MutableRawRepeatedField which does not change the message. 1755 return MutableExtensionSet(const_cast<Message*>(&message)) 1756 ->MutableRawRepeatedField( 1757 field->number(), field->type(), field->is_packed(), field); 1758 } else { 1759 // Trigger transform for MapField 1760 if (IsMapFieldInApi(field)) { 1761 return &(reinterpret_cast<const MapFieldBase*>( 1762 reinterpret_cast<const uint8*>(&message) + 1763 offsets_[field->index()])->GetRepeatedField()); 1764 } 1765 return reinterpret_cast<const uint8*>(&message) + offsets_[field->index()]; 1766 } 1767 } 1768 1769 const FieldDescriptor* GeneratedMessageReflection::GetOneofFieldDescriptor( 1770 const Message& message, 1771 const OneofDescriptor* oneof_descriptor) const { 1772 uint32 field_number = GetOneofCase(message, oneof_descriptor); 1773 if (field_number == 0) { 1774 return NULL; 1775 } 1776 return descriptor_->FindFieldByNumber(field_number); 1777 } 1778 1779 bool GeneratedMessageReflection::ContainsMapKey( 1780 const Message& message, 1781 const FieldDescriptor* field, 1782 const MapKey& key) const { 1783 USAGE_CHECK(IsMapFieldInApi(field), 1784 "LookupMapValue", 1785 "Field is not a map field."); 1786 return GetRaw<MapFieldBase>(message, field).ContainsMapKey(key); 1787 } 1788 1789 bool GeneratedMessageReflection::InsertOrLookupMapValue( 1790 Message* message, 1791 const FieldDescriptor* field, 1792 const MapKey& key, 1793 MapValueRef* val) const { 1794 USAGE_CHECK(IsMapFieldInApi(field), 1795 "InsertOrLookupMapValue", 1796 "Field is not a map field."); 1797 val->SetType(field->message_type()->FindFieldByName("value")->cpp_type()); 1798 return MutableRaw<MapFieldBase>(message, field)->InsertOrLookupMapValue( 1799 key, val); 1800 } 1801 1802 bool GeneratedMessageReflection::DeleteMapValue( 1803 Message* message, 1804 const FieldDescriptor* field, 1805 const MapKey& key) const { 1806 USAGE_CHECK(IsMapFieldInApi(field), 1807 "DeleteMapValue", 1808 "Field is not a map field."); 1809 return MutableRaw<MapFieldBase>(message, field)->DeleteMapValue(key); 1810 } 1811 1812 MapIterator GeneratedMessageReflection::MapBegin( 1813 Message* message, 1814 const FieldDescriptor* field) const { 1815 USAGE_CHECK(IsMapFieldInApi(field), 1816 "MapBegin", 1817 "Field is not a map field."); 1818 MapIterator iter(message, field); 1819 GetRaw<MapFieldBase>(*message, field).MapBegin(&iter); 1820 return iter; 1821 } 1822 1823 MapIterator GeneratedMessageReflection::MapEnd( 1824 Message* message, 1825 const FieldDescriptor* field) const { 1826 USAGE_CHECK(IsMapFieldInApi(field), 1827 "MapEnd", 1828 "Field is not a map field."); 1829 MapIterator iter(message, field); 1830 GetRaw<MapFieldBase>(*message, field).MapEnd(&iter); 1831 return iter; 1832 } 1833 1834 int GeneratedMessageReflection::MapSize( 1835 const Message& message, 1836 const FieldDescriptor* field) const { 1837 USAGE_CHECK(IsMapFieldInApi(field), 1838 "MapSize", 1839 "Field is not a map field."); 1840 return GetRaw<MapFieldBase>(message, field).size(); 1841 } 1842 1843 // ----------------------------------------------------------------------------- 1844 1845 const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByName( 1846 const string& name) const { 1847 if (extensions_offset_ == -1) return NULL; 1848 1849 const FieldDescriptor* result = descriptor_pool_->FindExtensionByName(name); 1850 if (result != NULL && result->containing_type() == descriptor_) { 1851 return result; 1852 } 1853 1854 if (descriptor_->options().message_set_wire_format()) { 1855 // MessageSet extensions may be identified by type name. 1856 const Descriptor* type = descriptor_pool_->FindMessageTypeByName(name); 1857 if (type != NULL) { 1858 // Look for a matching extension in the foreign type's scope. 1859 for (int i = 0; i < type->extension_count(); i++) { 1860 const FieldDescriptor* extension = type->extension(i); 1861 if (extension->containing_type() == descriptor_ && 1862 extension->type() == FieldDescriptor::TYPE_MESSAGE && 1863 extension->is_optional() && 1864 extension->message_type() == type) { 1865 // Found it. 1866 return extension; 1867 } 1868 } 1869 } 1870 } 1871 1872 return NULL; 1873 } 1874 1875 const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByNumber( 1876 int number) const { 1877 if (extensions_offset_ == -1) return NULL; 1878 return descriptor_pool_->FindExtensionByNumber(descriptor_, number); 1879 } 1880 1881 bool GeneratedMessageReflection::SupportsUnknownEnumValues() const { 1882 return CreateUnknownEnumValues(descriptor_->file()); 1883 } 1884 1885 // =================================================================== 1886 // Some private helpers. 1887 1888 // These simple template accessors obtain pointers (or references) to 1889 // the given field. 1890 template <typename Type> 1891 inline const Type& GeneratedMessageReflection::GetRaw( 1892 const Message& message, const FieldDescriptor* field) const { 1893 if (field->containing_oneof() && !HasOneofField(message, field)) { 1894 return DefaultRaw<Type>(field); 1895 } 1896 int index = field->containing_oneof() ? 1897 descriptor_->field_count() + field->containing_oneof()->index() : 1898 field->index(); 1899 const void* ptr = reinterpret_cast<const uint8*>(&message) + 1900 offsets_[index]; 1901 return *reinterpret_cast<const Type*>(ptr); 1902 } 1903 1904 template <typename Type> 1905 inline Type* GeneratedMessageReflection::MutableRaw( 1906 Message* message, const FieldDescriptor* field) const { 1907 int index = field->containing_oneof() ? 1908 descriptor_->field_count() + field->containing_oneof()->index() : 1909 field->index(); 1910 void* ptr = reinterpret_cast<uint8*>(message) + offsets_[index]; 1911 return reinterpret_cast<Type*>(ptr); 1912 } 1913 1914 template <typename Type> 1915 inline const Type& GeneratedMessageReflection::DefaultRaw( 1916 const FieldDescriptor* field) const { 1917 const void* ptr = field->containing_oneof() ? 1918 reinterpret_cast<const uint8*>(default_oneof_instance_) + 1919 offsets_[field->index()] : 1920 reinterpret_cast<const uint8*>(default_instance_) + 1921 offsets_[field->index()]; 1922 return *reinterpret_cast<const Type*>(ptr); 1923 } 1924 1925 inline const uint32* GeneratedMessageReflection::GetHasBits( 1926 const Message& message) const { 1927 if (has_bits_offset_ == -1) { // proto3 with no has-bits. 1928 return NULL; 1929 } 1930 const void* ptr = reinterpret_cast<const uint8*>(&message) + has_bits_offset_; 1931 return reinterpret_cast<const uint32*>(ptr); 1932 } 1933 inline uint32* GeneratedMessageReflection::MutableHasBits( 1934 Message* message) const { 1935 if (has_bits_offset_ == -1) { 1936 return NULL; 1937 } 1938 void* ptr = reinterpret_cast<uint8*>(message) + has_bits_offset_; 1939 return reinterpret_cast<uint32*>(ptr); 1940 } 1941 1942 inline uint32 GeneratedMessageReflection::GetOneofCase( 1943 const Message& message, 1944 const OneofDescriptor* oneof_descriptor) const { 1945 const void* ptr = reinterpret_cast<const uint8*>(&message) 1946 + oneof_case_offset_; 1947 return reinterpret_cast<const uint32*>(ptr)[oneof_descriptor->index()]; 1948 } 1949 1950 inline uint32* GeneratedMessageReflection::MutableOneofCase( 1951 Message* message, 1952 const OneofDescriptor* oneof_descriptor) const { 1953 void* ptr = reinterpret_cast<uint8*>(message) + oneof_case_offset_; 1954 return &(reinterpret_cast<uint32*>(ptr)[oneof_descriptor->index()]); 1955 } 1956 1957 inline const ExtensionSet& GeneratedMessageReflection::GetExtensionSet( 1958 const Message& message) const { 1959 GOOGLE_DCHECK_NE(extensions_offset_, -1); 1960 const void* ptr = reinterpret_cast<const uint8*>(&message) + 1961 extensions_offset_; 1962 return *reinterpret_cast<const ExtensionSet*>(ptr); 1963 } 1964 inline ExtensionSet* GeneratedMessageReflection::MutableExtensionSet( 1965 Message* message) const { 1966 GOOGLE_DCHECK_NE(extensions_offset_, -1); 1967 void* ptr = reinterpret_cast<uint8*>(message) + extensions_offset_; 1968 return reinterpret_cast<ExtensionSet*>(ptr); 1969 } 1970 1971 inline Arena* GeneratedMessageReflection::GetArena(Message* message) const { 1972 if (arena_offset_ == kNoArenaPointer) { 1973 return NULL; 1974 } 1975 1976 if (unknown_fields_offset_ == kUnknownFieldSetInMetadata) { 1977 // zero-overhead arena pointer overloading UnknownFields 1978 return GetInternalMetadataWithArena(*message).arena(); 1979 } 1980 1981 // Baseline case: message class has a dedicated arena pointer. 1982 void* ptr = reinterpret_cast<uint8*>(message) + arena_offset_; 1983 return *reinterpret_cast<Arena**>(ptr); 1984 } 1985 1986 inline const InternalMetadataWithArena& 1987 GeneratedMessageReflection::GetInternalMetadataWithArena( 1988 const Message& message) const { 1989 const void* ptr = reinterpret_cast<const uint8*>(&message) + arena_offset_; 1990 return *reinterpret_cast<const InternalMetadataWithArena*>(ptr); 1991 } 1992 1993 inline InternalMetadataWithArena* 1994 GeneratedMessageReflection::MutableInternalMetadataWithArena( 1995 Message* message) const { 1996 void* ptr = reinterpret_cast<uint8*>(message) + arena_offset_; 1997 return reinterpret_cast<InternalMetadataWithArena*>(ptr); 1998 } 1999 2000 inline bool 2001 GeneratedMessageReflection::GetIsDefaultInstance( 2002 const Message& message) const { 2003 if (is_default_instance_offset_ == kHasNoDefaultInstanceField) { 2004 return false; 2005 } 2006 const void* ptr = reinterpret_cast<const uint8*>(&message) + 2007 is_default_instance_offset_; 2008 return *reinterpret_cast<const bool*>(ptr); 2009 } 2010 2011 // Simple accessors for manipulating has_bits_. 2012 inline bool GeneratedMessageReflection::HasBit( 2013 const Message& message, const FieldDescriptor* field) const { 2014 if (has_bits_offset_ == -1) { 2015 // proto3: no has-bits. All fields present except messages, which are 2016 // present only if their message-field pointer is non-NULL. 2017 if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { 2018 return !GetIsDefaultInstance(message) && 2019 GetRaw<const Message*>(message, field) != NULL; 2020 } else { 2021 // Non-message field (and non-oneof, since that was handled in HasField() 2022 // before calling us), and singular (again, checked in HasField). So, this 2023 // field must be a scalar. 2024 2025 // Scalar primitive (numeric or string/bytes) fields are present if 2026 // their value is non-zero (numeric) or non-empty (string/bytes). N.B.: 2027 // we must use this definition here, rather than the "scalar fields 2028 // always present" in the proto3 docs, because MergeFrom() semantics 2029 // require presence as "present on wire", and reflection-based merge 2030 // (which uses HasField()) needs to be consistent with this. 2031 switch (field->cpp_type()) { 2032 case FieldDescriptor::CPPTYPE_STRING: 2033 switch (field->options().ctype()) { 2034 default: { 2035 const string* default_ptr = 2036 &DefaultRaw<ArenaStringPtr>(field).Get(NULL); 2037 return GetField<ArenaStringPtr>(message, field).Get( 2038 default_ptr).size() > 0; 2039 } 2040 } 2041 return false; 2042 case FieldDescriptor::CPPTYPE_BOOL: 2043 return GetRaw<bool>(message, field) != false; 2044 case FieldDescriptor::CPPTYPE_INT32: 2045 return GetRaw<int32>(message, field) != 0; 2046 case FieldDescriptor::CPPTYPE_INT64: 2047 return GetRaw<int64>(message, field) != 0; 2048 case FieldDescriptor::CPPTYPE_UINT32: 2049 return GetRaw<uint32>(message, field) != 0; 2050 case FieldDescriptor::CPPTYPE_UINT64: 2051 return GetRaw<uint64>(message, field) != 0; 2052 case FieldDescriptor::CPPTYPE_FLOAT: 2053 return GetRaw<float>(message, field) != 0.0; 2054 case FieldDescriptor::CPPTYPE_DOUBLE: 2055 return GetRaw<double>(message, field) != 0.0; 2056 case FieldDescriptor::CPPTYPE_ENUM: 2057 return GetRaw<int>(message, field) != 0; 2058 case FieldDescriptor::CPPTYPE_MESSAGE: 2059 // handled above; avoid warning 2060 GOOGLE_LOG(FATAL) << "Reached impossible case in HasBit()."; 2061 break; 2062 } 2063 } 2064 } 2065 return GetHasBits(message)[field->index() / 32] & 2066 (1 << (field->index() % 32)); 2067 } 2068 2069 inline void GeneratedMessageReflection::SetBit( 2070 Message* message, const FieldDescriptor* field) const { 2071 if (has_bits_offset_ == -1) { 2072 return; 2073 } 2074 MutableHasBits(message)[field->index() / 32] |= (1 << (field->index() % 32)); 2075 } 2076 2077 inline void GeneratedMessageReflection::ClearBit( 2078 Message* message, const FieldDescriptor* field) const { 2079 if (has_bits_offset_ == -1) { 2080 return; 2081 } 2082 MutableHasBits(message)[field->index() / 32] &= ~(1 << (field->index() % 32)); 2083 } 2084 2085 inline void GeneratedMessageReflection::SwapBit( 2086 Message* message1, Message* message2, const FieldDescriptor* field) const { 2087 if (has_bits_offset_ == -1) { 2088 return; 2089 } 2090 bool temp_has_bit = HasBit(*message1, field); 2091 if (HasBit(*message2, field)) { 2092 SetBit(message1, field); 2093 } else { 2094 ClearBit(message1, field); 2095 } 2096 if (temp_has_bit) { 2097 SetBit(message2, field); 2098 } else { 2099 ClearBit(message2, field); 2100 } 2101 } 2102 2103 inline bool GeneratedMessageReflection::HasOneof( 2104 const Message& message, const OneofDescriptor* oneof_descriptor) const { 2105 return (GetOneofCase(message, oneof_descriptor) > 0); 2106 } 2107 2108 inline bool GeneratedMessageReflection::HasOneofField( 2109 const Message& message, const FieldDescriptor* field) const { 2110 return (GetOneofCase(message, field->containing_oneof()) == field->number()); 2111 } 2112 2113 inline void GeneratedMessageReflection::SetOneofCase( 2114 Message* message, const FieldDescriptor* field) const { 2115 *MutableOneofCase(message, field->containing_oneof()) = field->number(); 2116 } 2117 2118 inline void GeneratedMessageReflection::ClearOneofField( 2119 Message* message, const FieldDescriptor* field) const { 2120 if (HasOneofField(*message, field)) { 2121 ClearOneof(message, field->containing_oneof()); 2122 } 2123 } 2124 2125 inline void GeneratedMessageReflection::ClearOneof( 2126 Message* message, const OneofDescriptor* oneof_descriptor) const { 2127 // TODO(jieluo): Consider to cache the unused object instead of deleting 2128 // it. It will be much faster if an aplication switches a lot from 2129 // a few oneof fields. Time/space tradeoff 2130 uint32 oneof_case = GetOneofCase(*message, oneof_descriptor); 2131 if (oneof_case > 0) { 2132 const FieldDescriptor* field = descriptor_->FindFieldByNumber(oneof_case); 2133 if (GetArena(message) == NULL) { 2134 switch (field->cpp_type()) { 2135 case FieldDescriptor::CPPTYPE_STRING: { 2136 switch (field->options().ctype()) { 2137 default: // TODO(kenton): Support other string reps. 2138 case FieldOptions::STRING: { 2139 const string* default_ptr = 2140 &DefaultRaw<ArenaStringPtr>(field).Get(NULL); 2141 MutableField<ArenaStringPtr>(message, field)-> 2142 Destroy(default_ptr, GetArena(message)); 2143 break; 2144 } 2145 } 2146 break; 2147 } 2148 2149 case FieldDescriptor::CPPTYPE_MESSAGE: 2150 delete *MutableRaw<Message*>(message, field); 2151 break; 2152 default: 2153 break; 2154 } 2155 } 2156 2157 *MutableOneofCase(message, oneof_descriptor) = 0; 2158 } 2159 } 2160 2161 // Template implementations of basic accessors. Inline because each 2162 // template instance is only called from one location. These are 2163 // used for all types except messages. 2164 template <typename Type> 2165 inline const Type& GeneratedMessageReflection::GetField( 2166 const Message& message, const FieldDescriptor* field) const { 2167 return GetRaw<Type>(message, field); 2168 } 2169 2170 template <typename Type> 2171 inline void GeneratedMessageReflection::SetField( 2172 Message* message, const FieldDescriptor* field, const Type& value) const { 2173 if (field->containing_oneof() && !HasOneofField(*message, field)) { 2174 ClearOneof(message, field->containing_oneof()); 2175 } 2176 *MutableRaw<Type>(message, field) = value; 2177 field->containing_oneof() ? 2178 SetOneofCase(message, field) : SetBit(message, field); 2179 } 2180 2181 template <typename Type> 2182 inline Type* GeneratedMessageReflection::MutableField( 2183 Message* message, const FieldDescriptor* field) const { 2184 field->containing_oneof() ? 2185 SetOneofCase(message, field) : SetBit(message, field); 2186 return MutableRaw<Type>(message, field); 2187 } 2188 2189 template <typename Type> 2190 inline const Type& GeneratedMessageReflection::GetRepeatedField( 2191 const Message& message, const FieldDescriptor* field, int index) const { 2192 return GetRaw<RepeatedField<Type> >(message, field).Get(index); 2193 } 2194 2195 template <typename Type> 2196 inline const Type& GeneratedMessageReflection::GetRepeatedPtrField( 2197 const Message& message, const FieldDescriptor* field, int index) const { 2198 return GetRaw<RepeatedPtrField<Type> >(message, field).Get(index); 2199 } 2200 2201 template <typename Type> 2202 inline void GeneratedMessageReflection::SetRepeatedField( 2203 Message* message, const FieldDescriptor* field, 2204 int index, Type value) const { 2205 MutableRaw<RepeatedField<Type> >(message, field)->Set(index, value); 2206 } 2207 2208 template <typename Type> 2209 inline Type* GeneratedMessageReflection::MutableRepeatedField( 2210 Message* message, const FieldDescriptor* field, int index) const { 2211 RepeatedPtrField<Type>* repeated = 2212 MutableRaw<RepeatedPtrField<Type> >(message, field); 2213 return repeated->Mutable(index); 2214 } 2215 2216 template <typename Type> 2217 inline void GeneratedMessageReflection::AddField( 2218 Message* message, const FieldDescriptor* field, const Type& value) const { 2219 MutableRaw<RepeatedField<Type> >(message, field)->Add(value); 2220 } 2221 2222 template <typename Type> 2223 inline Type* GeneratedMessageReflection::AddField( 2224 Message* message, const FieldDescriptor* field) const { 2225 RepeatedPtrField<Type>* repeated = 2226 MutableRaw<RepeatedPtrField<Type> >(message, field); 2227 return repeated->Add(); 2228 } 2229 2230 MessageFactory* GeneratedMessageReflection::GetMessageFactory() const { 2231 return message_factory_; 2232 } 2233 2234 void* GeneratedMessageReflection::RepeatedFieldData( 2235 Message* message, const FieldDescriptor* field, 2236 FieldDescriptor::CppType cpp_type, 2237 const Descriptor* message_type) const { 2238 GOOGLE_CHECK(field->is_repeated()); 2239 GOOGLE_CHECK(field->cpp_type() == cpp_type || 2240 (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM && 2241 cpp_type == FieldDescriptor::CPPTYPE_INT32)) 2242 << "The type parameter T in RepeatedFieldRef<T> API doesn't match " 2243 << "the actual field type (for enums T should be the generated enum " 2244 << "type or int32)."; 2245 if (message_type != NULL) { 2246 GOOGLE_CHECK_EQ(message_type, field->message_type()); 2247 } 2248 if (field->is_extension()) { 2249 return MutableExtensionSet(message)->MutableRawRepeatedField( 2250 field->number(), field->type(), field->is_packed(), field); 2251 } else { 2252 return reinterpret_cast<uint8*>(message) + offsets_[field->index()]; 2253 } 2254 } 2255 2256 MapFieldBase* GeneratedMessageReflection::MapData( 2257 Message* message, const FieldDescriptor* field) const { 2258 USAGE_CHECK(IsMapFieldInApi(field), 2259 "GetMapData", 2260 "Field is not a map field."); 2261 return MutableRaw<MapFieldBase>(message, field); 2262 } 2263 2264 GeneratedMessageReflection* 2265 GeneratedMessageReflection::NewGeneratedMessageReflection( 2266 const Descriptor* descriptor, 2267 const Message* default_instance, 2268 const int offsets[], 2269 int has_bits_offset, 2270 int unknown_fields_offset, 2271 int extensions_offset, 2272 const void* default_oneof_instance, 2273 int oneof_case_offset, 2274 int object_size, 2275 int arena_offset, 2276 int is_default_instance_offset) { 2277 return new GeneratedMessageReflection(descriptor, 2278 default_instance, 2279 offsets, 2280 has_bits_offset, 2281 unknown_fields_offset, 2282 extensions_offset, 2283 default_oneof_instance, 2284 oneof_case_offset, 2285 DescriptorPool::generated_pool(), 2286 MessageFactory::generated_factory(), 2287 object_size, 2288 arena_offset, 2289 is_default_instance_offset); 2290 } 2291 2292 GeneratedMessageReflection* 2293 GeneratedMessageReflection::NewGeneratedMessageReflection( 2294 const Descriptor* descriptor, 2295 const Message* default_instance, 2296 const int offsets[], 2297 int has_bits_offset, 2298 int unknown_fields_offset, 2299 int extensions_offset, 2300 int object_size, 2301 int arena_offset, 2302 int is_default_instance_offset) { 2303 return new GeneratedMessageReflection(descriptor, 2304 default_instance, 2305 offsets, 2306 has_bits_offset, 2307 unknown_fields_offset, 2308 extensions_offset, 2309 DescriptorPool::generated_pool(), 2310 MessageFactory::generated_factory(), 2311 object_size, 2312 arena_offset, 2313 is_default_instance_offset); 2314 } 2315 2316 } // namespace internal 2317 } // namespace protobuf 2318 } // namespace google 2319