| Index: third_party/protobuf/src/google/protobuf/unknown_field_set.cc
|
| ===================================================================
|
| --- third_party/protobuf/src/google/protobuf/unknown_field_set.cc (revision 216642)
|
| +++ third_party/protobuf/src/google/protobuf/unknown_field_set.cc (working copy)
|
| @@ -32,13 +32,14 @@
|
| // Based on original Protocol Buffers design by
|
| // Sanjay Ghemawat, Jeff Dean, and others.
|
|
|
| +#include <google/protobuf/unknown_field_set.h>
|
| +
|
| #include <google/protobuf/stubs/common.h>
|
| -#include <google/protobuf/unknown_field_set.h>
|
| -#include <google/protobuf/stubs/stl_util-inl.h>
|
| #include <google/protobuf/io/coded_stream.h>
|
| #include <google/protobuf/io/zero_copy_stream.h>
|
| #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
|
| #include <google/protobuf/wire_format_lite.h>
|
| +#include <google/protobuf/stubs/stl_util.h>
|
|
|
| namespace google {
|
| namespace protobuf {
|
| @@ -75,6 +76,14 @@
|
| fields_->clear();
|
| }
|
|
|
| +void UnknownFieldSet::ClearAndFreeMemory() {
|
| + if (fields_ != NULL) {
|
| + Clear();
|
| + delete fields_;
|
| + fields_ = NULL;
|
| + }
|
| +}
|
| +
|
| void UnknownFieldSet::MergeFrom(const UnknownFieldSet& other) {
|
| for (int i = 0; i < other.field_count(); i++) {
|
| AddField(other.field(i));
|
| @@ -89,8 +98,9 @@
|
| const UnknownField& field = (*fields_)[i];
|
| switch (field.type()) {
|
| case UnknownField::TYPE_LENGTH_DELIMITED:
|
| - total_size += sizeof(*field.length_delimited_) +
|
| - internal::StringSpaceUsedExcludingSelf(*field.length_delimited_);
|
| + total_size += sizeof(*field.length_delimited_.string_value_) +
|
| + internal::StringSpaceUsedExcludingSelf(
|
| + *field.length_delimited_.string_value_);
|
| break;
|
| case UnknownField::TYPE_GROUP:
|
| total_size += field.group_->SpaceUsed();
|
| @@ -138,11 +148,12 @@
|
| UnknownField field;
|
| field.number_ = number;
|
| field.type_ = UnknownField::TYPE_LENGTH_DELIMITED;
|
| - field.length_delimited_ = new string;
|
| + field.length_delimited_.string_value_ = new string;
|
| fields_->push_back(field);
|
| - return field.length_delimited_;
|
| + return field.length_delimited_.string_value_;
|
| }
|
|
|
| +
|
| UnknownFieldSet* UnknownFieldSet::AddGroup(int number) {
|
| if (fields_ == NULL) fields_ = new vector<UnknownField>;
|
| UnknownField field;
|
| @@ -159,6 +170,39 @@
|
| fields_->back().DeepCopy();
|
| }
|
|
|
| +void UnknownFieldSet::DeleteSubrange(int start, int num) {
|
| + GOOGLE_DCHECK(fields_ != NULL);
|
| + // Delete the specified fields.
|
| + for (int i = 0; i < num; ++i) {
|
| + (*fields_)[i + start].Delete();
|
| + }
|
| + // Slide down the remaining fields.
|
| + for (int i = start + num; i < fields_->size(); ++i) {
|
| + (*fields_)[i - num] = (*fields_)[i];
|
| + }
|
| + // Pop off the # of deleted fields.
|
| + for (int i = 0; i < num; ++i) {
|
| + fields_->pop_back();
|
| + }
|
| +}
|
| +
|
| +void UnknownFieldSet::DeleteByNumber(int number) {
|
| + if (fields_ == NULL) return;
|
| + int left = 0; // The number of fields left after deletion.
|
| + for (int i = 0; i < fields_->size(); ++i) {
|
| + UnknownField* field = &(*fields_)[i];
|
| + if (field->number() == number) {
|
| + field->Delete();
|
| + } else {
|
| + if (i != left) {
|
| + (*fields_)[left] = (*fields_)[i];
|
| + }
|
| + ++left;
|
| + }
|
| + }
|
| + fields_->resize(left);
|
| +}
|
| +
|
| bool UnknownFieldSet::MergeFromCodedStream(io::CodedInputStream* input) {
|
|
|
| UnknownFieldSet other;
|
| @@ -190,7 +234,7 @@
|
| void UnknownField::Delete() {
|
| switch (type()) {
|
| case UnknownField::TYPE_LENGTH_DELIMITED:
|
| - delete length_delimited_;
|
| + delete length_delimited_.string_value_;
|
| break;
|
| case UnknownField::TYPE_GROUP:
|
| delete group_;
|
| @@ -203,7 +247,8 @@
|
| void UnknownField::DeepCopy() {
|
| switch (type()) {
|
| case UnknownField::TYPE_LENGTH_DELIMITED:
|
| - length_delimited_ = new string(*length_delimited_);
|
| + length_delimited_.string_value_ = new string(
|
| + *length_delimited_.string_value_);
|
| break;
|
| case UnknownField::TYPE_GROUP: {
|
| UnknownFieldSet* group = new UnknownFieldSet;
|
| @@ -216,5 +261,22 @@
|
| }
|
| }
|
|
|
| +
|
| +void UnknownField::SerializeLengthDelimitedNoTag(
|
| + io::CodedOutputStream* output) const {
|
| + GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type_);
|
| + const string& data = *length_delimited_.string_value_;
|
| + output->WriteVarint32(data.size());
|
| + output->WriteString(data);
|
| +}
|
| +
|
| +uint8* UnknownField::SerializeLengthDelimitedNoTagToArray(uint8* target) const {
|
| + GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type_);
|
| + const string& data = *length_delimited_.string_value_;
|
| + target = io::CodedOutputStream::WriteVarint32ToArray(data.size(), target);
|
| + target = io::CodedOutputStream::WriteStringToArray(data, target);
|
| + return target;
|
| +}
|
| +
|
| } // namespace protobuf
|
| } // namespace google
|
|
|