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

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

Issue 2590803003: Revert "third_party/protobuf: Update to HEAD (83d681ee2c)" (Closed)
Patch Set: 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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 return false; 69 return false;
70 70
71 // Do not add a default statement. Let the compiler complain when someone 71 // Do not add a default statement. Let the compiler complain when someone
72 // adds a new wire type. 72 // adds a new wire type.
73 } 73 }
74 GOOGLE_LOG(FATAL) << "can't reach here."; 74 GOOGLE_LOG(FATAL) << "can't reach here.";
75 return false; 75 return false;
76 } 76 }
77 77
78 // Registry stuff. 78 // Registry stuff.
79 typedef hash_map<std::pair<const MessageLite*, int>, 79 typedef hash_map<pair<const MessageLite*, int>,
80 ExtensionInfo> ExtensionRegistry; 80 ExtensionInfo> ExtensionRegistry;
81 ExtensionRegistry* registry_ = NULL; 81 ExtensionRegistry* registry_ = NULL;
82 GOOGLE_PROTOBUF_DECLARE_ONCE(registry_init_); 82 GOOGLE_PROTOBUF_DECLARE_ONCE(registry_init_);
83 83
84 void DeleteRegistry() { 84 void DeleteRegistry() {
85 delete registry_; 85 delete registry_;
86 registry_ = NULL; 86 registry_ = NULL;
87 } 87 }
88 88
89 void InitRegistry() { 89 void InitRegistry() {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 type == WireFormatLite::TYPE_GROUP); 170 type == WireFormatLite::TYPE_GROUP);
171 ExtensionInfo info(type, is_repeated, is_packed); 171 ExtensionInfo info(type, is_repeated, is_packed);
172 info.message_prototype = prototype; 172 info.message_prototype = prototype;
173 Register(containing_type, number, info); 173 Register(containing_type, number, info);
174 } 174 }
175 175
176 176
177 // =================================================================== 177 // ===================================================================
178 // Constructors and basic methods. 178 // Constructors and basic methods.
179 179
180 ExtensionSet::ExtensionSet(::google::protobuf::Arena* arena) 180 ExtensionSet::ExtensionSet(::google::protobuf::Arena* arena) : arena_(arena) {
181 : arena_(arena) {
182 if (arena_ != NULL) { 181 if (arena_ != NULL) {
183 arena_->OwnDestructor(&extensions_); 182 arena_->OwnDestructor(&extensions_);
184 } 183 }
185 } 184 }
186 185
187 ExtensionSet::ExtensionSet() : arena_(NULL) {} 186 ExtensionSet::ExtensionSet() : arena_(NULL) {}
188 187
189 ExtensionSet::~ExtensionSet() { 188 ExtensionSet::~ExtensionSet() {
190 // Deletes all allocated extensions. 189 // Deletes all allocated extensions.
191 if (arena_ == NULL) { 190 if (arena_ == NULL) {
192 for (ExtensionMap::iterator iter = extensions_.begin(); 191 for (map<int, Extension>::iterator iter = extensions_.begin();
193 iter != extensions_.end(); ++iter) { 192 iter != extensions_.end(); ++iter) {
194 iter->second.Free(); 193 iter->second.Free();
195 } 194 }
196 } 195 }
197 } 196 }
198 197
199 // Defined in extension_set_heavy.cc. 198 // Defined in extension_set_heavy.cc.
200 // void ExtensionSet::AppendToList(const Descriptor* containing_type, 199 // void ExtensionSet::AppendToList(const Descriptor* containing_type,
201 // const DescriptorPool* pool, 200 // const DescriptorPool* pool,
202 // vector<const FieldDescriptor*>* output) const 201 // vector<const FieldDescriptor*>* output) const
203 202
204 bool ExtensionSet::Has(int number) const { 203 bool ExtensionSet::Has(int number) const {
205 ExtensionMap::const_iterator iter = extensions_.find(number); 204 map<int, Extension>::const_iterator iter = extensions_.find(number);
206 if (iter == extensions_.end()) return false; 205 if (iter == extensions_.end()) return false;
207 GOOGLE_DCHECK(!iter->second.is_repeated); 206 GOOGLE_DCHECK(!iter->second.is_repeated);
208 return !iter->second.is_cleared; 207 return !iter->second.is_cleared;
209 } 208 }
210 209
211 int ExtensionSet::NumExtensions() const { 210 int ExtensionSet::NumExtensions() const {
212 int result = 0; 211 int result = 0;
213 for (ExtensionMap::const_iterator iter = extensions_.begin(); 212 for (map<int, Extension>::const_iterator iter = extensions_.begin();
214 iter != extensions_.end(); ++iter) { 213 iter != extensions_.end(); ++iter) {
215 if (!iter->second.is_cleared) { 214 if (!iter->second.is_cleared) {
216 ++result; 215 ++result;
217 } 216 }
218 } 217 }
219 return result; 218 return result;
220 } 219 }
221 220
222 int ExtensionSet::ExtensionSize(int number) const { 221 int ExtensionSet::ExtensionSize(int number) const {
223 ExtensionMap::const_iterator iter = extensions_.find(number); 222 map<int, Extension>::const_iterator iter = extensions_.find(number);
224 if (iter == extensions_.end()) return false; 223 if (iter == extensions_.end()) return false;
225 return iter->second.GetSize(); 224 return iter->second.GetSize();
226 } 225 }
227 226
228 FieldType ExtensionSet::ExtensionType(int number) const { 227 FieldType ExtensionSet::ExtensionType(int number) const {
229 ExtensionMap::const_iterator iter = extensions_.find(number); 228 map<int, Extension>::const_iterator iter = extensions_.find(number);
230 if (iter == extensions_.end()) { 229 if (iter == extensions_.end()) {
231 GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present ( 1). "; 230 GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present ( 1). ";
232 return 0; 231 return 0;
233 } 232 }
234 if (iter->second.is_cleared) { 233 if (iter->second.is_cleared) {
235 GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present ( 2). "; 234 GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present ( 2). ";
236 } 235 }
237 return iter->second.type; 236 return iter->second.type;
238 } 237 }
239 238
240 void ExtensionSet::ClearExtension(int number) { 239 void ExtensionSet::ClearExtension(int number) {
241 ExtensionMap::iterator iter = extensions_.find(number); 240 map<int, Extension>::iterator iter = extensions_.find(number);
242 if (iter == extensions_.end()) return; 241 if (iter == extensions_.end()) return;
243 iter->second.Clear(); 242 iter->second.Clear();
244 } 243 }
245 244
246 // =================================================================== 245 // ===================================================================
247 // Field accessors 246 // Field accessors
248 247
249 namespace { 248 namespace {
250 249
251 enum Cardinality { 250 enum Cardinality {
252 REPEATED, 251 REPEATED,
253 OPTIONAL 252 OPTIONAL
254 }; 253 };
255 254
256 } // namespace 255 } // namespace
257 256
258 #define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE) \ 257 #define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE) \
259 GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? REPEATED : OPTIONAL, LABEL); \ 258 GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? REPEATED : OPTIONAL, LABEL); \
260 GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), WireFormatLite::CPPTYPE_##CPPTYPE ) 259 GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), WireFormatLite::CPPTYPE_##CPPTYPE )
261 260
262 // ------------------------------------------------------------------- 261 // -------------------------------------------------------------------
263 // Primitives 262 // Primitives
264 263
265 #define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE) \ 264 #define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE) \
266 \ 265 \
267 LOWERCASE ExtensionSet::Get##CAMELCASE(int number, \ 266 LOWERCASE ExtensionSet::Get##CAMELCASE(int number, \
268 LOWERCASE default_value) const { \ 267 LOWERCASE default_value) const { \
269 ExtensionMap::const_iterator iter = extensions_.find(number); \ 268 map<int, Extension>::const_iterator iter = extensions_.find(number); \
270 if (iter == extensions_.end() || iter->second.is_cleared) { \ 269 if (iter == extensions_.end() || iter->second.is_cleared) { \
271 return default_value; \ 270 return default_value; \
272 } else { \ 271 } else { \
273 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, UPPERCASE); \ 272 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, UPPERCASE); \
274 return iter->second.LOWERCASE##_value; \ 273 return iter->second.LOWERCASE##_value; \
275 } \ 274 } \
276 } \ 275 } \
277 \ 276 \
278 void ExtensionSet::Set##CAMELCASE(int number, FieldType type, \ 277 void ExtensionSet::Set##CAMELCASE(int number, FieldType type, \
279 LOWERCASE value, \ 278 LOWERCASE value, \
280 const FieldDescriptor* descriptor) { \ 279 const FieldDescriptor* descriptor) { \
281 Extension* extension; \ 280 Extension* extension; \
282 if (MaybeNewExtension(number, descriptor, &extension)) { \ 281 if (MaybeNewExtension(number, descriptor, &extension)) { \
283 extension->type = type; \ 282 extension->type = type; \
284 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERC ASE); \ 283 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERC ASE); \
285 extension->is_repeated = false; \ 284 extension->is_repeated = false; \
286 } else { \ 285 } else { \
287 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, UPPERCASE); \ 286 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, UPPERCASE); \
288 } \ 287 } \
289 extension->is_cleared = false; \ 288 extension->is_cleared = false; \
290 extension->LOWERCASE##_value = value; \ 289 extension->LOWERCASE##_value = value; \
291 } \ 290 } \
292 \ 291 \
293 LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) const { \ 292 LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) const { \
294 ExtensionMap::const_iterator iter = extensions_.find(number); \ 293 map<int, Extension>::const_iterator iter = extensions_.find(number); \
295 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; \ 294 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; \
296 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \ 295 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \
297 return iter->second.repeated_##LOWERCASE##_value->Get(index); \ 296 return iter->second.repeated_##LOWERCASE##_value->Get(index); \
298 } \ 297 } \
299 \ 298 \
300 void ExtensionSet::SetRepeated##CAMELCASE( \ 299 void ExtensionSet::SetRepeated##CAMELCASE( \
301 int number, int index, LOWERCASE value) { \ 300 int number, int index, LOWERCASE value) { \
302 ExtensionMap::iterator iter = extensions_.find(number); \ 301 map<int, Extension>::iterator iter = extensions_.find(number); \
303 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; \ 302 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; \
304 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \ 303 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \
305 iter->second.repeated_##LOWERCASE##_value->Set(index, value); \ 304 iter->second.repeated_##LOWERCASE##_value->Set(index, value); \
306 } \ 305 } \
307 \ 306 \
308 void ExtensionSet::Add##CAMELCASE(int number, FieldType type, \ 307 void ExtensionSet::Add##CAMELCASE(int number, FieldType type, \
309 bool packed, LOWERCASE value, \ 308 bool packed, LOWERCASE value, \
310 const FieldDescriptor* descriptor) { \ 309 const FieldDescriptor* descriptor) { \
311 Extension* extension; \ 310 Extension* extension; \
312 if (MaybeNewExtension(number, descriptor, &extension)) { \ 311 if (MaybeNewExtension(number, descriptor, &extension)) { \
(...skipping 15 matching lines...) Expand all
328 PRIMITIVE_ACCESSORS(UINT32, uint32, UInt32) 327 PRIMITIVE_ACCESSORS(UINT32, uint32, UInt32)
329 PRIMITIVE_ACCESSORS(UINT64, uint64, UInt64) 328 PRIMITIVE_ACCESSORS(UINT64, uint64, UInt64)
330 PRIMITIVE_ACCESSORS( FLOAT, float, Float) 329 PRIMITIVE_ACCESSORS( FLOAT, float, Float)
331 PRIMITIVE_ACCESSORS(DOUBLE, double, Double) 330 PRIMITIVE_ACCESSORS(DOUBLE, double, Double)
332 PRIMITIVE_ACCESSORS( BOOL, bool, Bool) 331 PRIMITIVE_ACCESSORS( BOOL, bool, Bool)
333 332
334 #undef PRIMITIVE_ACCESSORS 333 #undef PRIMITIVE_ACCESSORS
335 334
336 const void* ExtensionSet::GetRawRepeatedField(int number, 335 const void* ExtensionSet::GetRawRepeatedField(int number,
337 const void* default_value) const { 336 const void* default_value) const {
338 ExtensionMap::const_iterator iter = extensions_.find(number); 337 map<int, Extension>::const_iterator iter = extensions_.find(number);
339 if (iter == extensions_.end()) { 338 if (iter == extensions_.end()) {
340 return default_value; 339 return default_value;
341 } 340 }
342 // We assume that all the RepeatedField<>* pointers have the same 341 // We assume that all the RepeatedField<>* pointers have the same
343 // size and alignment within the anonymous union in Extension. 342 // size and alignment within the anonymous union in Extension.
344 return iter->second.repeated_int32_value; 343 return iter->second.repeated_int32_value;
345 } 344 }
346 345
347 void* ExtensionSet::MutableRawRepeatedField(int number, FieldType field_type, 346 void* ExtensionSet::MutableRawRepeatedField(int number, FieldType field_type,
348 bool packed, 347 bool packed,
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 } 401 }
403 402
404 // We assume that all the RepeatedField<>* pointers have the same 403 // We assume that all the RepeatedField<>* pointers have the same
405 // size and alignment within the anonymous union in Extension. 404 // size and alignment within the anonymous union in Extension.
406 return extension->repeated_int32_value; 405 return extension->repeated_int32_value;
407 } 406 }
408 407
409 // Compatible version using old call signature. Does not create extensions when 408 // Compatible version using old call signature. Does not create extensions when
410 // the don't already exist; instead, just GOOGLE_CHECK-fails. 409 // the don't already exist; instead, just GOOGLE_CHECK-fails.
411 void* ExtensionSet::MutableRawRepeatedField(int number) { 410 void* ExtensionSet::MutableRawRepeatedField(int number) {
412 ExtensionMap::iterator iter = extensions_.find(number); 411 map<int, Extension>::iterator iter = extensions_.find(number);
413 GOOGLE_CHECK(iter == extensions_.end()) << "Extension not found."; 412 GOOGLE_CHECK(iter == extensions_.end()) << "Extension not found.";
414 // We assume that all the RepeatedField<>* pointers have the same 413 // We assume that all the RepeatedField<>* pointers have the same
415 // size and alignment within the anonymous union in Extension. 414 // size and alignment within the anonymous union in Extension.
416 return iter->second.repeated_int32_value; 415 return iter->second.repeated_int32_value;
417 } 416 }
418 417
419 418
420 // ------------------------------------------------------------------- 419 // -------------------------------------------------------------------
421 // Enums 420 // Enums
422 421
423 int ExtensionSet::GetEnum(int number, int default_value) const { 422 int ExtensionSet::GetEnum(int number, int default_value) const {
424 ExtensionMap::const_iterator iter = extensions_.find(number); 423 map<int, Extension>::const_iterator iter = extensions_.find(number);
425 if (iter == extensions_.end() || iter->second.is_cleared) { 424 if (iter == extensions_.end() || iter->second.is_cleared) {
426 // Not present. Return the default value. 425 // Not present. Return the default value.
427 return default_value; 426 return default_value;
428 } else { 427 } else {
429 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, ENUM); 428 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, ENUM);
430 return iter->second.enum_value; 429 return iter->second.enum_value;
431 } 430 }
432 } 431 }
433 432
434 void ExtensionSet::SetEnum(int number, FieldType type, int value, 433 void ExtensionSet::SetEnum(int number, FieldType type, int value,
435 const FieldDescriptor* descriptor) { 434 const FieldDescriptor* descriptor) {
436 Extension* extension; 435 Extension* extension;
437 if (MaybeNewExtension(number, descriptor, &extension)) { 436 if (MaybeNewExtension(number, descriptor, &extension)) {
438 extension->type = type; 437 extension->type = type;
439 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM); 438 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM);
440 extension->is_repeated = false; 439 extension->is_repeated = false;
441 } else { 440 } else {
442 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, ENUM); 441 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, ENUM);
443 } 442 }
444 extension->is_cleared = false; 443 extension->is_cleared = false;
445 extension->enum_value = value; 444 extension->enum_value = value;
446 } 445 }
447 446
448 int ExtensionSet::GetRepeatedEnum(int number, int index) const { 447 int ExtensionSet::GetRepeatedEnum(int number, int index) const {
449 ExtensionMap::const_iterator iter = extensions_.find(number); 448 map<int, Extension>::const_iterator iter = extensions_.find(number);
450 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 449 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
451 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM); 450 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM);
452 return iter->second.repeated_enum_value->Get(index); 451 return iter->second.repeated_enum_value->Get(index);
453 } 452 }
454 453
455 void ExtensionSet::SetRepeatedEnum(int number, int index, int value) { 454 void ExtensionSet::SetRepeatedEnum(int number, int index, int value) {
456 ExtensionMap::iterator iter = extensions_.find(number); 455 map<int, Extension>::iterator iter = extensions_.find(number);
457 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 456 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
458 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM); 457 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM);
459 iter->second.repeated_enum_value->Set(index, value); 458 iter->second.repeated_enum_value->Set(index, value);
460 } 459 }
461 460
462 void ExtensionSet::AddEnum(int number, FieldType type, 461 void ExtensionSet::AddEnum(int number, FieldType type,
463 bool packed, int value, 462 bool packed, int value,
464 const FieldDescriptor* descriptor) { 463 const FieldDescriptor* descriptor) {
465 Extension* extension; 464 Extension* extension;
466 if (MaybeNewExtension(number, descriptor, &extension)) { 465 if (MaybeNewExtension(number, descriptor, &extension)) {
467 extension->type = type; 466 extension->type = type;
468 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM); 467 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM);
469 extension->is_repeated = true; 468 extension->is_repeated = true;
470 extension->is_packed = packed; 469 extension->is_packed = packed;
471 extension->repeated_enum_value = 470 extension->repeated_enum_value =
472 Arena::CreateMessage<RepeatedField<int> >(arena_); 471 Arena::CreateMessage<RepeatedField<int> >(arena_);
473 } else { 472 } else {
474 GOOGLE_DCHECK_TYPE(*extension, REPEATED, ENUM); 473 GOOGLE_DCHECK_TYPE(*extension, REPEATED, ENUM);
475 GOOGLE_DCHECK_EQ(extension->is_packed, packed); 474 GOOGLE_DCHECK_EQ(extension->is_packed, packed);
476 } 475 }
477 extension->repeated_enum_value->Add(value); 476 extension->repeated_enum_value->Add(value);
478 } 477 }
479 478
480 // ------------------------------------------------------------------- 479 // -------------------------------------------------------------------
481 // Strings 480 // Strings
482 481
483 const string& ExtensionSet::GetString(int number, 482 const string& ExtensionSet::GetString(int number,
484 const string& default_value) const { 483 const string& default_value) const {
485 ExtensionMap::const_iterator iter = extensions_.find(number); 484 map<int, Extension>::const_iterator iter = extensions_.find(number);
486 if (iter == extensions_.end() || iter->second.is_cleared) { 485 if (iter == extensions_.end() || iter->second.is_cleared) {
487 // Not present. Return the default value. 486 // Not present. Return the default value.
488 return default_value; 487 return default_value;
489 } else { 488 } else {
490 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, STRING); 489 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, STRING);
491 return *iter->second.string_value; 490 return *iter->second.string_value;
492 } 491 }
493 } 492 }
494 493
495 string* ExtensionSet::MutableString(int number, FieldType type, 494 string* ExtensionSet::MutableString(int number, FieldType type,
496 const FieldDescriptor* descriptor) { 495 const FieldDescriptor* descriptor) {
497 Extension* extension; 496 Extension* extension;
498 if (MaybeNewExtension(number, descriptor, &extension)) { 497 if (MaybeNewExtension(number, descriptor, &extension)) {
499 extension->type = type; 498 extension->type = type;
500 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING); 499 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);
501 extension->is_repeated = false; 500 extension->is_repeated = false;
502 extension->string_value = Arena::Create<string>(arena_); 501 extension->string_value = Arena::Create<string>(arena_);
503 } else { 502 } else {
504 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, STRING); 503 GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, STRING);
505 } 504 }
506 extension->is_cleared = false; 505 extension->is_cleared = false;
507 return extension->string_value; 506 return extension->string_value;
508 } 507 }
509 508
510 const string& ExtensionSet::GetRepeatedString(int number, int index) const { 509 const string& ExtensionSet::GetRepeatedString(int number, int index) const {
511 ExtensionMap::const_iterator iter = extensions_.find(number); 510 map<int, Extension>::const_iterator iter = extensions_.find(number);
512 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 511 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
513 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING); 512 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);
514 return iter->second.repeated_string_value->Get(index); 513 return iter->second.repeated_string_value->Get(index);
515 } 514 }
516 515
517 string* ExtensionSet::MutableRepeatedString(int number, int index) { 516 string* ExtensionSet::MutableRepeatedString(int number, int index) {
518 ExtensionMap::iterator iter = extensions_.find(number); 517 map<int, Extension>::iterator iter = extensions_.find(number);
519 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 518 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
520 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING); 519 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);
521 return iter->second.repeated_string_value->Mutable(index); 520 return iter->second.repeated_string_value->Mutable(index);
522 } 521 }
523 522
524 string* ExtensionSet::AddString(int number, FieldType type, 523 string* ExtensionSet::AddString(int number, FieldType type,
525 const FieldDescriptor* descriptor) { 524 const FieldDescriptor* descriptor) {
526 Extension* extension; 525 Extension* extension;
527 if (MaybeNewExtension(number, descriptor, &extension)) { 526 if (MaybeNewExtension(number, descriptor, &extension)) {
528 extension->type = type; 527 extension->type = type;
529 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING); 528 GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);
530 extension->is_repeated = true; 529 extension->is_repeated = true;
531 extension->is_packed = false; 530 extension->is_packed = false;
532 extension->repeated_string_value = 531 extension->repeated_string_value =
533 Arena::CreateMessage<RepeatedPtrField<string> >(arena_); 532 Arena::CreateMessage<RepeatedPtrField<string> >(arena_);
534 } else { 533 } else {
535 GOOGLE_DCHECK_TYPE(*extension, REPEATED, STRING); 534 GOOGLE_DCHECK_TYPE(*extension, REPEATED, STRING);
536 } 535 }
537 return extension->repeated_string_value->Add(); 536 return extension->repeated_string_value->Add();
538 } 537 }
539 538
540 // ------------------------------------------------------------------- 539 // -------------------------------------------------------------------
541 // Messages 540 // Messages
542 541
543 const MessageLite& ExtensionSet::GetMessage( 542 const MessageLite& ExtensionSet::GetMessage(
544 int number, const MessageLite& default_value) const { 543 int number, const MessageLite& default_value) const {
545 ExtensionMap::const_iterator iter = extensions_.find(number); 544 map<int, Extension>::const_iterator iter = extensions_.find(number);
546 if (iter == extensions_.end()) { 545 if (iter == extensions_.end()) {
547 // Not present. Return the default value. 546 // Not present. Return the default value.
548 return default_value; 547 return default_value;
549 } else { 548 } else {
550 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); 549 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);
551 if (iter->second.is_lazy) { 550 if (iter->second.is_lazy) {
552 return iter->second.lazymessage_value->GetMessage(default_value); 551 return iter->second.lazymessage_value->GetMessage(default_value);
553 } else { 552 } else {
554 return *iter->second.message_value; 553 return *iter->second.message_value;
555 } 554 }
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 } 657 }
659 extension->message_value = message; 658 extension->message_value = message;
660 } 659 }
661 } 660 }
662 extension->is_cleared = false; 661 extension->is_cleared = false;
663 } 662 }
664 663
665 664
666 MessageLite* ExtensionSet::ReleaseMessage(int number, 665 MessageLite* ExtensionSet::ReleaseMessage(int number,
667 const MessageLite& prototype) { 666 const MessageLite& prototype) {
668 ExtensionMap::iterator iter = extensions_.find(number); 667 map<int, Extension>::iterator iter = extensions_.find(number);
669 if (iter == extensions_.end()) { 668 if (iter == extensions_.end()) {
670 // Not present. Return NULL. 669 // Not present. Return NULL.
671 return NULL; 670 return NULL;
672 } else { 671 } else {
673 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); 672 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);
674 MessageLite* ret = NULL; 673 MessageLite* ret = NULL;
675 if (iter->second.is_lazy) { 674 if (iter->second.is_lazy) {
676 ret = iter->second.lazymessage_value->ReleaseMessage(prototype); 675 ret = iter->second.lazymessage_value->ReleaseMessage(prototype);
677 if (arena_ == NULL) { 676 if (arena_ == NULL) {
678 delete iter->second.lazymessage_value; 677 delete iter->second.lazymessage_value;
679 } 678 }
680 } else { 679 } else {
681 if (arena_ == NULL) { 680 if (arena_ == NULL) {
682 ret = iter->second.message_value; 681 ret = iter->second.message_value;
683 } else { 682 } else {
684 // ReleaseMessage() always returns a heap-allocated message, and we are 683 // ReleaseMessage() always returns a heap-allocated message, and we are
685 // on an arena, so we need to make a copy of this message to return. 684 // on an arena, so we need to make a copy of this message to return.
686 ret = (iter->second.message_value)->New(); 685 ret = (iter->second.message_value)->New();
687 ret->CheckTypeAndMergeFrom(*iter->second.message_value); 686 ret->CheckTypeAndMergeFrom(*iter->second.message_value);
688 } 687 }
689 } 688 }
690 extensions_.erase(number); 689 extensions_.erase(number);
691 return ret; 690 return ret;
692 } 691 }
693 } 692 }
694 693
695 MessageLite* ExtensionSet::UnsafeArenaReleaseMessage( 694 MessageLite* ExtensionSet::UnsafeArenaReleaseMessage(
696 int number, const MessageLite& prototype) { 695 int number, const MessageLite& prototype) {
697 ExtensionMap::iterator iter = extensions_.find(number); 696 map<int, Extension>::iterator iter = extensions_.find(number);
698 if (iter == extensions_.end()) { 697 if (iter == extensions_.end()) {
699 // Not present. Return NULL. 698 // Not present. Return NULL.
700 return NULL; 699 return NULL;
701 } else { 700 } else {
702 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); 701 GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);
703 MessageLite* ret = NULL; 702 MessageLite* ret = NULL;
704 if (iter->second.is_lazy) { 703 if (iter->second.is_lazy) {
705 ret = 704 ret =
706 iter->second.lazymessage_value->UnsafeArenaReleaseMessage(prototype); 705 iter->second.lazymessage_value->UnsafeArenaReleaseMessage(prototype);
707 if (arena_ == NULL) { 706 if (arena_ == NULL) {
708 delete iter->second.lazymessage_value; 707 delete iter->second.lazymessage_value;
709 } 708 }
710 } else { 709 } else {
711 ret = iter->second.message_value; 710 ret = iter->second.message_value;
712 } 711 }
713 extensions_.erase(number); 712 extensions_.erase(number);
714 return ret; 713 return ret;
715 } 714 }
716 } 715 }
717 716
718 // Defined in extension_set_heavy.cc. 717 // Defined in extension_set_heavy.cc.
719 // MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor, 718 // MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor,
720 // MessageFactory* factory); 719 // MessageFactory* factory);
721 720
722 const MessageLite& ExtensionSet::GetRepeatedMessage( 721 const MessageLite& ExtensionSet::GetRepeatedMessage(
723 int number, int index) const { 722 int number, int index) const {
724 ExtensionMap::const_iterator iter = extensions_.find(number); 723 map<int, Extension>::const_iterator iter = extensions_.find(number);
725 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 724 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
726 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE); 725 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE);
727 return iter->second.repeated_message_value->Get(index); 726 return iter->second.repeated_message_value->Get(index);
728 } 727 }
729 728
730 MessageLite* ExtensionSet::MutableRepeatedMessage(int number, int index) { 729 MessageLite* ExtensionSet::MutableRepeatedMessage(int number, int index) {
731 ExtensionMap::iterator iter = extensions_.find(number); 730 map<int, Extension>::iterator iter = extensions_.find(number);
732 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 731 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
733 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE); 732 GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE);
734 return iter->second.repeated_message_value->Mutable(index); 733 return iter->second.repeated_message_value->Mutable(index);
735 } 734 }
736 735
737 MessageLite* ExtensionSet::AddMessage(int number, FieldType type, 736 MessageLite* ExtensionSet::AddMessage(int number, FieldType type,
738 const MessageLite& prototype, 737 const MessageLite& prototype,
739 const FieldDescriptor* descriptor) { 738 const FieldDescriptor* descriptor) {
740 Extension* extension; 739 Extension* extension;
741 if (MaybeNewExtension(number, descriptor, &extension)) { 740 if (MaybeNewExtension(number, descriptor, &extension)) {
(...skipping 18 matching lines...) Expand all
760 } 759 }
761 760
762 // Defined in extension_set_heavy.cc. 761 // Defined in extension_set_heavy.cc.
763 // MessageLite* ExtensionSet::AddMessage(int number, FieldType type, 762 // MessageLite* ExtensionSet::AddMessage(int number, FieldType type,
764 // const Descriptor* message_type, 763 // const Descriptor* message_type,
765 // MessageFactory* factory) 764 // MessageFactory* factory)
766 765
767 #undef GOOGLE_DCHECK_TYPE 766 #undef GOOGLE_DCHECK_TYPE
768 767
769 void ExtensionSet::RemoveLast(int number) { 768 void ExtensionSet::RemoveLast(int number) {
770 ExtensionMap::iterator iter = extensions_.find(number); 769 map<int, Extension>::iterator iter = extensions_.find(number);
771 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 770 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
772 771
773 Extension* extension = &iter->second; 772 Extension* extension = &iter->second;
774 GOOGLE_DCHECK(extension->is_repeated); 773 GOOGLE_DCHECK(extension->is_repeated);
775 774
776 switch(cpp_type(extension->type)) { 775 switch(cpp_type(extension->type)) {
777 case WireFormatLite::CPPTYPE_INT32: 776 case WireFormatLite::CPPTYPE_INT32:
778 extension->repeated_int32_value->RemoveLast(); 777 extension->repeated_int32_value->RemoveLast();
779 break; 778 break;
780 case WireFormatLite::CPPTYPE_INT64: 779 case WireFormatLite::CPPTYPE_INT64:
(...skipping 20 matching lines...) Expand all
801 case WireFormatLite::CPPTYPE_STRING: 800 case WireFormatLite::CPPTYPE_STRING:
802 extension->repeated_string_value->RemoveLast(); 801 extension->repeated_string_value->RemoveLast();
803 break; 802 break;
804 case WireFormatLite::CPPTYPE_MESSAGE: 803 case WireFormatLite::CPPTYPE_MESSAGE:
805 extension->repeated_message_value->RemoveLast(); 804 extension->repeated_message_value->RemoveLast();
806 break; 805 break;
807 } 806 }
808 } 807 }
809 808
810 MessageLite* ExtensionSet::ReleaseLast(int number) { 809 MessageLite* ExtensionSet::ReleaseLast(int number) {
811 ExtensionMap::iterator iter = extensions_.find(number); 810 map<int, Extension>::iterator iter = extensions_.find(number);
812 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 811 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
813 812
814 Extension* extension = &iter->second; 813 Extension* extension = &iter->second;
815 GOOGLE_DCHECK(extension->is_repeated); 814 GOOGLE_DCHECK(extension->is_repeated);
816 GOOGLE_DCHECK(cpp_type(extension->type) == WireFormatLite::CPPTYPE_MESSAGE); 815 GOOGLE_DCHECK(cpp_type(extension->type) == WireFormatLite::CPPTYPE_MESSAGE);
817 return extension->repeated_message_value->ReleaseLast(); 816 return extension->repeated_message_value->ReleaseLast();
818 } 817 }
819 818
820 void ExtensionSet::SwapElements(int number, int index1, int index2) { 819 void ExtensionSet::SwapElements(int number, int index1, int index2) {
821 ExtensionMap::iterator iter = extensions_.find(number); 820 map<int, Extension>::iterator iter = extensions_.find(number);
822 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y)."; 821 GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empt y).";
823 822
824 Extension* extension = &iter->second; 823 Extension* extension = &iter->second;
825 GOOGLE_DCHECK(extension->is_repeated); 824 GOOGLE_DCHECK(extension->is_repeated);
826 825
827 switch(cpp_type(extension->type)) { 826 switch(cpp_type(extension->type)) {
828 case WireFormatLite::CPPTYPE_INT32: 827 case WireFormatLite::CPPTYPE_INT32:
829 extension->repeated_int32_value->SwapElements(index1, index2); 828 extension->repeated_int32_value->SwapElements(index1, index2);
830 break; 829 break;
831 case WireFormatLite::CPPTYPE_INT64: 830 case WireFormatLite::CPPTYPE_INT64:
(...skipping 22 matching lines...) Expand all
854 break; 853 break;
855 case WireFormatLite::CPPTYPE_MESSAGE: 854 case WireFormatLite::CPPTYPE_MESSAGE:
856 extension->repeated_message_value->SwapElements(index1, index2); 855 extension->repeated_message_value->SwapElements(index1, index2);
857 break; 856 break;
858 } 857 }
859 } 858 }
860 859
861 // =================================================================== 860 // ===================================================================
862 861
863 void ExtensionSet::Clear() { 862 void ExtensionSet::Clear() {
864 for (ExtensionMap::iterator iter = extensions_.begin(); 863 for (map<int, Extension>::iterator iter = extensions_.begin();
865 iter != extensions_.end(); ++iter) { 864 iter != extensions_.end(); ++iter) {
866 iter->second.Clear(); 865 iter->second.Clear();
867 } 866 }
868 } 867 }
869 868
870 void ExtensionSet::MergeFrom(const ExtensionSet& other) { 869 void ExtensionSet::MergeFrom(const ExtensionSet& other) {
871 for (ExtensionMap::const_iterator iter = other.extensions_.begin(); 870 for (map<int, Extension>::const_iterator iter = other.extensions_.begin();
872 iter != other.extensions_.end(); ++iter) { 871 iter != other.extensions_.end(); ++iter) {
873 const Extension& other_extension = iter->second; 872 const Extension& other_extension = iter->second;
874 InternalExtensionMergeFrom(iter->first, other_extension); 873 InternalExtensionMergeFrom(iter->first, other_extension);
875 } 874 }
876 } 875 }
877 876
878 void ExtensionSet::InternalExtensionMergeFrom( 877 void ExtensionSet::InternalExtensionMergeFrom(
879 int number, const Extension& other_extension) { 878 int number, const Extension& other_extension) {
880 if (other_extension.is_repeated) { 879 if (other_extension.is_repeated) {
881 Extension* extension; 880 Extension* extension;
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1025 x->Clear(); 1024 x->Clear();
1026 x->MergeFrom(*this); 1025 x->MergeFrom(*this);
1027 Clear(); 1026 Clear();
1028 MergeFrom(extension_set); 1027 MergeFrom(extension_set);
1029 } 1028 }
1030 } 1029 }
1031 1030
1032 void ExtensionSet::SwapExtension(ExtensionSet* other, 1031 void ExtensionSet::SwapExtension(ExtensionSet* other,
1033 int number) { 1032 int number) {
1034 if (this == other) return; 1033 if (this == other) return;
1035 ExtensionMap::iterator this_iter = extensions_.find(number); 1034 map<int, Extension>::iterator this_iter = extensions_.find(number);
1036 ExtensionMap::iterator other_iter = other->extensions_.find(number); 1035 map<int, Extension>::iterator other_iter = other->extensions_.find(number);
1037 1036
1038 if (this_iter == extensions_.end() && 1037 if (this_iter == extensions_.end() &&
1039 other_iter == other->extensions_.end()) { 1038 other_iter == other->extensions_.end()) {
1040 return; 1039 return;
1041 } 1040 }
1042 1041
1043 if (this_iter != extensions_.end() && 1042 if (this_iter != extensions_.end() &&
1044 other_iter != other->extensions_.end()) { 1043 other_iter != other->extensions_.end()) {
1045 if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { 1044 if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
1046 using std::swap; 1045 using std::swap;
1047 swap(this_iter->second, other_iter->second); 1046 swap(this_iter->second, other_iter->second);
1048 } else { 1047 } else {
1049 // TODO(cfallin, rohananil): We could further optimize these cases, 1048 // TODO(cfallin, rohananil): We could further optimize these cases,
1050 // especially avoid creation of ExtensionSet, and move MergeFrom logic 1049 // especially avoid creation of ExtensionSet, and move MergeFrom logic
1051 // into Extensions itself (which takes arena as an argument). 1050 // into Extensions itself (which takes arena as an argument).
1052 // We do it this way to reuse the copy-across-arenas logic already 1051 // We do it this way to reuse the copy-across-arenas logic already
1053 // implemented in ExtensionSet's MergeFrom. 1052 // implemented in ExtensionSet's MergeFrom.
1054 ExtensionSet temp; 1053 ExtensionSet temp;
1055 temp.InternalExtensionMergeFrom(number, other_iter->second); 1054 temp.InternalExtensionMergeFrom(number, other_iter->second);
1056 ExtensionMap::iterator temp_iter = temp.extensions_.find(number); 1055 map<int, Extension>::iterator temp_iter = temp.extensions_.find(number);
1057 other_iter->second.Clear(); 1056 other_iter->second.Clear();
1058 other->InternalExtensionMergeFrom(number, this_iter->second); 1057 other->InternalExtensionMergeFrom(number, this_iter->second);
1059 this_iter->second.Clear(); 1058 this_iter->second.Clear();
1060 InternalExtensionMergeFrom(number, temp_iter->second); 1059 InternalExtensionMergeFrom(number, temp_iter->second);
1061 } 1060 }
1062 return; 1061 return;
1063 } 1062 }
1064 1063
1065 if (this_iter == extensions_.end()) { 1064 if (this_iter == extensions_.end()) {
1066 if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { 1065 if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
(...skipping 12 matching lines...) Expand all
1079 other->InternalExtensionMergeFrom(number, this_iter->second); 1078 other->InternalExtensionMergeFrom(number, this_iter->second);
1080 } 1079 }
1081 extensions_.erase(number); 1080 extensions_.erase(number);
1082 return; 1081 return;
1083 } 1082 }
1084 } 1083 }
1085 1084
1086 bool ExtensionSet::IsInitialized() const { 1085 bool ExtensionSet::IsInitialized() const {
1087 // Extensions are never required. However, we need to check that all 1086 // Extensions are never required. However, we need to check that all
1088 // embedded messages are initialized. 1087 // embedded messages are initialized.
1089 for (ExtensionMap::const_iterator iter = extensions_.begin(); 1088 for (map<int, Extension>::const_iterator iter = extensions_.begin();
1090 iter != extensions_.end(); ++iter) { 1089 iter != extensions_.end(); ++iter) {
1091 const Extension& extension = iter->second; 1090 const Extension& extension = iter->second;
1092 if (cpp_type(extension.type) == WireFormatLite::CPPTYPE_MESSAGE) { 1091 if (cpp_type(extension.type) == WireFormatLite::CPPTYPE_MESSAGE) {
1093 if (extension.is_repeated) { 1092 if (extension.is_repeated) {
1094 for (int i = 0; i < extension.repeated_message_value->size(); i++) { 1093 for (int i = 0; i < extension.repeated_message_value->size(); i++) {
1095 if (!extension.repeated_message_value->Get(i).IsInitialized()) { 1094 if (!extension.repeated_message_value->Get(i).IsInitialized()) {
1096 return false; 1095 return false;
1097 } 1096 }
1098 } 1097 }
1099 } else { 1098 } else {
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
1339 // UnknownFieldSet* unknown_fields) 1338 // UnknownFieldSet* unknown_fields)
1340 1339
1341 // Defined in extension_set_heavy.cc. 1340 // Defined in extension_set_heavy.cc.
1342 // bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, 1341 // bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input,
1343 // const MessageLite* containing_type, 1342 // const MessageLite* containing_type,
1344 // UnknownFieldSet* unknown_fields); 1343 // UnknownFieldSet* unknown_fields);
1345 1344
1346 void ExtensionSet::SerializeWithCachedSizes( 1345 void ExtensionSet::SerializeWithCachedSizes(
1347 int start_field_number, int end_field_number, 1346 int start_field_number, int end_field_number,
1348 io::CodedOutputStream* output) const { 1347 io::CodedOutputStream* output) const {
1349 ExtensionMap::const_iterator iter; 1348 map<int, Extension>::const_iterator iter;
1350 for (iter = extensions_.lower_bound(start_field_number); 1349 for (iter = extensions_.lower_bound(start_field_number);
1351 iter != extensions_.end() && iter->first < end_field_number; 1350 iter != extensions_.end() && iter->first < end_field_number;
1352 ++iter) { 1351 ++iter) {
1353 iter->second.SerializeFieldWithCachedSizes(iter->first, output); 1352 iter->second.SerializeFieldWithCachedSizes(iter->first, output);
1354 } 1353 }
1355 } 1354 }
1356 1355
1357 size_t ExtensionSet::ByteSize() const { 1356 int ExtensionSet::ByteSize() const {
1358 size_t total_size = 0; 1357 int total_size = 0;
1359 1358
1360 for (ExtensionMap::const_iterator iter = extensions_.begin(); 1359 for (map<int, Extension>::const_iterator iter = extensions_.begin();
1361 iter != extensions_.end(); ++iter) { 1360 iter != extensions_.end(); ++iter) {
1362 total_size += iter->second.ByteSize(iter->first); 1361 total_size += iter->second.ByteSize(iter->first);
1363 } 1362 }
1364 1363
1365 return total_size; 1364 return total_size;
1366 } 1365 }
1367 1366
1368 // Defined in extension_set_heavy.cc. 1367 // Defined in extension_set_heavy.cc.
1369 // int ExtensionSet::SpaceUsedExcludingSelf() const 1368 // int ExtensionSet::SpaceUsedExcludingSelf() const
1370 1369
1371 bool ExtensionSet::MaybeNewExtension(int number, 1370 bool ExtensionSet::MaybeNewExtension(int number,
1372 const FieldDescriptor* descriptor, 1371 const FieldDescriptor* descriptor,
1373 Extension** result) { 1372 Extension** result) {
1374 std::pair<ExtensionMap::iterator, bool> insert_result = 1373 pair<map<int, Extension>::iterator, bool> insert_result =
1375 extensions_.insert(std::make_pair(number, Extension())); 1374 extensions_.insert(std::make_pair(number, Extension()));
1376 *result = &insert_result.first->second; 1375 *result = &insert_result.first->second;
1377 (*result)->descriptor = descriptor; 1376 (*result)->descriptor = descriptor;
1378 return insert_result.second; 1377 return insert_result.second;
1379 } 1378 }
1380 1379
1381 // =================================================================== 1380 // ===================================================================
1382 // Methods of ExtensionSet::Extension 1381 // Methods of ExtensionSet::Extension
1383 1382
1384 void ExtensionSet::Extension::Clear() { 1383 void ExtensionSet::Extension::Clear() {
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1529 if (is_lazy) { 1528 if (is_lazy) {
1530 lazymessage_value->WriteMessage(number, output); 1529 lazymessage_value->WriteMessage(number, output);
1531 } else { 1530 } else {
1532 WireFormatLite::WriteMessage(number, *message_value, output); 1531 WireFormatLite::WriteMessage(number, *message_value, output);
1533 } 1532 }
1534 break; 1533 break;
1535 } 1534 }
1536 } 1535 }
1537 } 1536 }
1538 1537
1539 size_t ExtensionSet::Extension::ByteSize(int number) const { 1538 int ExtensionSet::Extension::ByteSize(int number) const {
1540 size_t result = 0; 1539 int result = 0;
1541 1540
1542 if (is_repeated) { 1541 if (is_repeated) {
1543 if (is_packed) { 1542 if (is_packed) {
1544 switch (real_type(type)) { 1543 switch (real_type(type)) {
1545 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1544 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1546 case WireFormatLite::TYPE_##UPPERCASE: \ 1545 case WireFormatLite::TYPE_##UPPERCASE: \
1547 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ 1546 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
1548 result += WireFormatLite::CAMELCASE##Size( \ 1547 result += WireFormatLite::CAMELCASE##Size( \
1549 repeated_##LOWERCASE##_value->Get(i)); \ 1548 repeated_##LOWERCASE##_value->Get(i)); \
1550 } \ 1549 } \
1551 break 1550 break
1552 1551
1553 HANDLE_TYPE( INT32, Int32, int32); 1552 HANDLE_TYPE( INT32, Int32, int32);
1554 HANDLE_TYPE( INT64, Int64, int64); 1553 HANDLE_TYPE( INT64, Int64, int64);
1555 HANDLE_TYPE( UINT32, UInt32, uint32); 1554 HANDLE_TYPE( UINT32, UInt32, uint32);
1556 HANDLE_TYPE( UINT64, UInt64, uint64); 1555 HANDLE_TYPE( UINT64, UInt64, uint64);
1557 HANDLE_TYPE( SINT32, SInt32, int32); 1556 HANDLE_TYPE( SINT32, SInt32, int32);
1558 HANDLE_TYPE( SINT64, SInt64, int64); 1557 HANDLE_TYPE( SINT64, SInt64, int64);
1559 HANDLE_TYPE( ENUM, Enum, enum); 1558 HANDLE_TYPE( ENUM, Enum, enum);
1560 #undef HANDLE_TYPE 1559 #undef HANDLE_TYPE
1561 1560
1562 // Stuff with fixed size. 1561 // Stuff with fixed size.
1563 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1562 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1564 case WireFormatLite::TYPE_##UPPERCASE: \ 1563 case WireFormatLite::TYPE_##UPPERCASE: \
1565 result += WireFormatLite::k##CAMELCASE##Size * \ 1564 result += WireFormatLite::k##CAMELCASE##Size * \
1566 FromIntSize(repeated_##LOWERCASE##_value->size()); \ 1565 repeated_##LOWERCASE##_value->size(); \
1567 break 1566 break
1568 HANDLE_TYPE( FIXED32, Fixed32, uint32); 1567 HANDLE_TYPE( FIXED32, Fixed32, uint32);
1569 HANDLE_TYPE( FIXED64, Fixed64, uint64); 1568 HANDLE_TYPE( FIXED64, Fixed64, uint64);
1570 HANDLE_TYPE(SFIXED32, SFixed32, int32); 1569 HANDLE_TYPE(SFIXED32, SFixed32, int32);
1571 HANDLE_TYPE(SFIXED64, SFixed64, int64); 1570 HANDLE_TYPE(SFIXED64, SFixed64, int64);
1572 HANDLE_TYPE( FLOAT, Float, float); 1571 HANDLE_TYPE( FLOAT, Float, float);
1573 HANDLE_TYPE( DOUBLE, Double, double); 1572 HANDLE_TYPE( DOUBLE, Double, double);
1574 HANDLE_TYPE( BOOL, Bool, bool); 1573 HANDLE_TYPE( BOOL, Bool, bool);
1575 #undef HANDLE_TYPE 1574 #undef HANDLE_TYPE
1576 1575
1577 case WireFormatLite::TYPE_STRING: 1576 case WireFormatLite::TYPE_STRING:
1578 case WireFormatLite::TYPE_BYTES: 1577 case WireFormatLite::TYPE_BYTES:
1579 case WireFormatLite::TYPE_GROUP: 1578 case WireFormatLite::TYPE_GROUP:
1580 case WireFormatLite::TYPE_MESSAGE: 1579 case WireFormatLite::TYPE_MESSAGE:
1581 GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; 1580 GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed.";
1582 break; 1581 break;
1583 } 1582 }
1584 1583
1585 cached_size = ToCachedSize(result); 1584 cached_size = result;
1586 if (result > 0) { 1585 if (result > 0) {
1587 result += io::CodedOutputStream::VarintSize32(result); 1586 result += io::CodedOutputStream::VarintSize32(result);
1588 result += io::CodedOutputStream::VarintSize32( 1587 result += io::CodedOutputStream::VarintSize32(
1589 WireFormatLite::MakeTag(number, 1588 WireFormatLite::MakeTag(number,
1590 WireFormatLite::WIRETYPE_LENGTH_DELIMITED)); 1589 WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
1591 } 1590 }
1592 } else { 1591 } else {
1593 size_t tag_size = WireFormatLite::TagSize(number, real_type(type)); 1592 int tag_size = WireFormatLite::TagSize(number, real_type(type));
1594 1593
1595 switch (real_type(type)) { 1594 switch (real_type(type)) {
1596 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1595 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1597 case WireFormatLite::TYPE_##UPPERCASE: \ 1596 case WireFormatLite::TYPE_##UPPERCASE: \
1598 result += tag_size * \ 1597 result += tag_size * repeated_##LOWERCASE##_value->size(); \
1599 FromIntSize(repeated_##LOWERCASE##_value->size()); \
1600 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ 1598 for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
1601 result += WireFormatLite::CAMELCASE##Size( \ 1599 result += WireFormatLite::CAMELCASE##Size( \
1602 repeated_##LOWERCASE##_value->Get(i)); \ 1600 repeated_##LOWERCASE##_value->Get(i)); \
1603 } \ 1601 } \
1604 break 1602 break
1605 1603
1606 HANDLE_TYPE( INT32, Int32, int32); 1604 HANDLE_TYPE( INT32, Int32, int32);
1607 HANDLE_TYPE( INT64, Int64, int64); 1605 HANDLE_TYPE( INT64, Int64, int64);
1608 HANDLE_TYPE( UINT32, UInt32, uint32); 1606 HANDLE_TYPE( UINT32, UInt32, uint32);
1609 HANDLE_TYPE( UINT64, UInt64, uint64); 1607 HANDLE_TYPE( UINT64, UInt64, uint64);
1610 HANDLE_TYPE( SINT32, SInt32, int32); 1608 HANDLE_TYPE( SINT32, SInt32, int32);
1611 HANDLE_TYPE( SINT64, SInt64, int64); 1609 HANDLE_TYPE( SINT64, SInt64, int64);
1612 HANDLE_TYPE( STRING, String, string); 1610 HANDLE_TYPE( STRING, String, string);
1613 HANDLE_TYPE( BYTES, Bytes, string); 1611 HANDLE_TYPE( BYTES, Bytes, string);
1614 HANDLE_TYPE( ENUM, Enum, enum); 1612 HANDLE_TYPE( ENUM, Enum, enum);
1615 HANDLE_TYPE( GROUP, Group, message); 1613 HANDLE_TYPE( GROUP, Group, message);
1616 HANDLE_TYPE( MESSAGE, Message, message); 1614 HANDLE_TYPE( MESSAGE, Message, message);
1617 #undef HANDLE_TYPE 1615 #undef HANDLE_TYPE
1618 1616
1619 // Stuff with fixed size. 1617 // Stuff with fixed size.
1620 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ 1618 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \
1621 case WireFormatLite::TYPE_##UPPERCASE: \ 1619 case WireFormatLite::TYPE_##UPPERCASE: \
1622 result += (tag_size + WireFormatLite::k##CAMELCASE##Size) * \ 1620 result += (tag_size + WireFormatLite::k##CAMELCASE##Size) * \
1623 FromIntSize(repeated_##LOWERCASE##_value->size()); \ 1621 repeated_##LOWERCASE##_value->size(); \
1624 break 1622 break
1625 HANDLE_TYPE( FIXED32, Fixed32, uint32); 1623 HANDLE_TYPE( FIXED32, Fixed32, uint32);
1626 HANDLE_TYPE( FIXED64, Fixed64, uint64); 1624 HANDLE_TYPE( FIXED64, Fixed64, uint64);
1627 HANDLE_TYPE(SFIXED32, SFixed32, int32); 1625 HANDLE_TYPE(SFIXED32, SFixed32, int32);
1628 HANDLE_TYPE(SFIXED64, SFixed64, int64); 1626 HANDLE_TYPE(SFIXED64, SFixed64, int64);
1629 HANDLE_TYPE( FLOAT, Float, float); 1627 HANDLE_TYPE( FLOAT, Float, float);
1630 HANDLE_TYPE( DOUBLE, Double, double); 1628 HANDLE_TYPE( DOUBLE, Double, double);
1631 HANDLE_TYPE( BOOL, Bool, bool); 1629 HANDLE_TYPE( BOOL, Bool, bool);
1632 #undef HANDLE_TYPE 1630 #undef HANDLE_TYPE
1633 } 1631 }
(...skipping 12 matching lines...) Expand all
1646 HANDLE_TYPE( UINT64, UInt64, uint64_value); 1644 HANDLE_TYPE( UINT64, UInt64, uint64_value);
1647 HANDLE_TYPE( SINT32, SInt32, int32_value); 1645 HANDLE_TYPE( SINT32, SInt32, int32_value);
1648 HANDLE_TYPE( SINT64, SInt64, int64_value); 1646 HANDLE_TYPE( SINT64, SInt64, int64_value);
1649 HANDLE_TYPE( STRING, String, *string_value); 1647 HANDLE_TYPE( STRING, String, *string_value);
1650 HANDLE_TYPE( BYTES, Bytes, *string_value); 1648 HANDLE_TYPE( BYTES, Bytes, *string_value);
1651 HANDLE_TYPE( ENUM, Enum, enum_value); 1649 HANDLE_TYPE( ENUM, Enum, enum_value);
1652 HANDLE_TYPE( GROUP, Group, *message_value); 1650 HANDLE_TYPE( GROUP, Group, *message_value);
1653 #undef HANDLE_TYPE 1651 #undef HANDLE_TYPE
1654 case WireFormatLite::TYPE_MESSAGE: { 1652 case WireFormatLite::TYPE_MESSAGE: {
1655 if (is_lazy) { 1653 if (is_lazy) {
1656 size_t size = lazymessage_value->ByteSize(); 1654 int size = lazymessage_value->ByteSize();
1657 result += io::CodedOutputStream::VarintSize32(size) + size; 1655 result += io::CodedOutputStream::VarintSize32(size) + size;
1658 } else { 1656 } else {
1659 result += WireFormatLite::MessageSize(*message_value); 1657 result += WireFormatLite::MessageSize(*message_value);
1660 } 1658 }
1661 break; 1659 break;
1662 } 1660 }
1663 1661
1664 // Stuff with fixed size. 1662 // Stuff with fixed size.
1665 #define HANDLE_TYPE(UPPERCASE, CAMELCASE) \ 1663 #define HANDLE_TYPE(UPPERCASE, CAMELCASE) \
1666 case WireFormatLite::TYPE_##UPPERCASE: \ 1664 case WireFormatLite::TYPE_##UPPERCASE: \
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1808 const RepeatedField<bool>* 1806 const RepeatedField<bool>*
1809 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_ = NULL; 1807 RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_ = NULL;
1810 const RepeatedStringTypeTraits::RepeatedFieldType* 1808 const RepeatedStringTypeTraits::RepeatedFieldType*
1811 RepeatedStringTypeTraits::default_repeated_field_ = NULL; 1809 RepeatedStringTypeTraits::default_repeated_field_ = NULL;
1812 const RepeatedMessageGenericTypeTraits::RepeatedFieldType* 1810 const RepeatedMessageGenericTypeTraits::RepeatedFieldType*
1813 RepeatedMessageGenericTypeTraits::default_repeated_field_ = NULL; 1811 RepeatedMessageGenericTypeTraits::default_repeated_field_ = NULL;
1814 1812
1815 } // namespace internal 1813 } // namespace internal
1816 } // namespace protobuf 1814 } // namespace protobuf
1817 } // namespace google 1815 } // namespace google
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698