in cdk/extra/protobuf/protobuf-3.19.6/src/google/protobuf/compiler/cpp/cpp_message.cc [2302:2501]
void MessageGenerator::GenerateClassMethods(io::Printer* printer) {
Formatter format(printer, variables_);
if (IsMapEntryMessage(descriptor_)) {
format(
"$classname$::$classname$() {}\n"
"$classname$::$classname$(::$proto_ns$::Arena* arena)\n"
" : SuperType(arena) {}\n"
"void $classname$::MergeFrom(const $classname$& other) {\n"
" MergeFromInternal(other);\n"
"}\n");
if (HasDescriptorMethods(descriptor_->file(), options_)) {
if (!descriptor_->options().map_entry()) {
format(
"::$proto_ns$::Metadata $classname$::GetMetadata() const {\n"
"$annotate_reflection$"
" return ::$proto_ns$::internal::AssignDescriptors(\n"
" &$desc_table$_getter, &$desc_table$_once,\n"
" $file_level_metadata$[$1$]);\n"
"}\n",
index_in_file_messages_);
} else {
format(
"::$proto_ns$::Metadata $classname$::GetMetadata() const {\n"
" return ::$proto_ns$::internal::AssignDescriptors(\n"
" &$desc_table$_getter, &$desc_table$_once,\n"
" $file_level_metadata$[$1$]);\n"
"}\n",
index_in_file_messages_);
}
}
return;
}
if (IsAnyMessage(descriptor_, options_)) {
if (HasDescriptorMethods(descriptor_->file(), options_)) {
format(
"bool $classname$::GetAnyFieldDescriptors(\n"
" const ::$proto_ns$::Message& message,\n"
" const ::$proto_ns$::FieldDescriptor** type_url_field,\n"
" const ::$proto_ns$::FieldDescriptor** value_field) {\n"
" return ::$proto_ns$::internal::GetAnyFieldDescriptors(\n"
" message, type_url_field, value_field);\n"
"}\n");
}
format(
"bool $classname$::ParseAnyTypeUrl(\n"
" ::PROTOBUF_NAMESPACE_ID::ConstStringParam type_url,\n"
" std::string* full_type_name) {\n"
" return ::$proto_ns$::internal::ParseAnyTypeUrl(type_url,\n"
" full_type_name);\n"
"}\n"
"\n");
}
format(
"class $classname$::_Internal {\n"
" public:\n");
format.Indent();
if (!has_bit_indices_.empty()) {
format(
"using HasBits = decltype(std::declval<$classname$>()._has_bits_);\n");
}
for (auto field : FieldRange(descriptor_)) {
field_generators_.get(field).GenerateInternalAccessorDeclarations(printer);
if (IsFieldStripped(field, options_)) {
continue;
}
if (HasHasbit(field)) {
int has_bit_index = HasBitIndex(field);
GOOGLE_CHECK_NE(has_bit_index, kNoHasbit) << field->full_name();
format(
"static void set_has_$1$(HasBits* has_bits) {\n"
" (*has_bits)[$2$] |= $3$u;\n"
"}\n",
FieldName(field), has_bit_index / 32, (1u << (has_bit_index % 32)));
}
}
if (num_required_fields_ > 0) {
const std::vector<uint32_t> masks_for_has_bits = RequiredFieldsBitMask();
format(
"static bool MissingRequiredFields(const HasBits& has_bits) "
"{\n"
" return $1$;\n"
"}\n",
ConditionalToCheckBitmasks(masks_for_has_bits, false, "has_bits"));
}
format.Outdent();
format("};\n\n");
for (auto field : FieldRange(descriptor_)) {
if (!IsFieldStripped(field, options_)) {
field_generators_.get(field).GenerateInternalAccessorDefinitions(printer);
}
}
// Generate non-inline field definitions.
for (auto field : FieldRange(descriptor_)) {
if (IsFieldStripped(field, options_)) {
continue;
}
field_generators_.get(field).GenerateNonInlineAccessorDefinitions(printer);
if (IsCrossFileMaybeMap(field)) {
Formatter::SaveState saver(&format);
std::map<std::string, std::string> vars;
SetCommonFieldVariables(field, &vars, options_);
if (field->real_containing_oneof()) {
SetCommonOneofFieldVariables(field, &vars);
}
format.AddMap(vars);
GenerateFieldClear(field, false, format);
}
}
GenerateStructors(printer);
format("\n");
if (descriptor_->real_oneof_decl_count() > 0) {
GenerateOneofClear(printer);
format("\n");
}
if (HasGeneratedMethods(descriptor_->file(), options_)) {
GenerateClear(printer);
format("\n");
if (!HasSimpleBaseClass(descriptor_, options_)) {
parse_function_generator_->GenerateMethodImpls(printer);
format("\n");
parse_function_generator_->GenerateDataDefinitions(printer);
}
GenerateSerializeWithCachedSizesToArray(printer);
format("\n");
GenerateByteSize(printer);
format("\n");
GenerateMergeFrom(printer);
format("\n");
GenerateClassSpecificMergeFrom(printer);
format("\n");
GenerateCopyFrom(printer);
format("\n");
GenerateIsInitialized(printer);
format("\n");
}
GenerateVerify(printer);
GenerateSwap(printer);
format("\n");
if (options_.table_driven_serialization) {
format(
"const void* $classname$::InternalGetTable() const {\n"
" return ::$tablename$::serialization_table + $1$;\n"
"}\n"
"\n",
index_in_file_messages_);
}
if (HasDescriptorMethods(descriptor_->file(), options_)) {
if (!descriptor_->options().map_entry()) {
format(
"::$proto_ns$::Metadata $classname$::GetMetadata() const {\n"
"$annotate_reflection$"
" return ::$proto_ns$::internal::AssignDescriptors(\n"
" &$desc_table$_getter, &$desc_table$_once,\n"
" $file_level_metadata$[$1$]);\n"
"}\n",
index_in_file_messages_);
} else {
format(
"::$proto_ns$::Metadata $classname$::GetMetadata() const {\n"
" return ::$proto_ns$::internal::AssignDescriptors(\n"
" &$desc_table$_getter, &$desc_table$_once,\n"
" $file_level_metadata$[$1$]);\n"
"}\n",
index_in_file_messages_);
}
} else {
format(
"std::string $classname$::GetTypeName() const {\n"
" return \"$full_name$\";\n"
"}\n"
"\n");
}
if (options_.field_listener_options.inject_field_listener_events &&
descriptor_->file()->options().optimize_for() !=
google::protobuf::FileOptions::LITE_RUNTIME) {
format(
"::$proto_ns$::AccessListener<$classtype$> "
"$1$::_tracker_(&FullMessageName);\n",
ClassName(descriptor_));
}
}