| 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 |