22 #include "field_codec_message_stack.h"
23 #include "dccl/field_codec.h"
25 std::vector<const google::protobuf::FieldDescriptor*> dccl::internal::MessageStack::field_;
26 std::vector<const google::protobuf::Descriptor*> dccl::internal::MessageStack::desc_;
27 std::vector<dccl::MessagePart> dccl::internal::MessageStack::parts_;
33 void dccl::internal::MessageStack::push(
const google::protobuf::Descriptor* desc)
36 desc_.push_back(desc);
37 ++descriptors_pushed_;
40 void dccl::internal::MessageStack::push(
const google::protobuf::FieldDescriptor* field)
42 field_.push_back(field);
46 void dccl::internal::MessageStack::push(MessagePart part)
48 parts_.push_back(part);
53 void dccl::internal::MessageStack::__pop_desc()
59 void dccl::internal::MessageStack::__pop_field()
65 void dccl::internal::MessageStack::__pop_parts()
72 dccl::internal::MessageStack::MessageStack(
const google::protobuf::FieldDescriptor* field)
73 : descriptors_pushed_(0),
79 if(field->cpp_type() == google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE)
81 MessagePart
part = UNKNOWN;
82 if(field->options().GetExtension(dccl::field).has_in_head())
85 part = field->options().GetExtension(dccl::field).in_head() ? HEAD : BODY;
90 part = current_part();
94 push(field->message_type());
101 dccl::internal::MessageStack::~MessageStack()
103 for(
int i = 0; i < fields_pushed_; ++i)
106 for(
int i = 0; i < descriptors_pushed_; ++i)
109 for(
int i = 0; i < parts_pushed_; ++i)