OLD | NEW |
1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
3 // https://developers.google.com/protocol-buffers/ | 3 // https://developers.google.com/protocol-buffers/ |
4 // | 4 // |
5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
7 // met: | 7 // met: |
8 // | 8 // |
9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 | 300 |
301 // End group. | 301 // End group. |
302 target = io::CodedOutputStream::WriteTagToArray( | 302 target = io::CodedOutputStream::WriteTagToArray( |
303 WireFormatLite::kMessageSetItemEndTag, target); | 303 WireFormatLite::kMessageSetItemEndTag, target); |
304 } | 304 } |
305 } | 305 } |
306 | 306 |
307 return target; | 307 return target; |
308 } | 308 } |
309 | 309 |
310 int WireFormat::ComputeUnknownFieldsSize( | 310 size_t WireFormat::ComputeUnknownFieldsSize( |
311 const UnknownFieldSet& unknown_fields) { | 311 const UnknownFieldSet& unknown_fields) { |
312 int size = 0; | 312 size_t size = 0; |
313 for (int i = 0; i < unknown_fields.field_count(); i++) { | 313 for (int i = 0; i < unknown_fields.field_count(); i++) { |
314 const UnknownField& field = unknown_fields.field(i); | 314 const UnknownField& field = unknown_fields.field(i); |
315 | 315 |
316 switch (field.type()) { | 316 switch (field.type()) { |
317 case UnknownField::TYPE_VARINT: | 317 case UnknownField::TYPE_VARINT: |
318 size += io::CodedOutputStream::VarintSize32( | 318 size += io::CodedOutputStream::VarintSize32( |
319 WireFormatLite::MakeTag(field.number(), | 319 WireFormatLite::MakeTag(field.number(), |
320 WireFormatLite::WIRETYPE_VARINT)); | 320 WireFormatLite::WIRETYPE_VARINT)); |
321 size += io::CodedOutputStream::VarintSize64(field.varint()); | 321 size += io::CodedOutputStream::VarintSize64(field.varint()); |
322 break; | 322 break; |
(...skipping 25 matching lines...) Expand all Loading... |
348 size += io::CodedOutputStream::VarintSize32( | 348 size += io::CodedOutputStream::VarintSize32( |
349 WireFormatLite::MakeTag(field.number(), | 349 WireFormatLite::MakeTag(field.number(), |
350 WireFormatLite::WIRETYPE_END_GROUP)); | 350 WireFormatLite::WIRETYPE_END_GROUP)); |
351 break; | 351 break; |
352 } | 352 } |
353 } | 353 } |
354 | 354 |
355 return size; | 355 return size; |
356 } | 356 } |
357 | 357 |
358 int WireFormat::ComputeUnknownMessageSetItemsSize( | 358 size_t WireFormat::ComputeUnknownMessageSetItemsSize( |
359 const UnknownFieldSet& unknown_fields) { | 359 const UnknownFieldSet& unknown_fields) { |
360 int size = 0; | 360 size_t size = 0; |
361 for (int i = 0; i < unknown_fields.field_count(); i++) { | 361 for (int i = 0; i < unknown_fields.field_count(); i++) { |
362 const UnknownField& field = unknown_fields.field(i); | 362 const UnknownField& field = unknown_fields.field(i); |
363 | 363 |
364 // The only unknown fields that are allowed to exist in a MessageSet are | 364 // The only unknown fields that are allowed to exist in a MessageSet are |
365 // messages, which are length-delimited. | 365 // messages, which are length-delimited. |
366 if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) { | 366 if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) { |
367 size += WireFormatLite::kMessageSetItemTagsSize; | 367 size += WireFormatLite::kMessageSetItemTagsSize; |
368 size += io::CodedOutputStream::VarintSize32(field.number()); | 368 size += io::CodedOutputStream::VarintSize32(field.number()); |
369 | 369 |
370 int field_size = field.GetLengthDelimitedSize(); | 370 int field_size = field.GetLengthDelimitedSize(); |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
785 | 785 |
786 // =================================================================== | 786 // =================================================================== |
787 | 787 |
788 void WireFormat::SerializeWithCachedSizes( | 788 void WireFormat::SerializeWithCachedSizes( |
789 const Message& message, | 789 const Message& message, |
790 int size, io::CodedOutputStream* output) { | 790 int size, io::CodedOutputStream* output) { |
791 const Descriptor* descriptor = message.GetDescriptor(); | 791 const Descriptor* descriptor = message.GetDescriptor(); |
792 const Reflection* message_reflection = message.GetReflection(); | 792 const Reflection* message_reflection = message.GetReflection(); |
793 int expected_endpoint = output->ByteCount() + size; | 793 int expected_endpoint = output->ByteCount() + size; |
794 | 794 |
795 vector<const FieldDescriptor*> fields; | 795 std::vector<const FieldDescriptor*> fields; |
796 message_reflection->ListFields(message, &fields); | 796 message_reflection->ListFields(message, &fields); |
797 for (int i = 0; i < fields.size(); i++) { | 797 for (int i = 0; i < fields.size(); i++) { |
798 SerializeFieldWithCachedSizes(fields[i], message, output); | 798 SerializeFieldWithCachedSizes(fields[i], message, output); |
799 } | 799 } |
800 | 800 |
801 if (descriptor->options().message_set_wire_format()) { | 801 if (descriptor->options().message_set_wire_format()) { |
802 SerializeUnknownMessageSetItems( | 802 SerializeUnknownMessageSetItems( |
803 message_reflection->GetUnknownFields(message), output); | 803 message_reflection->GetUnknownFields(message), output); |
804 } else { | 804 } else { |
805 SerializeUnknownFields( | 805 SerializeUnknownFields( |
(...skipping 25 matching lines...) Expand all Loading... |
831 if (field->is_repeated()) { | 831 if (field->is_repeated()) { |
832 count = message_reflection->FieldSize(message, field); | 832 count = message_reflection->FieldSize(message, field); |
833 } else if (message_reflection->HasField(message, field)) { | 833 } else if (message_reflection->HasField(message, field)) { |
834 count = 1; | 834 count = 1; |
835 } | 835 } |
836 | 836 |
837 const bool is_packed = field->is_packed(); | 837 const bool is_packed = field->is_packed(); |
838 if (is_packed && count > 0) { | 838 if (is_packed && count > 0) { |
839 WireFormatLite::WriteTag(field->number(), | 839 WireFormatLite::WriteTag(field->number(), |
840 WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); | 840 WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); |
841 const int data_size = FieldDataOnlyByteSize(field, message); | 841 const size_t data_size = FieldDataOnlyByteSize(field, message); |
842 output->WriteVarint32(data_size); | 842 output->WriteVarint32(data_size); |
843 } | 843 } |
844 | 844 |
845 for (int j = 0; j < count; j++) { | 845 for (int j = 0; j < count; j++) { |
846 switch (field->type()) { | 846 switch (field->type()) { |
847 #define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD) \ | 847 #define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD) \ |
848 case FieldDescriptor::TYPE_##TYPE: { \ | 848 case FieldDescriptor::TYPE_##TYPE: { \ |
849 const CPPTYPE value = field->is_repeated() ? \ | 849 const CPPTYPE value = field->is_repeated() ? \ |
850 message_reflection->GetRepeated##CPPTYPE_METHOD( \ | 850 message_reflection->GetRepeated##CPPTYPE_METHOD( \ |
851 message, field, j) : \ | 851 message, field, j) : \ |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
957 const Message& sub_message = message_reflection->GetMessage(message, field); | 957 const Message& sub_message = message_reflection->GetMessage(message, field); |
958 output->WriteVarint32(sub_message.GetCachedSize()); | 958 output->WriteVarint32(sub_message.GetCachedSize()); |
959 sub_message.SerializeWithCachedSizes(output); | 959 sub_message.SerializeWithCachedSizes(output); |
960 | 960 |
961 // End group. | 961 // End group. |
962 output->WriteVarint32(WireFormatLite::kMessageSetItemEndTag); | 962 output->WriteVarint32(WireFormatLite::kMessageSetItemEndTag); |
963 } | 963 } |
964 | 964 |
965 // =================================================================== | 965 // =================================================================== |
966 | 966 |
967 int WireFormat::ByteSize(const Message& message) { | 967 size_t WireFormat::ByteSize(const Message& message) { |
968 const Descriptor* descriptor = message.GetDescriptor(); | 968 const Descriptor* descriptor = message.GetDescriptor(); |
969 const Reflection* message_reflection = message.GetReflection(); | 969 const Reflection* message_reflection = message.GetReflection(); |
970 | 970 |
971 int our_size = 0; | 971 size_t our_size = 0; |
972 | 972 |
973 vector<const FieldDescriptor*> fields; | 973 std::vector<const FieldDescriptor*> fields; |
974 message_reflection->ListFields(message, &fields); | 974 message_reflection->ListFields(message, &fields); |
975 for (int i = 0; i < fields.size(); i++) { | 975 for (int i = 0; i < fields.size(); i++) { |
976 our_size += FieldByteSize(fields[i], message); | 976 our_size += FieldByteSize(fields[i], message); |
977 } | 977 } |
978 | 978 |
979 if (descriptor->options().message_set_wire_format()) { | 979 if (descriptor->options().message_set_wire_format()) { |
980 our_size += ComputeUnknownMessageSetItemsSize( | 980 our_size += ComputeUnknownMessageSetItemsSize( |
981 message_reflection->GetUnknownFields(message)); | 981 message_reflection->GetUnknownFields(message)); |
982 } else { | 982 } else { |
983 our_size += ComputeUnknownFieldsSize( | 983 our_size += ComputeUnknownFieldsSize( |
984 message_reflection->GetUnknownFields(message)); | 984 message_reflection->GetUnknownFields(message)); |
985 } | 985 } |
986 | 986 |
987 return our_size; | 987 return our_size; |
988 } | 988 } |
989 | 989 |
990 int WireFormat::FieldByteSize( | 990 size_t WireFormat::FieldByteSize( |
991 const FieldDescriptor* field, | 991 const FieldDescriptor* field, |
992 const Message& message) { | 992 const Message& message) { |
993 const Reflection* message_reflection = message.GetReflection(); | 993 const Reflection* message_reflection = message.GetReflection(); |
994 | 994 |
995 if (field->is_extension() && | 995 if (field->is_extension() && |
996 field->containing_type()->options().message_set_wire_format() && | 996 field->containing_type()->options().message_set_wire_format() && |
997 field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && | 997 field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && |
998 !field->is_repeated()) { | 998 !field->is_repeated()) { |
999 return MessageSetItemByteSize(field, message); | 999 return MessageSetItemByteSize(field, message); |
1000 } | 1000 } |
1001 | 1001 |
1002 int count = 0; | 1002 size_t count = 0; |
1003 if (field->is_repeated()) { | 1003 if (field->is_repeated()) { |
1004 count = message_reflection->FieldSize(message, field); | 1004 count = FromIntSize(message_reflection->FieldSize(message, field)); |
1005 } else if (message_reflection->HasField(message, field)) { | 1005 } else if (message_reflection->HasField(message, field)) { |
1006 count = 1; | 1006 count = 1; |
1007 } | 1007 } |
1008 | 1008 |
1009 const int data_size = FieldDataOnlyByteSize(field, message); | 1009 const size_t data_size = FieldDataOnlyByteSize(field, message); |
1010 int our_size = data_size; | 1010 size_t our_size = data_size; |
1011 if (field->is_packed()) { | 1011 if (field->is_packed()) { |
1012 if (data_size > 0) { | 1012 if (data_size > 0) { |
1013 // Packed fields get serialized like a string, not their native type. | 1013 // Packed fields get serialized like a string, not their native type. |
1014 // Technically this doesn't really matter; the size only changes if it's | 1014 // Technically this doesn't really matter; the size only changes if it's |
1015 // a GROUP | 1015 // a GROUP |
1016 our_size += TagSize(field->number(), FieldDescriptor::TYPE_STRING); | 1016 our_size += TagSize(field->number(), FieldDescriptor::TYPE_STRING); |
1017 our_size += io::CodedOutputStream::VarintSize32(data_size); | 1017 our_size += io::CodedOutputStream::VarintSize32(data_size); |
1018 } | 1018 } |
1019 } else { | 1019 } else { |
1020 our_size += count * TagSize(field->number(), field->type()); | 1020 our_size += count * TagSize(field->number(), field->type()); |
1021 } | 1021 } |
1022 return our_size; | 1022 return our_size; |
1023 } | 1023 } |
1024 | 1024 |
1025 int WireFormat::FieldDataOnlyByteSize( | 1025 size_t WireFormat::FieldDataOnlyByteSize( |
1026 const FieldDescriptor* field, | 1026 const FieldDescriptor* field, |
1027 const Message& message) { | 1027 const Message& message) { |
1028 const Reflection* message_reflection = message.GetReflection(); | 1028 const Reflection* message_reflection = message.GetReflection(); |
1029 | 1029 |
1030 int count = 0; | 1030 size_t count = 0; |
1031 if (field->is_repeated()) { | 1031 if (field->is_repeated()) { |
1032 count = message_reflection->FieldSize(message, field); | 1032 count = |
| 1033 internal::FromIntSize(message_reflection->FieldSize(message, field)); |
1033 } else if (message_reflection->HasField(message, field)) { | 1034 } else if (message_reflection->HasField(message, field)) { |
1034 count = 1; | 1035 count = 1; |
1035 } | 1036 } |
1036 | 1037 |
1037 int data_size = 0; | 1038 size_t data_size = 0; |
1038 switch (field->type()) { | 1039 switch (field->type()) { |
1039 #define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD) \ | 1040 #define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD) \ |
1040 case FieldDescriptor::TYPE_##TYPE: \ | 1041 case FieldDescriptor::TYPE_##TYPE: \ |
1041 if (field->is_repeated()) { \ | 1042 if (field->is_repeated()) { \ |
1042 for (int j = 0; j < count; j++) { \ | 1043 for (int j = 0; j < count; j++) { \ |
1043 data_size += WireFormatLite::TYPE_METHOD##Size( \ | 1044 data_size += WireFormatLite::TYPE_METHOD##Size( \ |
1044 message_reflection->GetRepeated##CPPTYPE_METHOD( \ | 1045 message_reflection->GetRepeated##CPPTYPE_METHOD( \ |
1045 message, field, j)); \ | 1046 message, field, j)); \ |
1046 } \ | 1047 } \ |
1047 } else { \ | 1048 } else { \ |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1101 message, field, j, &scratch) : | 1102 message, field, j, &scratch) : |
1102 message_reflection->GetStringReference(message, field, &scratch); | 1103 message_reflection->GetStringReference(message, field, &scratch); |
1103 data_size += WireFormatLite::StringSize(value); | 1104 data_size += WireFormatLite::StringSize(value); |
1104 } | 1105 } |
1105 break; | 1106 break; |
1106 } | 1107 } |
1107 } | 1108 } |
1108 return data_size; | 1109 return data_size; |
1109 } | 1110 } |
1110 | 1111 |
1111 int WireFormat::MessageSetItemByteSize( | 1112 size_t WireFormat::MessageSetItemByteSize( |
1112 const FieldDescriptor* field, | 1113 const FieldDescriptor* field, |
1113 const Message& message) { | 1114 const Message& message) { |
1114 const Reflection* message_reflection = message.GetReflection(); | 1115 const Reflection* message_reflection = message.GetReflection(); |
1115 | 1116 |
1116 int our_size = WireFormatLite::kMessageSetItemTagsSize; | 1117 size_t our_size = WireFormatLite::kMessageSetItemTagsSize; |
1117 | 1118 |
1118 // type_id | 1119 // type_id |
1119 our_size += io::CodedOutputStream::VarintSize32(field->number()); | 1120 our_size += io::CodedOutputStream::VarintSize32(field->number()); |
1120 | 1121 |
1121 // message | 1122 // message |
1122 const Message& sub_message = message_reflection->GetMessage(message, field); | 1123 const Message& sub_message = message_reflection->GetMessage(message, field); |
1123 int message_size = sub_message.ByteSize(); | 1124 size_t message_size = sub_message.ByteSizeLong(); |
1124 | 1125 |
1125 our_size += io::CodedOutputStream::VarintSize32(message_size); | 1126 our_size += io::CodedOutputStream::VarintSize32(message_size); |
1126 our_size += message_size; | 1127 our_size += message_size; |
1127 | 1128 |
1128 return our_size; | 1129 return our_size; |
1129 } | 1130 } |
1130 | 1131 |
1131 } // namespace internal | 1132 } // namespace internal |
1132 } // namespace protobuf | 1133 } // namespace protobuf |
1133 } // namespace google | 1134 } // namespace google |
OLD | NEW |