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