#include <google/protobuf/compiler/cpp/parse_function_generator.h>
#include <algorithm>
#include <limits>
#include <string>
#include <utility>
#include <google/protobuf/wire_format.h>
#include <google/protobuf/compiler/cpp/helpers.h>
namespace google {
namespace protobuf {
namespace compiler {
namespace cpp {
namespace {
WireFormat;
WireFormatLite;
std::vector<const FieldDescriptor*> GetOrderedFields(
const Descriptor* descriptor, const Options& options) { … }
bool HasInternalAccessors(const FieldOptions::CType ctype) { … }
int TagSize(uint32_t field_number) { … }
std::string FieldParseFunctionName(
const TailCallTableInfo::FieldEntryInfo& entry, const Options& options);
bool IsFieldEligibleForFastParsing(
const TailCallTableInfo::FieldEntryInfo& entry, const Options& options,
MessageSCCAnalyzer* scc_analyzer) { … }
std::vector<TailCallTableInfo::FastFieldInfo> SplitFastFieldsForSize(
const std::vector<TailCallTableInfo::FieldEntryInfo>& field_entries,
int table_size_log2, const Options& options,
MessageSCCAnalyzer* scc_analyzer) { … }
std::vector<const FieldDescriptor*> FilterMiniParsedFields(
const std::vector<const FieldDescriptor*>& fields, const Options& options,
MessageSCCAnalyzer* scc_analyzer) { … }
}
TailCallTableInfo::TailCallTableInfo(
const Descriptor* descriptor, const Options& options,
const std::vector<const FieldDescriptor*>& ordered_fields,
const std::vector<int>& has_bit_indices,
const std::vector<int>& inlined_string_indices,
MessageSCCAnalyzer* scc_analyzer) { … }
ParseFunctionGenerator::ParseFunctionGenerator(
const Descriptor* descriptor, int max_has_bit_index,
const std::vector<int>& has_bit_indices,
const std::vector<int>& inlined_string_indices, const Options& options,
MessageSCCAnalyzer* scc_analyzer,
const std::map<std::string, std::string>& vars)
: … { … }
void ParseFunctionGenerator::GenerateMethodDecls(io::Printer* printer) { … }
void ParseFunctionGenerator::GenerateMethodImpls(io::Printer* printer) { … }
bool ParseFunctionGenerator::should_generate_tctable() const { … }
void ParseFunctionGenerator::GenerateTailcallParseFunction(Formatter& format) { … }
void ParseFunctionGenerator::GenerateTailcallFallbackFunction(
Formatter& format) { … }
struct SkipEntry16 { … };
struct SkipEntryBlock { … };
struct NumToEntryTable { … };
static NumToEntryTable MakeNumToEntryTable(
const std::vector<const FieldDescriptor*>& field_descriptors);
void ParseFunctionGenerator::GenerateDataDecls(io::Printer* printer) { … }
void ParseFunctionGenerator::GenerateDataDefinitions(io::Printer* printer) { … }
void ParseFunctionGenerator::GenerateLoopingParseFunction(Formatter& format) { … }
static NumToEntryTable MakeNumToEntryTable(
const std::vector<const FieldDescriptor*>& field_descriptors) { … }
void ParseFunctionGenerator::GenerateTailCallTable(Formatter& format) { … }
void ParseFunctionGenerator::GenerateFastFieldEntries(Formatter& format) { … }
static void FormatFieldKind(Formatter& format,
const TailCallTableInfo::FieldEntryInfo& entry,
const Options& options,
MessageSCCAnalyzer* scc_analyzer) { … }
void ParseFunctionGenerator::GenerateFieldEntries(Formatter& format) { … }
static constexpr int kMaxNameLength = …;
int ParseFunctionGenerator::CalculateFieldNamesSize() const { … }
static void FormatOctal(Formatter& format, int size) { … }
void ParseFunctionGenerator::GenerateFieldNames(Formatter& format) { … }
void ParseFunctionGenerator::GenerateArenaString(Formatter& format,
const FieldDescriptor* field) { … }
void ParseFunctionGenerator::GenerateStrings(Formatter& format,
const FieldDescriptor* field,
bool check_utf8) { … }
void ParseFunctionGenerator::GenerateLengthDelim(Formatter& format,
const FieldDescriptor* field) { … }
static bool ShouldRepeat(const FieldDescriptor* descriptor,
WireFormatLite::WireType wiretype) { … }
void ParseFunctionGenerator::GenerateFieldBody(
Formatter& format, WireFormatLite::WireType wiretype,
const FieldDescriptor* field) { … }
static uint32_t ExpectedTag(const FieldDescriptor* field,
uint32_t* fallback_tag_ptr) { … }
void ParseFunctionGenerator::GenerateParseIterationBody(
Formatter& format, const Descriptor* descriptor,
const std::vector<const FieldDescriptor*>& fields) { … }
void ParseFunctionGenerator::GenerateFieldSwitch(
Formatter& format, const std::vector<const FieldDescriptor*>& fields) { … }
namespace {
std::string FieldParseFunctionName(
const TailCallTableInfo::FieldEntryInfo& entry, const Options& options) { … }
}
}
}
}
}