67 #include <unordered_map>
88 using internal::DynamicMapField;
89 using internal::ExtensionSet;
90 using internal::InternalMetadataWithArena;
91 using internal::MapField;
94 using internal::ArenaStringPtr;
108 case FD::CPPTYPE_INT32:
110 case FD::CPPTYPE_INT64:
112 case FD::CPPTYPE_UINT32:
114 case FD::CPPTYPE_UINT64:
116 case FD::CPPTYPE_DOUBLE:
118 case FD::CPPTYPE_FLOAT:
120 case FD::CPPTYPE_BOOL:
122 case FD::CPPTYPE_ENUM:
124 case FD::CPPTYPE_MESSAGE:
125 if (IsMapFieldInApi(
field)) {
126 return sizeof(DynamicMapField);
128 return sizeof(RepeatedPtrField<Message>);
131 case FD::CPPTYPE_STRING:
135 return sizeof(RepeatedPtrField<std::string>);
141 case FD::CPPTYPE_INT32:
142 return sizeof(
int32);
143 case FD::CPPTYPE_INT64:
144 return sizeof(
int64);
145 case FD::CPPTYPE_UINT32:
147 case FD::CPPTYPE_UINT64:
149 case FD::CPPTYPE_DOUBLE:
150 return sizeof(double);
151 case FD::CPPTYPE_FLOAT:
152 return sizeof(float);
153 case FD::CPPTYPE_BOOL:
155 case FD::CPPTYPE_ENUM:
158 case FD::CPPTYPE_MESSAGE:
159 return sizeof(Message*);
161 case FD::CPPTYPE_STRING:
165 return sizeof(ArenaStringPtr);
180 case FD::CPPTYPE_INT32:
181 return sizeof(
int32);
182 case FD::CPPTYPE_INT64:
183 return sizeof(
int64);
184 case FD::CPPTYPE_UINT32:
186 case FD::CPPTYPE_UINT64:
188 case FD::CPPTYPE_DOUBLE:
189 return sizeof(double);
190 case FD::CPPTYPE_FLOAT:
191 return sizeof(float);
192 case FD::CPPTYPE_BOOL:
194 case FD::CPPTYPE_ENUM:
197 case FD::CPPTYPE_MESSAGE:
198 return sizeof(Message*);
200 case FD::CPPTYPE_STRING:
204 return sizeof(ArenaStringPtr);
213 inline int DivideRoundingUp(
int i,
int j) {
return (
i + (j - 1)) / j; }
215 static const int kSafeAlignment =
sizeof(
uint64);
216 static const int kMaxOneofUnionSize =
sizeof(
uint64);
218 inline int AlignTo(
int offset,
int alignment) {
219 return DivideRoundingUp(
offset, alignment) * alignment;
224 inline int AlignOffset(
int offset) {
return AlignTo(
offset, kSafeAlignment); }
226 #define bitsizeof(T) (sizeof(T) * 8)
290 static void operator delete(
void* ptr) { ::operator
delete(ptr); }
309 return reinterpret_cast<const uint8*
>(
this) +
offset;
319 : type_info_(type_info),
arena_(
NULL), cached_byte_size_(0) {
324 : type_info_(type_info),
arena_(arena), cached_byte_size_(0) {
329 : type_info_(type_info),
arena_(
NULL), cached_byte_size_(0) {
366 if (
field->containing_oneof()) {
369 switch (
field->cpp_type()) {
370 #define HANDLE_TYPE(CPPTYPE, TYPE) \
371 case FieldDescriptor::CPPTYPE_##CPPTYPE: \
372 if (!field->is_repeated()) { \
373 new (field_ptr) TYPE(field->default_value_##TYPE()); \
375 new (field_ptr) RepeatedField<TYPE>(arena_); \
389 if (!
field->is_repeated()) {
390 new (field_ptr)
int(
field->default_value_enum()->number());
397 switch (
field->options().ctype()) {
400 if (!
field->is_repeated()) {
420 if (!
field->is_repeated()) {
423 if (IsMapFieldInApi(
field)) {
440 field->message_type()),
445 field->message_type()));
481 if (
field->containing_oneof()) {
484 sizeof(
uint32) *
field->containing_oneof()->index());
485 if (*(
reinterpret_cast<const uint32*
>(field_ptr)) ==
field->number()) {
488 field->containing_oneof()->index()]);
490 switch (
field->options().ctype()) {
504 delete *
reinterpret_cast<Message**
>(field_ptr);
511 if (
field->is_repeated()) {
512 switch (
field->cpp_type()) {
513 #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \
514 case FieldDescriptor::CPPTYPE_##UPPERCASE: \
515 reinterpret_cast<RepeatedField<LOWERCASE>*>(field_ptr) \
516 ->~RepeatedField<LOWERCASE>(); \
530 switch (
field->options().ctype()) {
540 if (IsMapFieldInApi(
field)) {
550 switch (
field->options().ctype()) {
586 !
field->is_repeated()) {
591 *
reinterpret_cast<const Message**
>(field_ptr) =
601 void* new_base = Arena::CreateArray<char>(arena,
type_info_->
size);
629 typedef std::unordered_map<const Descriptor*, const DynamicMessage::TypeInfo*>
636 delegate_to_generated_factory_(
false),
641 delegate_to_generated_factory_(
false),
645 for (PrototypeMap::Map::iterator iter =
prototypes_->map_.begin();
648 iter->second->prototype);
668 return (*target)->prototype;
688 type_info->
offsets.reset(offsets);
701 int has_bits_array_size =
707 for (
int i = 0;
i <
type->field_count();
i++) {
708 has_bits_indices[
i] =
i;
714 if (
type->oneof_decl_count() > 0) {
721 if (
type->extension_range_count() > 0) {
733 int num_weak_fields = 0;
734 for (
int i = 0;
i <
type->field_count();
i++) {
737 if (!
type->field(
i)->containing_oneof()) {
738 int field_size = FieldSpaceUsed(
type->field(
i));
739 size = AlignTo(
size, std::min(kSafeAlignment, field_size));
746 for (
int i = 0;
i <
type->oneof_decl_count();
i++) {
747 size = AlignTo(
size, kSafeAlignment);
749 size += kMaxOneofUnionSize;
765 if (
type->oneof_decl_count() > 0) {
768 for (
int i = 0;
i <
type->oneof_decl_count();
i++) {
769 for (
int j = 0; j <
type->oneof_decl(
i)->field_count(); j++) {
771 int field_size = OneofFieldSpaceUsed(
field);
772 size = AlignTo(
size, std::min(kSafeAlignment, field_size));
787 if (
type->oneof_decl_count() > 0 || num_weak_fields > 0) {
814 void* default_oneof_or_weak_instance) {
815 for (
int i = 0;
i <
type->oneof_decl_count();
i++) {
816 for (
int j = 0; j <
type->oneof_decl(
i)->field_count(); j++) {
819 reinterpret_cast<uint8*
>(default_oneof_or_weak_instance) +
820 offsets[
field->index()];
821 switch (
field->cpp_type()) {
822 #define HANDLE_TYPE(CPPTYPE, TYPE) \
823 case FieldDescriptor::CPPTYPE_##CPPTYPE: \
824 new (field_ptr) TYPE(field->default_value_##TYPE()); \
837 new (field_ptr)
int(
field->default_value_enum()->number());
840 switch (
field->options().ctype()) {
860 const void* default_oneof_instance) {
861 for (
int i = 0;
i <
type->oneof_decl_count();
i++) {
862 for (
int j = 0; j <
type->oneof_decl(
i)->field_count(); j++) {
865 switch (
field->options().ctype()) {