File indexing completed on 2025-01-31 10:11:56
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__
0013 #define GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__
0014
0015 #include <cstddef>
0016 #include <cstdint>
0017 #include <limits>
0018 #include <memory>
0019 #include <string>
0020 #include <utility>
0021 #include <vector>
0022
0023 #include "absl/container/flat_hash_map.h"
0024 #include "absl/strings/string_view.h"
0025 #include "google/protobuf/compiler/cpp/enum.h"
0026 #include "google/protobuf/compiler/cpp/extension.h"
0027 #include "google/protobuf/compiler/cpp/field.h"
0028 #include "google/protobuf/compiler/cpp/helpers.h"
0029 #include "google/protobuf/compiler/cpp/message_layout_helper.h"
0030 #include "google/protobuf/compiler/cpp/options.h"
0031 #include "google/protobuf/compiler/cpp/parse_function_generator.h"
0032 #include "google/protobuf/io/printer.h"
0033
0034 namespace google {
0035 namespace protobuf {
0036 namespace compiler {
0037 namespace cpp {
0038 class MessageGenerator {
0039 public:
0040 MessageGenerator(
0041 const Descriptor* descriptor,
0042 const absl::flat_hash_map<absl::string_view, std::string>& ignored,
0043 int index_in_file_messages, const Options& options,
0044 MessageSCCAnalyzer* scc_analyzer);
0045
0046 MessageGenerator(const MessageGenerator&) = delete;
0047 MessageGenerator& operator=(const MessageGenerator&) = delete;
0048
0049 ~MessageGenerator() = default;
0050
0051 int index_in_file_messages() const { return index_in_file_messages_; }
0052
0053
0054 void AddGenerators(
0055 std::vector<std::unique_ptr<EnumGenerator>>* enum_generators,
0056 std::vector<std::unique_ptr<ExtensionGenerator>>* extension_generators);
0057
0058
0059 void GenerateClassDefinition(io::Printer* p);
0060
0061
0062
0063 void GenerateInlineMethods(io::Printer* p);
0064
0065
0066 void GenerateClassMethods(io::Printer* p);
0067
0068
0069 void GenerateSourceInProto2Namespace(io::Printer* p);
0070
0071
0072 void GenerateInitDefaultSplitInstance(io::Printer* p);
0073
0074
0075
0076 void GenerateConstexprConstructor(io::Printer* p);
0077
0078 void GenerateSchema(io::Printer* p, int offset, int has_offset);
0079
0080
0081
0082 std::pair<size_t, size_t> GenerateOffsets(io::Printer* p);
0083
0084 const Descriptor* descriptor() const { return descriptor_; }
0085
0086 private:
0087 using GeneratorFunction = FieldGeneratorBase::GeneratorFunction;
0088 enum class InitType { kConstexpr, kArena, kArenaCopy };
0089
0090
0091 void GenerateFieldAccessorDeclarations(io::Printer* p);
0092 void GenerateFieldAccessorDefinitions(io::Printer* p);
0093
0094
0095 void GenerateStructors(io::Printer* p);
0096
0097 void GenerateZeroInitFields(io::Printer* p) const;
0098 void GenerateCopyInitFields(io::Printer* p) const;
0099
0100 void GenerateImplMemberInit(io::Printer* p, InitType init_type);
0101
0102 void GenerateArenaEnabledCopyConstructor(io::Printer* p);
0103
0104
0105
0106
0107
0108
0109 void GenerateSharedConstructorCode(io::Printer* p);
0110
0111
0112 void GenerateSharedDestructorCode(io::Printer* p);
0113
0114 void GenerateArenaDestructorCode(io::Printer* p);
0115
0116
0117 void GenerateClear(io::Printer* p);
0118 void GenerateOneofClear(io::Printer* p);
0119 void GenerateVerifyDecl(io::Printer* p);
0120 void GenerateVerify(io::Printer* p);
0121 void GenerateAnnotationDecl(io::Printer* p);
0122 void GenerateSerializeWithCachedSizes(io::Printer* p);
0123 void GenerateSerializeWithCachedSizesToArray(io::Printer* p);
0124 void GenerateSerializeWithCachedSizesBody(io::Printer* p);
0125 void GenerateSerializeWithCachedSizesBodyShuffled(io::Printer* p);
0126 void GenerateByteSize(io::Printer* p);
0127 void GenerateClassData(io::Printer* p);
0128 void GenerateMapEntryClassDefinition(io::Printer* p);
0129 void GenerateAnyMethodDefinition(io::Printer* p);
0130 void GenerateImplDefinition(io::Printer* p);
0131 void GenerateClassSpecificMergeImpl(io::Printer* p);
0132 void GenerateCopyFrom(io::Printer* p);
0133 void GenerateSwap(io::Printer* p);
0134 void GenerateIsInitialized(io::Printer* p);
0135 bool NeedsIsInitialized();
0136
0137
0138
0139
0140
0141
0142 void GenerateSerializeOneField(io::Printer* p, const FieldDescriptor* field,
0143 int cached_has_bits_index);
0144
0145
0146 void GenerateSerializeOneofFields(
0147 io::Printer* p, const std::vector<const FieldDescriptor*>& fields);
0148 void GenerateSerializeOneExtensionRange(io::Printer* p, int start, int end);
0149
0150
0151 void GenerateSingularFieldHasBits(const FieldDescriptor* field,
0152 io::Printer* p);
0153
0154 void GenerateOneofHasBits(io::Printer* p);
0155
0156 void GenerateOneofMemberHasBits(const FieldDescriptor* field, io::Printer* p);
0157
0158 void GenerateFieldClear(const FieldDescriptor* field, bool is_inline,
0159 io::Printer* p);
0160
0161
0162
0163 bool RequiresArena(GeneratorFunction function) const;
0164
0165
0166 bool ImplHasCopyCtor() const;
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178 ArenaDtorNeeds NeedsArenaDestructor() const;
0179
0180 size_t HasBitsSize() const;
0181 size_t InlinedStringDonatedSize() const;
0182 absl::flat_hash_map<absl::string_view, std::string> HasBitVars(
0183 const FieldDescriptor* field) const;
0184 int HasBitIndex(const FieldDescriptor* field) const;
0185 int HasByteIndex(const FieldDescriptor* field) const;
0186 int HasWordIndex(const FieldDescriptor* field) const;
0187 std::vector<uint32_t> RequiredFieldsBitMask() const;
0188
0189 const Descriptor* descriptor_;
0190 int index_in_file_messages_;
0191 Options options_;
0192 FieldGeneratorTable field_generators_;
0193
0194
0195
0196
0197
0198 std::vector<const FieldDescriptor*> optimized_order_;
0199 std::vector<int> has_bit_indices_;
0200 int max_has_bit_index_ = 0;
0201
0202
0203
0204
0205 std::vector<int> inlined_string_indices_;
0206
0207 int max_inlined_string_index_ = 0;
0208
0209 std::vector<const EnumGenerator*> enum_generators_;
0210 std::vector<const ExtensionGenerator*> extension_generators_;
0211 int num_required_fields_ = 0;
0212 int num_weak_fields_ = 0;
0213
0214 std::unique_ptr<MessageLayoutHelper> message_layout_helper_;
0215 std::unique_ptr<ParseFunctionGenerator> parse_function_generator_;
0216
0217 MessageSCCAnalyzer* scc_analyzer_;
0218
0219 absl::flat_hash_map<absl::string_view, std::string> variables_;
0220
0221 };
0222
0223 }
0224 }
0225 }
0226 }
0227
0228 #endif