| 454 | } |
| 455 | |
| 456 | void GeneratedMessageReflection::ClearField( |
| 457 | Message* message, const FieldDescriptor* field) const { |
| 458 | USAGE_CHECK_MESSAGE_TYPE(ClearField); |
| 459 | |
| 460 | if (field->is_extension()) { |
| 461 | MutableExtensionSet(message)->ClearExtension(field->number()); |
| 462 | } else if (!field->is_repeated()) { |
| 463 | if (HasBit(*message, field)) { |
| 464 | ClearBit(message, field); |
| 465 | |
| 466 | // We need to set the field back to its default value. |
| 467 | switch (field->cpp_type()) { |
| 468 | #define CLEAR_TYPE(CPPTYPE, TYPE) \ |
| 469 | case FieldDescriptor::CPPTYPE_##CPPTYPE: \ |
| 470 | *MutableRaw<TYPE>(message, field) = \ |
| 471 | field->default_value_##TYPE(); \ |
| 472 | break; |
| 473 | |
| 474 | CLEAR_TYPE(INT32 , int32 ); |
| 475 | CLEAR_TYPE(INT64 , int64 ); |
| 476 | CLEAR_TYPE(UINT32, uint32); |
| 477 | CLEAR_TYPE(UINT64, uint64); |
| 478 | CLEAR_TYPE(FLOAT , float ); |
| 479 | CLEAR_TYPE(DOUBLE, double); |
| 480 | CLEAR_TYPE(BOOL , bool ); |
| 481 | #undef CLEAR_TYPE |
| 482 | |
| 483 | case FieldDescriptor::CPPTYPE_ENUM: |
| 484 | *MutableRaw<int>(message, field) = |
| 485 | field->default_value_enum()->number(); |
| 486 | break; |
| 487 | |
| 488 | case FieldDescriptor::CPPTYPE_STRING: { |
| 489 | switch (field->options().ctype()) { |
| 490 | default: // TODO(kenton): Support other string reps. |
| 491 | case FieldOptions::STRING: |
| 492 | const string* default_ptr = DefaultRaw<const string*>(field); |
| 493 | string** value = MutableRaw<string*>(message, field); |
| 494 | if (*value != default_ptr) { |
| 495 | if (field->has_default_value()) { |
| 496 | (*value)->assign(field->default_value_string()); |
| 497 | } else { |
| 498 | (*value)->clear(); |
| 499 | } |
| 500 | } |
| 501 | break; |
| 502 | } |
| 503 | break; |
| 504 | } |
| 505 | |
| 506 | case FieldDescriptor::CPPTYPE_MESSAGE: |
| 507 | (*MutableRaw<Message*>(message, field))->Clear(); |
| 508 | break; |
| 509 | } |
| 510 | } |
| 511 | } else { |
| 512 | switch (field->cpp_type()) { |
| 513 | #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ |
no test coverage detected