类的成员函数内部声明另一个类是什么语法

sun_li3 sun_li3 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
类Message的成员函数内部声明了另一个类ReflectiveFieldParser ;
const char* Message::_InternalParse(const char* ptr,
internal::ParseContext* ctx) {
class ReflectiveFieldParser {
public:
ReflectiveFieldParser(Message* msg, internal::ParseContext* ctx)
: ReflectiveFieldParser(msg, ctx, false) {}

void AddVarint(uint32 num, uint64 value) {
if (is_item_ && num == 2) {
if (!payload_.empty()) {
auto field = Field(value, 2);
if (field && field->message_type()) {
auto child = reflection_->MutableMessage(msg_, field);
// TODO(gerbens) signal error
child->ParsePartialFromString(payload_);
} else {
MutableUnknown()->AddLengthDelimited(value)->swap(payload_);
}
return;
}
type_id_ = value;
return;
}
auto field = Field(num, 0);
if (field) {
SetField(value, field, msg_, reflection_);
} else {
MutableUnknown()->AddVarint(num, value);
}
}
void AddFixed64(uint32 num, uint64 value) {
auto field = Field(num, 1);
if (field) {
SetField(value, field, msg_, reflection_);
} else {
MutableUnknown()->AddFixed64(num, value);
}
}
const char* ParseLengthDelimited(uint32 num, const char* ptr,
internal::ParseContext* ctx) {
if (is_item_ && num == 3) {
if (type_id_ == 0) {
return InlineGreedyStringParser(&payload_, ptr, ctx);
}
num = type_id_;
type_id_ = 0;
}
auto field = Field(num, 2);
if (field) {
return ParseLenDelim(num, field, msg_, reflection_, ptr, ctx);
} else {
return InlineGreedyStringParser(
MutableUnknown()->AddLengthDelimited(num), ptr, ctx);
}
}
const char* ParseGroup(uint32 num, const char* ptr,
internal::ParseContext* ctx) {
if (!is_item_ && descriptor_->options().message_set_wire_format() &&
num == 1) {
is_item_ = true;
ptr = ctx->ParseGroup(this, ptr, num * 8 + 3);
is_item_ = false;
type_id_ = 0;
return ptr;
}
auto field = Field(num, 3);
if (field) {
auto msg = GetGroup(num, field, msg_, reflection_);
return ctx->ParseGroup(msg, ptr, num * 8 + 3);
} else {
return UnknownFieldParse(num * 8 + 3, MutableUnknown(), ptr, ctx);
}
}
void AddFixed32(uint32 num, uint32 value) {
auto field = Field(num, 5);
if (field) {
SetField(value, field, msg_, reflection_);
} else {
MutableUnknown()->AddFixed32(num, value);
}
}

const char* _InternalParse(const char* ptr, internal::ParseContext* ctx) {
// We're parsing the a MessageSetItem
GOOGLE_DCHECK(is_item_);
return internal::WireFormatParser(*this, ptr, ctx);
}

private:
Message* msg_;
const Descriptor* descriptor_;
const Reflection* reflection_;
internal::ParseContext* ctx_;
UnknownFieldSet* unknown_ = nullptr;
bool is_item_ = false;
uint32 type_id_ = 0;
std::string payload_;

ReflectiveFieldParser(Message* msg, internal::ParseContext* ctx,
bool is_item)
: msg_(msg),
descriptor_(msg->GetDescriptor()),
reflection_(msg->GetReflection()),
ctx_(ctx),
is_item_(is_item) {
GOOGLE_CHECK(descriptor_) << msg->GetTypeName();
GOOGLE_CHECK(reflection_) << msg->GetTypeName();
}

const FieldDescriptor* Field(int num, int wire_type) {
auto field = descriptor_->FindFieldByNumber(num);

// If that failed, check if the field is an extension.
if (field == nullptr && descriptor_->IsExtensionNumber(num)) {
const DescriptorPool* pool = ctx_->data().pool;
if (pool == nullptr) {
field = reflection_->FindKnownExtensionByNumber(num);
} else {
field = pool->FindExtensionByNumber(descriptor_, num);
}
}
if (field == nullptr) return nullptr;

if (internal::WireFormat::WireTypeForFieldType(field->type()) !=
wire_type) {
if (field->is_packable()) {
if (wire_type ==
internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
return field;
}
}
return nullptr;
}
return field;
}

UnknownFieldSet* MutableUnknown() {
if (unknown_) return unknown_;
return unknown_ = reflection_->MutableUnknownFields(msg_);
}
};

ReflectiveFieldParser field_parser(this, ctx);
return internal::WireFormatParser(field_parser, ptr, ctx);
}

代码是protobuf-master 里面的,src/google/protobuf/message.cc line_377---line_518,之前没见过这样的c++语法。
...全文
评论 12
收藏 已收藏
分享
返回顶部
sun_li3
C++ 语言 65,214 成员 250,514 内容