Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Side by Side Diff: third_party/protobuf/src/google/protobuf/unknown_field_set.cc

Issue 2599263002: third_party/protobuf: Update to HEAD (f52e188fe4) (Closed)
Patch Set: Address comments Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 21 matching lines...) Expand all
32 // Based on original Protocol Buffers design by 32 // Based on original Protocol Buffers design by
33 // Sanjay Ghemawat, Jeff Dean, and others. 33 // Sanjay Ghemawat, Jeff Dean, and others.
34 34
35 #include <google/protobuf/unknown_field_set.h> 35 #include <google/protobuf/unknown_field_set.h>
36 36
37 #include <google/protobuf/stubs/logging.h> 37 #include <google/protobuf/stubs/logging.h>
38 #include <google/protobuf/stubs/common.h> 38 #include <google/protobuf/stubs/common.h>
39 #include <google/protobuf/io/coded_stream.h> 39 #include <google/protobuf/io/coded_stream.h>
40 #include <google/protobuf/io/zero_copy_stream.h> 40 #include <google/protobuf/io/zero_copy_stream.h>
41 #include <google/protobuf/io/zero_copy_stream_impl.h> 41 #include <google/protobuf/io/zero_copy_stream_impl.h>
42 #include <google/protobuf/metadata.h>
42 #include <google/protobuf/wire_format.h> 43 #include <google/protobuf/wire_format.h>
43 #include <google/protobuf/stubs/stl_util.h> 44 #include <google/protobuf/stubs/stl_util.h>
44 45
45 namespace google { 46 namespace google {
46 namespace protobuf { 47 namespace protobuf {
47 48
48 namespace { 49 namespace {
49 // This global instance is returned by unknown_fields() on any message class 50 // This global instance is returned by unknown_fields() on any message class
50 // when the object has no unknown fields. This is necessary because we now 51 // when the object has no unknown fields. This is necessary because we now
51 // instantiate the UnknownFieldSet dynamically only when required. 52 // instantiate the UnknownFieldSet dynamically only when required.
(...skipping 10 matching lines...) Expand all
62 63
63 GOOGLE_PROTOBUF_DECLARE_ONCE(default_unknown_field_set_once_init_); 64 GOOGLE_PROTOBUF_DECLARE_ONCE(default_unknown_field_set_once_init_);
64 } 65 }
65 66
66 const UnknownFieldSet* UnknownFieldSet::default_instance() { 67 const UnknownFieldSet* UnknownFieldSet::default_instance() {
67 ::google::protobuf::GoogleOnceInit(&default_unknown_field_set_once_init_, 68 ::google::protobuf::GoogleOnceInit(&default_unknown_field_set_once_init_,
68 &InitDefaultUnknownFieldSet); 69 &InitDefaultUnknownFieldSet);
69 return default_unknown_field_set_instance_; 70 return default_unknown_field_set_instance_;
70 } 71 }
71 72
72 UnknownFieldSet::UnknownFieldSet() 73 void UnknownFieldSet::ClearFallback() {
73 : fields_(NULL) {} 74 GOOGLE_DCHECK(fields_ != NULL && fields_->size() > 0);
74 75 int n = fields_->size();
75 UnknownFieldSet::~UnknownFieldSet() { 76 do {
76 Clear(); 77 (*fields_)[--n].Delete();
78 } while (n > 0);
77 delete fields_; 79 delete fields_;
78 } 80 fields_ = NULL;
79
80 void UnknownFieldSet::ClearFallback() {
81 if (fields_ != NULL) {
82 for (int i = 0; i < fields_->size(); i++) {
83 (*fields_)[i].Delete();
84 }
85 delete fields_;
86 fields_ = NULL;
87 }
88 }
89
90 void UnknownFieldSet::ClearAndFreeMemory() {
91 if (fields_ != NULL) {
92 Clear();
93 }
94 } 81 }
95 82
96 void UnknownFieldSet::InternalMergeFrom(const UnknownFieldSet& other) { 83 void UnknownFieldSet::InternalMergeFrom(const UnknownFieldSet& other) {
97 int other_field_count = other.field_count(); 84 int other_field_count = other.field_count();
98 if (other_field_count > 0) { 85 if (other_field_count > 0) {
99 fields_ = new vector<UnknownField>(); 86 fields_ = new std::vector<UnknownField>();
100 for (int i = 0; i < other_field_count; i++) { 87 for (int i = 0; i < other_field_count; i++) {
101 fields_->push_back((*other.fields_)[i]); 88 fields_->push_back((*other.fields_)[i]);
102 fields_->back().DeepCopy((*other.fields_)[i]); 89 fields_->back().DeepCopy((*other.fields_)[i]);
103 } 90 }
104 } 91 }
105 } 92 }
106 93
107 void UnknownFieldSet::MergeFrom(const UnknownFieldSet& other) { 94 void UnknownFieldSet::MergeFrom(const UnknownFieldSet& other) {
108 int other_field_count = other.field_count(); 95 int other_field_count = other.field_count();
109 if (other_field_count > 0) { 96 if (other_field_count > 0) {
110 if (fields_ == NULL) fields_ = new vector<UnknownField>(); 97 if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
111 for (int i = 0; i < other_field_count; i++) { 98 for (int i = 0; i < other_field_count; i++) {
112 fields_->push_back((*other.fields_)[i]); 99 fields_->push_back((*other.fields_)[i]);
113 fields_->back().DeepCopy((*other.fields_)[i]); 100 fields_->back().DeepCopy((*other.fields_)[i]);
114 } 101 }
115 } 102 }
116 } 103 }
117 104
118 // A specialized MergeFrom for performance when we are merging from an UFS that 105 // A specialized MergeFrom for performance when we are merging from an UFS that
119 // is temporary and can be destroyed in the process. 106 // is temporary and can be destroyed in the process.
120 void UnknownFieldSet::MergeFromAndDestroy(UnknownFieldSet* other) { 107 void UnknownFieldSet::MergeFromAndDestroy(UnknownFieldSet* other) {
121 int other_field_count = other->field_count(); 108 int other_field_count = other->field_count();
122 if (other_field_count > 0) { 109 if (other_field_count > 0) {
123 if (fields_ == NULL) fields_ = new vector<UnknownField>(); 110 if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
124 for (int i = 0; i < other_field_count; i++) { 111 for (int i = 0; i < other_field_count; i++) {
125 fields_->push_back((*other->fields_)[i]); 112 fields_->push_back((*other->fields_)[i]);
126 (*other->fields_)[i].Reset(); 113 (*other->fields_)[i].Reset();
127 } 114 }
128 } 115 }
129 delete other->fields_; 116 delete other->fields_;
130 other->fields_ = NULL; 117 other->fields_ = NULL;
131 } 118 }
132 119
120 void UnknownFieldSet::MergeToInternalMetdata(
121 const UnknownFieldSet& other,
122 internal::InternalMetadataWithArena* metadata) {
123 metadata->mutable_unknown_fields()->MergeFrom(other);
124 }
125
133 int UnknownFieldSet::SpaceUsedExcludingSelf() const { 126 int UnknownFieldSet::SpaceUsedExcludingSelf() const {
134 if (fields_ == NULL) return 0; 127 if (fields_ == NULL) return 0;
135 128
136 int total_size = sizeof(*fields_) + sizeof(UnknownField) * fields_->size(); 129 int total_size = sizeof(*fields_) + sizeof(UnknownField) * fields_->size();
137 130
138 for (int i = 0; i < fields_->size(); i++) { 131 for (int i = 0; i < fields_->size(); i++) {
139 const UnknownField& field = (*fields_)[i]; 132 const UnknownField& field = (*fields_)[i];
140 switch (field.type()) { 133 switch (field.type()) {
141 case UnknownField::TYPE_LENGTH_DELIMITED: 134 case UnknownField::TYPE_LENGTH_DELIMITED:
142 total_size += sizeof(*field.length_delimited_.string_value_) + 135 total_size += sizeof(*field.length_delimited_.string_value_) +
(...skipping 12 matching lines...) Expand all
155 148
156 int UnknownFieldSet::SpaceUsed() const { 149 int UnknownFieldSet::SpaceUsed() const {
157 return sizeof(*this) + SpaceUsedExcludingSelf(); 150 return sizeof(*this) + SpaceUsedExcludingSelf();
158 } 151 }
159 152
160 void UnknownFieldSet::AddVarint(int number, uint64 value) { 153 void UnknownFieldSet::AddVarint(int number, uint64 value) {
161 UnknownField field; 154 UnknownField field;
162 field.number_ = number; 155 field.number_ = number;
163 field.SetType(UnknownField::TYPE_VARINT); 156 field.SetType(UnknownField::TYPE_VARINT);
164 field.varint_ = value; 157 field.varint_ = value;
165 if (fields_ == NULL) fields_ = new vector<UnknownField>(); 158 if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
166 fields_->push_back(field); 159 fields_->push_back(field);
167 } 160 }
168 161
169 void UnknownFieldSet::AddFixed32(int number, uint32 value) { 162 void UnknownFieldSet::AddFixed32(int number, uint32 value) {
170 UnknownField field; 163 UnknownField field;
171 field.number_ = number; 164 field.number_ = number;
172 field.SetType(UnknownField::TYPE_FIXED32); 165 field.SetType(UnknownField::TYPE_FIXED32);
173 field.fixed32_ = value; 166 field.fixed32_ = value;
174 if (fields_ == NULL) fields_ = new vector<UnknownField>(); 167 if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
175 fields_->push_back(field); 168 fields_->push_back(field);
176 } 169 }
177 170
178 void UnknownFieldSet::AddFixed64(int number, uint64 value) { 171 void UnknownFieldSet::AddFixed64(int number, uint64 value) {
179 UnknownField field; 172 UnknownField field;
180 field.number_ = number; 173 field.number_ = number;
181 field.SetType(UnknownField::TYPE_FIXED64); 174 field.SetType(UnknownField::TYPE_FIXED64);
182 field.fixed64_ = value; 175 field.fixed64_ = value;
183 if (fields_ == NULL) fields_ = new vector<UnknownField>(); 176 if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
184 fields_->push_back(field); 177 fields_->push_back(field);
185 } 178 }
186 179
187 string* UnknownFieldSet::AddLengthDelimited(int number) { 180 string* UnknownFieldSet::AddLengthDelimited(int number) {
188 UnknownField field; 181 UnknownField field;
189 field.number_ = number; 182 field.number_ = number;
190 field.SetType(UnknownField::TYPE_LENGTH_DELIMITED); 183 field.SetType(UnknownField::TYPE_LENGTH_DELIMITED);
191 field.length_delimited_.string_value_ = new string; 184 field.length_delimited_.string_value_ = new string;
192 if (fields_ == NULL) fields_ = new vector<UnknownField>(); 185 if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
193 fields_->push_back(field); 186 fields_->push_back(field);
194 return field.length_delimited_.string_value_; 187 return field.length_delimited_.string_value_;
195 } 188 }
196 189
197 190
198 UnknownFieldSet* UnknownFieldSet::AddGroup(int number) { 191 UnknownFieldSet* UnknownFieldSet::AddGroup(int number) {
199 UnknownField field; 192 UnknownField field;
200 field.number_ = number; 193 field.number_ = number;
201 field.SetType(UnknownField::TYPE_GROUP); 194 field.SetType(UnknownField::TYPE_GROUP);
202 field.group_ = new UnknownFieldSet; 195 field.group_ = new UnknownFieldSet;
203 if (fields_ == NULL) fields_ = new vector<UnknownField>(); 196 if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
204 fields_->push_back(field); 197 fields_->push_back(field);
205 return field.group_; 198 return field.group_;
206 } 199 }
207 200
208 void UnknownFieldSet::AddField(const UnknownField& field) { 201 void UnknownFieldSet::AddField(const UnknownField& field) {
209 if (fields_ == NULL) fields_ = new vector<UnknownField>(); 202 if (fields_ == NULL) fields_ = new std::vector<UnknownField>();
210 fields_->push_back(field); 203 fields_->push_back(field);
211 fields_->back().DeepCopy(field); 204 fields_->back().DeepCopy(field);
212 } 205 }
213 206
214 void UnknownFieldSet::DeleteSubrange(int start, int num) { 207 void UnknownFieldSet::DeleteSubrange(int start, int num) {
215 // Delete the specified fields. 208 // Delete the specified fields.
216 for (int i = 0; i < num; ++i) { 209 for (int i = 0; i < num; ++i) {
217 (*fields_)[i + start].Delete(); 210 (*fields_)[i + start].Delete();
218 } 211 }
219 // Slide down the remaining fields. 212 // Slide down the remaining fields.
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 uint8* UnknownField::SerializeLengthDelimitedNoTagToArray(uint8* target) const { 331 uint8* UnknownField::SerializeLengthDelimitedNoTagToArray(uint8* target) const {
339 GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type()); 332 GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type());
340 const string& data = *length_delimited_.string_value_; 333 const string& data = *length_delimited_.string_value_;
341 target = io::CodedOutputStream::WriteVarint32ToArray(data.size(), target); 334 target = io::CodedOutputStream::WriteVarint32ToArray(data.size(), target);
342 target = io::CodedOutputStream::WriteStringToArray(data, target); 335 target = io::CodedOutputStream::WriteStringToArray(data, target);
343 return target; 336 return target;
344 } 337 }
345 338
346 } // namespace protobuf 339 } // namespace protobuf
347 } // namespace google 340 } // namespace google
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698