LCOV - code coverage report
Current view: top level - toolkit/components/protobuf/src/google/protobuf - extension_set.cc (source / functions) Hit Total Coverage
Test: output.info Lines: 34 823 4.1 %
Date: 2017-07-14 16:53:18 Functions: 5 101 5.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Protocol Buffers - Google's data interchange format
       2             : // Copyright 2008 Google Inc.  All rights reserved.
       3             : // https://developers.google.com/protocol-buffers/
       4             : //
       5             : // Redistribution and use in source and binary forms, with or without
       6             : // modification, are permitted provided that the following conditions are
       7             : // met:
       8             : //
       9             : //     * Redistributions of source code must retain the above copyright
      10             : // notice, this list of conditions and the following disclaimer.
      11             : //     * Redistributions in binary form must reproduce the above
      12             : // copyright notice, this list of conditions and the following disclaimer
      13             : // in the documentation and/or other materials provided with the
      14             : // distribution.
      15             : //     * Neither the name of Google Inc. nor the names of its
      16             : // contributors may be used to endorse or promote products derived from
      17             : // this software without specific prior written permission.
      18             : //
      19             : // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
      20             : // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
      21             : // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
      22             : // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
      23             : // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      24             : // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
      25             : // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
      26             : // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
      27             : // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
      28             : // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
      29             : // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      30             : 
      31             : // Author: kenton@google.com (Kenton Varda)
      32             : //  Based on original Protocol Buffers design by
      33             : //  Sanjay Ghemawat, Jeff Dean, and others.
      34             : 
      35             : #include <google/protobuf/stubs/hash.h>
      36             : #include <google/protobuf/stubs/common.h>
      37             : #include <google/protobuf/stubs/once.h>
      38             : #include <google/protobuf/extension_set.h>
      39             : #include <google/protobuf/message_lite.h>
      40             : #include <google/protobuf/io/coded_stream.h>
      41             : #include <google/protobuf/wire_format_lite_inl.h>
      42             : #include <google/protobuf/repeated_field.h>
      43             : #include <google/protobuf/stubs/map_util.h>
      44             : 
      45             : namespace google {
      46             : namespace protobuf {
      47             : namespace internal {
      48             : 
      49             : namespace {
      50             : 
      51           0 : inline WireFormatLite::FieldType real_type(FieldType type) {
      52           0 :   GOOGLE_DCHECK(type > 0 && type <= WireFormatLite::MAX_FIELD_TYPE);
      53           0 :   return static_cast<WireFormatLite::FieldType>(type);
      54             : }
      55             : 
      56           0 : inline WireFormatLite::CppType cpp_type(FieldType type) {
      57           0 :   return WireFormatLite::FieldTypeToCppType(real_type(type));
      58             : }
      59             : 
      60           0 : inline bool is_packable(WireFormatLite::WireType type) {
      61           0 :   switch (type) {
      62             :     case WireFormatLite::WIRETYPE_VARINT:
      63             :     case WireFormatLite::WIRETYPE_FIXED64:
      64             :     case WireFormatLite::WIRETYPE_FIXED32:
      65           0 :       return true;
      66             :     case WireFormatLite::WIRETYPE_LENGTH_DELIMITED:
      67             :     case WireFormatLite::WIRETYPE_START_GROUP:
      68             :     case WireFormatLite::WIRETYPE_END_GROUP:
      69           0 :       return false;
      70             : 
      71             :     // Do not add a default statement. Let the compiler complain when someone
      72             :     // adds a new wire type.
      73             :   }
      74           0 : }
      75             : 
      76             : // Registry stuff.
      77             : typedef hash_map<pair<const MessageLite*, int>,
      78             :                  ExtensionInfo> ExtensionRegistry;
      79             : ExtensionRegistry* registry_ = NULL;
      80             : GOOGLE_PROTOBUF_DECLARE_ONCE(registry_init_);
      81             : 
      82           0 : void DeleteRegistry() {
      83           0 :   delete registry_;
      84           0 :   registry_ = NULL;
      85           0 : }
      86             : 
      87           0 : void InitRegistry() {
      88           0 :   registry_ = new ExtensionRegistry;
      89           0 :   OnShutdown(&DeleteRegistry);
      90           0 : }
      91             : 
      92             : // This function is only called at startup, so there is no need for thread-
      93             : // safety.
      94           0 : void Register(const MessageLite* containing_type,
      95             :               int number, ExtensionInfo info) {
      96           0 :   ::google::protobuf::GoogleOnceInit(&registry_init_, &InitRegistry);
      97             : 
      98           0 :   if (!InsertIfNotPresent(registry_, make_pair(containing_type, number),
      99             :                           info)) {
     100           0 :     GOOGLE_LOG(FATAL) << "Multiple extension registrations for type \""
     101           0 :                << containing_type->GetTypeName()
     102           0 :                << "\", field number " << number << ".";
     103             :   }
     104           0 : }
     105             : 
     106           0 : const ExtensionInfo* FindRegisteredExtension(
     107             :     const MessageLite* containing_type, int number) {
     108           0 :   return (registry_ == NULL) ? NULL :
     109           0 :          FindOrNull(*registry_, make_pair(containing_type, number));
     110             : }
     111             : 
     112             : }  // namespace
     113             : 
     114           0 : ExtensionFinder::~ExtensionFinder() {}
     115             : 
     116           0 : bool GeneratedExtensionFinder::Find(int number, ExtensionInfo* output) {
     117             :   const ExtensionInfo* extension =
     118           0 :       FindRegisteredExtension(containing_type_, number);
     119           0 :   if (extension == NULL) {
     120           0 :     return false;
     121             :   } else {
     122           0 :     *output = *extension;
     123           0 :     return true;
     124             :   }
     125             : }
     126             : 
     127           0 : void ExtensionSet::RegisterExtension(const MessageLite* containing_type,
     128             :                                      int number, FieldType type,
     129             :                                      bool is_repeated, bool is_packed) {
     130           0 :   GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_ENUM);
     131           0 :   GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_MESSAGE);
     132           0 :   GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_GROUP);
     133           0 :   ExtensionInfo info(type, is_repeated, is_packed);
     134           0 :   Register(containing_type, number, info);
     135           0 : }
     136             : 
     137           0 : static bool CallNoArgValidityFunc(const void* arg, int number) {
     138             :   // Note:  Must use C-style cast here rather than reinterpret_cast because
     139             :   //   the C++ standard at one point did not allow casts between function and
     140             :   //   data pointers and some compilers enforce this for C++-style casts.  No
     141             :   //   compiler enforces it for C-style casts since lots of C-style code has
     142             :   //   relied on these kinds of casts for a long time, despite being
     143             :   //   technically undefined.  See:
     144             :   //     http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#195
     145             :   // Also note:  Some compilers do not allow function pointers to be "const".
     146             :   //   Which makes sense, I suppose, because it's meaningless.
     147           0 :   return ((EnumValidityFunc*)arg)(number);
     148             : }
     149             : 
     150           0 : void ExtensionSet::RegisterEnumExtension(const MessageLite* containing_type,
     151             :                                          int number, FieldType type,
     152             :                                          bool is_repeated, bool is_packed,
     153             :                                          EnumValidityFunc* is_valid) {
     154           0 :   GOOGLE_CHECK_EQ(type, WireFormatLite::TYPE_ENUM);
     155           0 :   ExtensionInfo info(type, is_repeated, is_packed);
     156           0 :   info.enum_validity_check.func = CallNoArgValidityFunc;
     157             :   // See comment in CallNoArgValidityFunc() about why we use a c-style cast.
     158           0 :   info.enum_validity_check.arg = (void*)is_valid;
     159           0 :   Register(containing_type, number, info);
     160           0 : }
     161             : 
     162           0 : void ExtensionSet::RegisterMessageExtension(const MessageLite* containing_type,
     163             :                                             int number, FieldType type,
     164             :                                             bool is_repeated, bool is_packed,
     165             :                                             const MessageLite* prototype) {
     166           0 :   GOOGLE_CHECK(type == WireFormatLite::TYPE_MESSAGE ||
     167           0 :         type == WireFormatLite::TYPE_GROUP);
     168           0 :   ExtensionInfo info(type, is_repeated, is_packed);
     169           0 :   info.message_prototype = prototype;
     170           0 :   Register(containing_type, number, info);
     171           0 : }
     172             : 
     173             : 
     174             : // ===================================================================
     175             : // Constructors and basic methods.
     176             : 
     177          30 : ExtensionSet::ExtensionSet() {}
     178             : 
     179          18 : ExtensionSet::~ExtensionSet() {
     180          27 :   for (map<int, Extension>::iterator iter = extensions_.begin();
     181          18 :        iter != extensions_.end(); ++iter) {
     182           0 :     iter->second.Free();
     183             :   }
     184           9 : }
     185             : 
     186             : // Defined in extension_set_heavy.cc.
     187             : // void ExtensionSet::AppendToList(const Descriptor* containing_type,
     188             : //                                 const DescriptorPool* pool,
     189             : //                                 vector<const FieldDescriptor*>* output) const
     190             : 
     191           0 : bool ExtensionSet::Has(int number) const {
     192           0 :   map<int, Extension>::const_iterator iter = extensions_.find(number);
     193           0 :   if (iter == extensions_.end()) return false;
     194           0 :   GOOGLE_DCHECK(!iter->second.is_repeated);
     195           0 :   return !iter->second.is_cleared;
     196             : }
     197             : 
     198           0 : int ExtensionSet::NumExtensions() const {
     199           0 :   int result = 0;
     200           0 :   for (map<int, Extension>::const_iterator iter = extensions_.begin();
     201           0 :        iter != extensions_.end(); ++iter) {
     202           0 :     if (!iter->second.is_cleared) {
     203           0 :       ++result;
     204             :     }
     205             :   }
     206           0 :   return result;
     207             : }
     208             : 
     209           0 : int ExtensionSet::ExtensionSize(int number) const {
     210           0 :   map<int, Extension>::const_iterator iter = extensions_.find(number);
     211           0 :   if (iter == extensions_.end()) return false;
     212           0 :   return iter->second.GetSize();
     213             : }
     214             : 
     215           0 : FieldType ExtensionSet::ExtensionType(int number) const {
     216           0 :   map<int, Extension>::const_iterator iter = extensions_.find(number);
     217           0 :   if (iter == extensions_.end()) {
     218           0 :     GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present (1). ";
     219           0 :     return 0;
     220             :   }
     221           0 :   if (iter->second.is_cleared) {
     222           0 :     GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present (2). ";
     223             :   }
     224           0 :   return iter->second.type;
     225             : }
     226             : 
     227           0 : void ExtensionSet::ClearExtension(int number) {
     228           0 :   map<int, Extension>::iterator iter = extensions_.find(number);
     229           0 :   if (iter == extensions_.end()) return;
     230           0 :   iter->second.Clear();
     231             : }
     232             : 
     233             : // ===================================================================
     234             : // Field accessors
     235             : 
     236             : namespace {
     237             : 
     238             : enum Cardinality {
     239             :   REPEATED,
     240             :   OPTIONAL
     241             : };
     242             : 
     243             : }  // namespace
     244             : 
     245             : #define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE)                             \
     246             :   GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? REPEATED : OPTIONAL, LABEL);         \
     247             :   GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), WireFormatLite::CPPTYPE_##CPPTYPE)
     248             : 
     249             : // -------------------------------------------------------------------
     250             : // Primitives
     251             : 
     252             : #define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE)                   \
     253             :                                                                                \
     254             : LOWERCASE ExtensionSet::Get##CAMELCASE(int number,                             \
     255             :                                        LOWERCASE default_value) const {        \
     256             :   map<int, Extension>::const_iterator iter = extensions_.find(number);         \
     257             :   if (iter == extensions_.end() || iter->second.is_cleared) {                  \
     258             :     return default_value;                                                      \
     259             :   } else {                                                                     \
     260             :     GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, UPPERCASE);                            \
     261             :     return iter->second.LOWERCASE##_value;                                     \
     262             :   }                                                                            \
     263             : }                                                                              \
     264             :                                                                                \
     265             : void ExtensionSet::Set##CAMELCASE(int number, FieldType type,                  \
     266             :                                   LOWERCASE value,                             \
     267             :                                   const FieldDescriptor* descriptor) {         \
     268             :   Extension* extension;                                                        \
     269             :   if (MaybeNewExtension(number, descriptor, &extension)) {                     \
     270             :     extension->type = type;                                                    \
     271             :     GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \
     272             :     extension->is_repeated = false;                                            \
     273             :   } else {                                                                     \
     274             :     GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, UPPERCASE);                              \
     275             :   }                                                                            \
     276             :   extension->is_cleared = false;                                               \
     277             :   extension->LOWERCASE##_value = value;                                        \
     278             : }                                                                              \
     279             :                                                                                \
     280             : LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) const {  \
     281             :   map<int, Extension>::const_iterator iter = extensions_.find(number);         \
     282             :   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; \
     283             :   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE);                              \
     284             :   return iter->second.repeated_##LOWERCASE##_value->Get(index);                \
     285             : }                                                                              \
     286             :                                                                                \
     287             : void ExtensionSet::SetRepeated##CAMELCASE(                                     \
     288             :     int number, int index, LOWERCASE value) {                                  \
     289             :   map<int, Extension>::iterator iter = extensions_.find(number);               \
     290             :   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; \
     291             :   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE);                              \
     292             :   iter->second.repeated_##LOWERCASE##_value->Set(index, value);                \
     293             : }                                                                              \
     294             :                                                                                \
     295             : void ExtensionSet::Add##CAMELCASE(int number, FieldType type,                  \
     296             :                                   bool packed, LOWERCASE value,                \
     297             :                                   const FieldDescriptor* descriptor) {         \
     298             :   Extension* extension;                                                        \
     299             :   if (MaybeNewExtension(number, descriptor, &extension)) {                     \
     300             :     extension->type = type;                                                    \
     301             :     GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \
     302             :     extension->is_repeated = true;                                             \
     303             :     extension->is_packed = packed;                                             \
     304             :     extension->repeated_##LOWERCASE##_value = new RepeatedField<LOWERCASE>();  \
     305             :   } else {                                                                     \
     306             :     GOOGLE_DCHECK_TYPE(*extension, REPEATED, UPPERCASE);                              \
     307             :     GOOGLE_DCHECK_EQ(extension->is_packed, packed);                                   \
     308             :   }                                                                            \
     309             :   extension->repeated_##LOWERCASE##_value->Add(value);                         \
     310             : }
     311             : 
     312           0 : PRIMITIVE_ACCESSORS( INT32,  int32,  Int32)
     313           0 : PRIMITIVE_ACCESSORS( INT64,  int64,  Int64)
     314           0 : PRIMITIVE_ACCESSORS(UINT32, uint32, UInt32)
     315           0 : PRIMITIVE_ACCESSORS(UINT64, uint64, UInt64)
     316           0 : PRIMITIVE_ACCESSORS( FLOAT,  float,  Float)
     317           0 : PRIMITIVE_ACCESSORS(DOUBLE, double, Double)
     318           0 : PRIMITIVE_ACCESSORS(  BOOL,   bool,   Bool)
     319             : 
     320             : #undef PRIMITIVE_ACCESSORS
     321             : 
     322           0 : const void* ExtensionSet::GetRawRepeatedField(int number,
     323             :                                               const void* default_value) const {
     324           0 :   map<int, Extension>::const_iterator iter = extensions_.find(number);
     325           0 :   if (iter == extensions_.end()) {
     326           0 :     return default_value;
     327             :   }
     328             :   // We assume that all the RepeatedField<>* pointers have the same
     329             :   // size and alignment within the anonymous union in Extension.
     330           0 :   return iter->second.repeated_int32_value;
     331             : }
     332             : 
     333           0 : void* ExtensionSet::MutableRawRepeatedField(int number, FieldType field_type,
     334             :                                             bool packed,
     335             :                                             const FieldDescriptor* desc) {
     336             :   Extension* extension;
     337             : 
     338             :   // We instantiate an empty Repeated{,Ptr}Field if one doesn't exist for this
     339             :   // extension.
     340           0 :   if (MaybeNewExtension(number, desc, &extension)) {
     341           0 :     extension->is_repeated = true;
     342           0 :     extension->type = field_type;
     343           0 :     extension->is_packed = packed;
     344             : 
     345           0 :     switch (WireFormatLite::FieldTypeToCppType(
     346             :         static_cast<WireFormatLite::FieldType>(field_type))) {
     347             :       case WireFormatLite::CPPTYPE_INT32:
     348           0 :         extension->repeated_int32_value = new RepeatedField<int32>();
     349           0 :         break;
     350             :       case WireFormatLite::CPPTYPE_INT64:
     351           0 :         extension->repeated_int64_value = new RepeatedField<int64>();
     352           0 :         break;
     353             :       case WireFormatLite::CPPTYPE_UINT32:
     354           0 :         extension->repeated_uint32_value = new RepeatedField<uint32>();
     355           0 :         break;
     356             :       case WireFormatLite::CPPTYPE_UINT64:
     357           0 :         extension->repeated_uint64_value = new RepeatedField<uint64>();
     358           0 :         break;
     359             :       case WireFormatLite::CPPTYPE_DOUBLE:
     360           0 :         extension->repeated_double_value = new RepeatedField<double>();
     361           0 :         break;
     362             :       case WireFormatLite::CPPTYPE_FLOAT:
     363           0 :         extension->repeated_float_value = new RepeatedField<float>();
     364           0 :         break;
     365             :       case WireFormatLite::CPPTYPE_BOOL:
     366           0 :         extension->repeated_bool_value = new RepeatedField<bool>();
     367           0 :         break;
     368             :       case WireFormatLite::CPPTYPE_ENUM:
     369           0 :         extension->repeated_enum_value = new RepeatedField<int>();
     370           0 :         break;
     371             :       case WireFormatLite::CPPTYPE_STRING:
     372           0 :         extension->repeated_string_value = new RepeatedPtrField< ::std::string>();
     373           0 :         break;
     374             :       case WireFormatLite::CPPTYPE_MESSAGE:
     375           0 :         extension->repeated_message_value = new RepeatedPtrField<MessageLite>();
     376           0 :         break;
     377             :     }
     378             :   }
     379             : 
     380             :   // We assume that all the RepeatedField<>* pointers have the same
     381             :   // size and alignment within the anonymous union in Extension.
     382           0 :   return extension->repeated_int32_value;
     383             : }
     384             : 
     385             : // Compatible version using old call signature. Does not create extensions when
     386             : // the don't already exist; instead, just GOOGLE_CHECK-fails.
     387           0 : void* ExtensionSet::MutableRawRepeatedField(int number) {
     388           0 :   map<int, Extension>::iterator iter = extensions_.find(number);
     389           0 :   GOOGLE_CHECK(iter == extensions_.end()) << "Extension not found.";
     390             :   // We assume that all the RepeatedField<>* pointers have the same
     391             :   // size and alignment within the anonymous union in Extension.
     392           0 :   return iter->second.repeated_int32_value;
     393             : }
     394             : 
     395             : 
     396             : // -------------------------------------------------------------------
     397             : // Enums
     398             : 
     399           0 : int ExtensionSet::GetEnum(int number, int default_value) const {
     400           0 :   map<int, Extension>::const_iterator iter = extensions_.find(number);
     401           0 :   if (iter == extensions_.end() || iter->second.is_cleared) {
     402             :     // Not present.  Return the default value.
     403           0 :     return default_value;
     404             :   } else {
     405           0 :     GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, ENUM);
     406           0 :     return iter->second.enum_value;
     407             :   }
     408             : }
     409             : 
     410           0 : void ExtensionSet::SetEnum(int number, FieldType type, int value,
     411             :                            const FieldDescriptor* descriptor) {
     412             :   Extension* extension;
     413           0 :   if (MaybeNewExtension(number, descriptor, &extension)) {
     414           0 :     extension->type = type;
     415           0 :     GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM);
     416           0 :     extension->is_repeated = false;
     417             :   } else {
     418           0 :     GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, ENUM);
     419             :   }
     420           0 :   extension->is_cleared = false;
     421           0 :   extension->enum_value = value;
     422           0 : }
     423             : 
     424           0 : int ExtensionSet::GetRepeatedEnum(int number, int index) const {
     425           0 :   map<int, Extension>::const_iterator iter = extensions_.find(number);
     426           0 :   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
     427           0 :   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM);
     428           0 :   return iter->second.repeated_enum_value->Get(index);
     429             : }
     430             : 
     431           0 : void ExtensionSet::SetRepeatedEnum(int number, int index, int value) {
     432           0 :   map<int, Extension>::iterator iter = extensions_.find(number);
     433           0 :   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
     434           0 :   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM);
     435           0 :   iter->second.repeated_enum_value->Set(index, value);
     436           0 : }
     437             : 
     438           0 : void ExtensionSet::AddEnum(int number, FieldType type,
     439             :                            bool packed, int value,
     440             :                            const FieldDescriptor* descriptor) {
     441             :   Extension* extension;
     442           0 :   if (MaybeNewExtension(number, descriptor, &extension)) {
     443           0 :     extension->type = type;
     444           0 :     GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM);
     445           0 :     extension->is_repeated = true;
     446           0 :     extension->is_packed = packed;
     447           0 :     extension->repeated_enum_value = new RepeatedField<int>();
     448             :   } else {
     449           0 :     GOOGLE_DCHECK_TYPE(*extension, REPEATED, ENUM);
     450           0 :     GOOGLE_DCHECK_EQ(extension->is_packed, packed);
     451             :   }
     452           0 :   extension->repeated_enum_value->Add(value);
     453           0 : }
     454             : 
     455             : // -------------------------------------------------------------------
     456             : // Strings
     457             : 
     458           0 : const string& ExtensionSet::GetString(int number,
     459             :                                       const string& default_value) const {
     460           0 :   map<int, Extension>::const_iterator iter = extensions_.find(number);
     461           0 :   if (iter == extensions_.end() || iter->second.is_cleared) {
     462             :     // Not present.  Return the default value.
     463           0 :     return default_value;
     464             :   } else {
     465           0 :     GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, STRING);
     466           0 :     return *iter->second.string_value;
     467             :   }
     468             : }
     469             : 
     470           0 : string* ExtensionSet::MutableString(int number, FieldType type,
     471             :                                     const FieldDescriptor* descriptor) {
     472             :   Extension* extension;
     473           0 :   if (MaybeNewExtension(number, descriptor, &extension)) {
     474           0 :     extension->type = type;
     475           0 :     GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);
     476           0 :     extension->is_repeated = false;
     477           0 :     extension->string_value = new string;
     478             :   } else {
     479           0 :     GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, STRING);
     480             :   }
     481           0 :   extension->is_cleared = false;
     482           0 :   return extension->string_value;
     483             : }
     484             : 
     485           0 : const string& ExtensionSet::GetRepeatedString(int number, int index) const {
     486           0 :   map<int, Extension>::const_iterator iter = extensions_.find(number);
     487           0 :   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
     488           0 :   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);
     489           0 :   return iter->second.repeated_string_value->Get(index);
     490             : }
     491             : 
     492           0 : string* ExtensionSet::MutableRepeatedString(int number, int index) {
     493           0 :   map<int, Extension>::iterator iter = extensions_.find(number);
     494           0 :   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
     495           0 :   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);
     496           0 :   return iter->second.repeated_string_value->Mutable(index);
     497             : }
     498             : 
     499           0 : string* ExtensionSet::AddString(int number, FieldType type,
     500             :                                 const FieldDescriptor* descriptor) {
     501             :   Extension* extension;
     502           0 :   if (MaybeNewExtension(number, descriptor, &extension)) {
     503           0 :     extension->type = type;
     504           0 :     GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);
     505           0 :     extension->is_repeated = true;
     506           0 :     extension->is_packed = false;
     507           0 :     extension->repeated_string_value = new RepeatedPtrField<string>();
     508             :   } else {
     509           0 :     GOOGLE_DCHECK_TYPE(*extension, REPEATED, STRING);
     510             :   }
     511           0 :   return extension->repeated_string_value->Add();
     512             : }
     513             : 
     514             : // -------------------------------------------------------------------
     515             : // Messages
     516             : 
     517           0 : const MessageLite& ExtensionSet::GetMessage(
     518             :     int number, const MessageLite& default_value) const {
     519           0 :   map<int, Extension>::const_iterator iter = extensions_.find(number);
     520           0 :   if (iter == extensions_.end()) {
     521             :     // Not present.  Return the default value.
     522           0 :     return default_value;
     523             :   } else {
     524           0 :     GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);
     525           0 :     if (iter->second.is_lazy) {
     526           0 :       return iter->second.lazymessage_value->GetMessage(default_value);
     527             :     } else {
     528           0 :       return *iter->second.message_value;
     529             :     }
     530             :   }
     531             : }
     532             : 
     533             : // Defined in extension_set_heavy.cc.
     534             : // const MessageLite& ExtensionSet::GetMessage(int number,
     535             : //                                             const Descriptor* message_type,
     536             : //                                             MessageFactory* factory) const
     537             : 
     538           0 : MessageLite* ExtensionSet::MutableMessage(int number, FieldType type,
     539             :                                           const MessageLite& prototype,
     540             :                                           const FieldDescriptor* descriptor) {
     541             :   Extension* extension;
     542           0 :   if (MaybeNewExtension(number, descriptor, &extension)) {
     543           0 :     extension->type = type;
     544           0 :     GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE);
     545           0 :     extension->is_repeated = false;
     546           0 :     extension->is_lazy = false;
     547           0 :     extension->message_value = prototype.New();
     548           0 :     extension->is_cleared = false;
     549           0 :     return extension->message_value;
     550             :   } else {
     551           0 :     GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE);
     552           0 :     extension->is_cleared = false;
     553           0 :     if (extension->is_lazy) {
     554           0 :       return extension->lazymessage_value->MutableMessage(prototype);
     555             :     } else {
     556           0 :       return extension->message_value;
     557             :     }
     558             :   }
     559             : }
     560             : 
     561             : // Defined in extension_set_heavy.cc.
     562             : // MessageLite* ExtensionSet::MutableMessage(int number, FieldType type,
     563             : //                                           const Descriptor* message_type,
     564             : //                                           MessageFactory* factory)
     565             : 
     566           0 : void ExtensionSet::SetAllocatedMessage(int number, FieldType type,
     567             :                                        const FieldDescriptor* descriptor,
     568             :                                        MessageLite* message) {
     569           0 :   if (message == NULL) {
     570           0 :     ClearExtension(number);
     571           0 :     return;
     572             :   }
     573             :   Extension* extension;
     574           0 :   if (MaybeNewExtension(number, descriptor, &extension)) {
     575           0 :     extension->type = type;
     576           0 :     GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE);
     577           0 :     extension->is_repeated = false;
     578           0 :     extension->is_lazy = false;
     579           0 :     extension->message_value = message;
     580             :   } else {
     581           0 :     GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE);
     582           0 :     if (extension->is_lazy) {
     583           0 :       extension->lazymessage_value->SetAllocatedMessage(message);
     584             :     } else {
     585           0 :       delete extension->message_value;
     586           0 :       extension->message_value = message;
     587             :     }
     588             :   }
     589           0 :   extension->is_cleared = false;
     590             : }
     591             : 
     592           0 : MessageLite* ExtensionSet::ReleaseMessage(int number,
     593             :                                           const MessageLite& prototype) {
     594           0 :   map<int, Extension>::iterator iter = extensions_.find(number);
     595           0 :   if (iter == extensions_.end()) {
     596             :     // Not present.  Return NULL.
     597           0 :     return NULL;
     598             :   } else {
     599           0 :     GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);
     600           0 :     MessageLite* ret = NULL;
     601           0 :     if (iter->second.is_lazy) {
     602           0 :       ret = iter->second.lazymessage_value->ReleaseMessage(prototype);
     603           0 :       delete iter->second.lazymessage_value;
     604             :     } else {
     605           0 :       ret = iter->second.message_value;
     606             :     }
     607           0 :     extensions_.erase(number);
     608           0 :     return ret;
     609             :   }
     610             : }
     611             : 
     612             : // Defined in extension_set_heavy.cc.
     613             : // MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor,
     614             : //                                           MessageFactory* factory);
     615             : 
     616           0 : const MessageLite& ExtensionSet::GetRepeatedMessage(
     617             :     int number, int index) const {
     618           0 :   map<int, Extension>::const_iterator iter = extensions_.find(number);
     619           0 :   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
     620           0 :   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE);
     621           0 :   return iter->second.repeated_message_value->Get(index);
     622             : }
     623             : 
     624           0 : MessageLite* ExtensionSet::MutableRepeatedMessage(int number, int index) {
     625           0 :   map<int, Extension>::iterator iter = extensions_.find(number);
     626           0 :   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
     627           0 :   GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE);
     628           0 :   return iter->second.repeated_message_value->Mutable(index);
     629             : }
     630             : 
     631           0 : MessageLite* ExtensionSet::AddMessage(int number, FieldType type,
     632             :                                       const MessageLite& prototype,
     633             :                                       const FieldDescriptor* descriptor) {
     634             :   Extension* extension;
     635           0 :   if (MaybeNewExtension(number, descriptor, &extension)) {
     636           0 :     extension->type = type;
     637           0 :     GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE);
     638           0 :     extension->is_repeated = true;
     639           0 :     extension->repeated_message_value =
     640           0 :       new RepeatedPtrField<MessageLite>();
     641             :   } else {
     642           0 :     GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE);
     643             :   }
     644             : 
     645             :   // RepeatedPtrField<MessageLite> does not know how to Add() since it cannot
     646             :   // allocate an abstract object, so we have to be tricky.
     647           0 :   MessageLite* result = extension->repeated_message_value
     648           0 :       ->AddFromCleared<GenericTypeHandler<MessageLite> >();
     649           0 :   if (result == NULL) {
     650           0 :     result = prototype.New();
     651           0 :     extension->repeated_message_value->AddAllocated(result);
     652             :   }
     653           0 :   return result;
     654             : }
     655             : 
     656             : // Defined in extension_set_heavy.cc.
     657             : // MessageLite* ExtensionSet::AddMessage(int number, FieldType type,
     658             : //                                       const Descriptor* message_type,
     659             : //                                       MessageFactory* factory)
     660             : 
     661             : #undef GOOGLE_DCHECK_TYPE
     662             : 
     663           0 : void ExtensionSet::RemoveLast(int number) {
     664           0 :   map<int, Extension>::iterator iter = extensions_.find(number);
     665           0 :   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
     666             : 
     667           0 :   Extension* extension = &iter->second;
     668           0 :   GOOGLE_DCHECK(extension->is_repeated);
     669             : 
     670           0 :   switch(cpp_type(extension->type)) {
     671             :     case WireFormatLite::CPPTYPE_INT32:
     672           0 :       extension->repeated_int32_value->RemoveLast();
     673           0 :       break;
     674             :     case WireFormatLite::CPPTYPE_INT64:
     675           0 :       extension->repeated_int64_value->RemoveLast();
     676           0 :       break;
     677             :     case WireFormatLite::CPPTYPE_UINT32:
     678           0 :       extension->repeated_uint32_value->RemoveLast();
     679           0 :       break;
     680             :     case WireFormatLite::CPPTYPE_UINT64:
     681           0 :       extension->repeated_uint64_value->RemoveLast();
     682           0 :       break;
     683             :     case WireFormatLite::CPPTYPE_FLOAT:
     684           0 :       extension->repeated_float_value->RemoveLast();
     685           0 :       break;
     686             :     case WireFormatLite::CPPTYPE_DOUBLE:
     687           0 :       extension->repeated_double_value->RemoveLast();
     688           0 :       break;
     689             :     case WireFormatLite::CPPTYPE_BOOL:
     690           0 :       extension->repeated_bool_value->RemoveLast();
     691           0 :       break;
     692             :     case WireFormatLite::CPPTYPE_ENUM:
     693           0 :       extension->repeated_enum_value->RemoveLast();
     694           0 :       break;
     695             :     case WireFormatLite::CPPTYPE_STRING:
     696           0 :       extension->repeated_string_value->RemoveLast();
     697           0 :       break;
     698             :     case WireFormatLite::CPPTYPE_MESSAGE:
     699           0 :       extension->repeated_message_value->RemoveLast();
     700           0 :       break;
     701             :   }
     702           0 : }
     703             : 
     704           0 : MessageLite* ExtensionSet::ReleaseLast(int number) {
     705           0 :   map<int, Extension>::iterator iter = extensions_.find(number);
     706           0 :   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
     707             : 
     708           0 :   Extension* extension = &iter->second;
     709           0 :   GOOGLE_DCHECK(extension->is_repeated);
     710           0 :   GOOGLE_DCHECK(cpp_type(extension->type) == WireFormatLite::CPPTYPE_MESSAGE);
     711           0 :   return extension->repeated_message_value->ReleaseLast();
     712             : }
     713             : 
     714           0 : void ExtensionSet::SwapElements(int number, int index1, int index2) {
     715           0 :   map<int, Extension>::iterator iter = extensions_.find(number);
     716           0 :   GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty).";
     717             : 
     718           0 :   Extension* extension = &iter->second;
     719           0 :   GOOGLE_DCHECK(extension->is_repeated);
     720             : 
     721           0 :   switch(cpp_type(extension->type)) {
     722             :     case WireFormatLite::CPPTYPE_INT32:
     723           0 :       extension->repeated_int32_value->SwapElements(index1, index2);
     724           0 :       break;
     725             :     case WireFormatLite::CPPTYPE_INT64:
     726           0 :       extension->repeated_int64_value->SwapElements(index1, index2);
     727           0 :       break;
     728             :     case WireFormatLite::CPPTYPE_UINT32:
     729           0 :       extension->repeated_uint32_value->SwapElements(index1, index2);
     730           0 :       break;
     731             :     case WireFormatLite::CPPTYPE_UINT64:
     732           0 :       extension->repeated_uint64_value->SwapElements(index1, index2);
     733           0 :       break;
     734             :     case WireFormatLite::CPPTYPE_FLOAT:
     735           0 :       extension->repeated_float_value->SwapElements(index1, index2);
     736           0 :       break;
     737             :     case WireFormatLite::CPPTYPE_DOUBLE:
     738           0 :       extension->repeated_double_value->SwapElements(index1, index2);
     739           0 :       break;
     740             :     case WireFormatLite::CPPTYPE_BOOL:
     741           0 :       extension->repeated_bool_value->SwapElements(index1, index2);
     742           0 :       break;
     743             :     case WireFormatLite::CPPTYPE_ENUM:
     744           0 :       extension->repeated_enum_value->SwapElements(index1, index2);
     745           0 :       break;
     746             :     case WireFormatLite::CPPTYPE_STRING:
     747           0 :       extension->repeated_string_value->SwapElements(index1, index2);
     748           0 :       break;
     749             :     case WireFormatLite::CPPTYPE_MESSAGE:
     750           0 :       extension->repeated_message_value->SwapElements(index1, index2);
     751           0 :       break;
     752             :   }
     753           0 : }
     754             : 
     755             : // ===================================================================
     756             : 
     757           0 : void ExtensionSet::Clear() {
     758           0 :   for (map<int, Extension>::iterator iter = extensions_.begin();
     759           0 :        iter != extensions_.end(); ++iter) {
     760           0 :     iter->second.Clear();
     761             :   }
     762           0 : }
     763             : 
     764           0 : void ExtensionSet::MergeFrom(const ExtensionSet& other) {
     765           0 :   for (map<int, Extension>::const_iterator iter = other.extensions_.begin();
     766           0 :        iter != other.extensions_.end(); ++iter) {
     767           0 :     const Extension& other_extension = iter->second;
     768             : 
     769           0 :     if (other_extension.is_repeated) {
     770             :       Extension* extension;
     771           0 :       bool is_new = MaybeNewExtension(iter->first, other_extension.descriptor,
     772           0 :                                       &extension);
     773           0 :       if (is_new) {
     774             :         // Extension did not already exist in set.
     775           0 :         extension->type = other_extension.type;
     776           0 :         extension->is_packed = other_extension.is_packed;
     777           0 :         extension->is_repeated = true;
     778             :       } else {
     779           0 :         GOOGLE_DCHECK_EQ(extension->type, other_extension.type);
     780           0 :         GOOGLE_DCHECK_EQ(extension->is_packed, other_extension.is_packed);
     781           0 :         GOOGLE_DCHECK(extension->is_repeated);
     782             :       }
     783             : 
     784           0 :       switch (cpp_type(other_extension.type)) {
     785             : #define HANDLE_TYPE(UPPERCASE, LOWERCASE, REPEATED_TYPE)             \
     786             :         case WireFormatLite::CPPTYPE_##UPPERCASE:                    \
     787             :           if (is_new) {                                              \
     788             :             extension->repeated_##LOWERCASE##_value =                \
     789             :               new REPEATED_TYPE;                                     \
     790             :           }                                                          \
     791             :           extension->repeated_##LOWERCASE##_value->MergeFrom(        \
     792             :             *other_extension.repeated_##LOWERCASE##_value);          \
     793             :           break;
     794             : 
     795           0 :         HANDLE_TYPE(  INT32,   int32, RepeatedField   <  int32>);
     796           0 :         HANDLE_TYPE(  INT64,   int64, RepeatedField   <  int64>);
     797           0 :         HANDLE_TYPE( UINT32,  uint32, RepeatedField   < uint32>);
     798           0 :         HANDLE_TYPE( UINT64,  uint64, RepeatedField   < uint64>);
     799           0 :         HANDLE_TYPE(  FLOAT,   float, RepeatedField   <  float>);
     800           0 :         HANDLE_TYPE( DOUBLE,  double, RepeatedField   < double>);
     801           0 :         HANDLE_TYPE(   BOOL,    bool, RepeatedField   <   bool>);
     802           0 :         HANDLE_TYPE(   ENUM,    enum, RepeatedField   <    int>);
     803           0 :         HANDLE_TYPE( STRING,  string, RepeatedPtrField< string>);
     804             : #undef HANDLE_TYPE
     805             : 
     806             :         case WireFormatLite::CPPTYPE_MESSAGE:
     807           0 :           if (is_new) {
     808           0 :             extension->repeated_message_value =
     809           0 :               new RepeatedPtrField<MessageLite>();
     810             :           }
     811             :           // We can't call RepeatedPtrField<MessageLite>::MergeFrom() because
     812             :           // it would attempt to allocate new objects.
     813             :           RepeatedPtrField<MessageLite>* other_repeated_message =
     814           0 :               other_extension.repeated_message_value;
     815           0 :           for (int i = 0; i < other_repeated_message->size(); i++) {
     816           0 :             const MessageLite& other_message = other_repeated_message->Get(i);
     817           0 :             MessageLite* target = extension->repeated_message_value
     818           0 :                      ->AddFromCleared<GenericTypeHandler<MessageLite> >();
     819           0 :             if (target == NULL) {
     820           0 :               target = other_message.New();
     821           0 :               extension->repeated_message_value->AddAllocated(target);
     822             :             }
     823           0 :             target->CheckTypeAndMergeFrom(other_message);
     824             :           }
     825           0 :           break;
     826             :       }
     827             :     } else {
     828           0 :       if (!other_extension.is_cleared) {
     829           0 :         switch (cpp_type(other_extension.type)) {
     830             : #define HANDLE_TYPE(UPPERCASE, LOWERCASE, CAMELCASE)                         \
     831             :           case WireFormatLite::CPPTYPE_##UPPERCASE:                          \
     832             :             Set##CAMELCASE(iter->first, other_extension.type,                \
     833             :                            other_extension.LOWERCASE##_value,                \
     834             :                            other_extension.descriptor);                      \
     835             :             break;
     836             : 
     837           0 :           HANDLE_TYPE( INT32,  int32,  Int32);
     838           0 :           HANDLE_TYPE( INT64,  int64,  Int64);
     839           0 :           HANDLE_TYPE(UINT32, uint32, UInt32);
     840           0 :           HANDLE_TYPE(UINT64, uint64, UInt64);
     841           0 :           HANDLE_TYPE( FLOAT,  float,  Float);
     842           0 :           HANDLE_TYPE(DOUBLE, double, Double);
     843           0 :           HANDLE_TYPE(  BOOL,   bool,   Bool);
     844           0 :           HANDLE_TYPE(  ENUM,   enum,   Enum);
     845             : #undef HANDLE_TYPE
     846             :           case WireFormatLite::CPPTYPE_STRING:
     847           0 :             SetString(iter->first, other_extension.type,
     848           0 :                       *other_extension.string_value,
     849           0 :                       other_extension.descriptor);
     850           0 :             break;
     851             :           case WireFormatLite::CPPTYPE_MESSAGE: {
     852             :             Extension* extension;
     853           0 :             bool is_new = MaybeNewExtension(iter->first,
     854           0 :                                             other_extension.descriptor,
     855           0 :                                             &extension);
     856           0 :             if (is_new) {
     857           0 :               extension->type = other_extension.type;
     858           0 :               extension->is_packed = other_extension.is_packed;
     859           0 :               extension->is_repeated = false;
     860           0 :               if (other_extension.is_lazy) {
     861           0 :                 extension->is_lazy = true;
     862           0 :                 extension->lazymessage_value =
     863           0 :                     other_extension.lazymessage_value->New();
     864           0 :                 extension->lazymessage_value->MergeFrom(
     865           0 :                     *other_extension.lazymessage_value);
     866             :               } else {
     867           0 :                 extension->is_lazy = false;
     868           0 :                 extension->message_value =
     869           0 :                     other_extension.message_value->New();
     870           0 :                 extension->message_value->CheckTypeAndMergeFrom(
     871           0 :                     *other_extension.message_value);
     872             :               }
     873             :             } else {
     874           0 :               GOOGLE_DCHECK_EQ(extension->type, other_extension.type);
     875           0 :               GOOGLE_DCHECK_EQ(extension->is_packed,other_extension.is_packed);
     876           0 :               GOOGLE_DCHECK(!extension->is_repeated);
     877           0 :               if (other_extension.is_lazy) {
     878           0 :                 if (extension->is_lazy) {
     879           0 :                   extension->lazymessage_value->MergeFrom(
     880           0 :                       *other_extension.lazymessage_value);
     881             :                 } else {
     882           0 :                   extension->message_value->CheckTypeAndMergeFrom(
     883           0 :                       other_extension.lazymessage_value->GetMessage(
     884           0 :                           *extension->message_value));
     885             :                 }
     886             :               } else {
     887           0 :                 if (extension->is_lazy) {
     888           0 :                   extension->lazymessage_value->MutableMessage(
     889           0 :                       *other_extension.message_value)->CheckTypeAndMergeFrom(
     890           0 :                           *other_extension.message_value);
     891             :                 } else {
     892           0 :                   extension->message_value->CheckTypeAndMergeFrom(
     893           0 :                       *other_extension.message_value);
     894             :                 }
     895             :               }
     896             :             }
     897           0 :             extension->is_cleared = false;
     898           0 :             break;
     899             :           }
     900             :         }
     901             :       }
     902             :     }
     903             :   }
     904           0 : }
     905             : 
     906           0 : void ExtensionSet::Swap(ExtensionSet* x) {
     907           0 :   extensions_.swap(x->extensions_);
     908           0 : }
     909             : 
     910           0 : void ExtensionSet::SwapExtension(ExtensionSet* other,
     911             :                                  int number) {
     912           0 :   if (this == other) return;
     913           0 :   map<int, Extension>::iterator this_iter = extensions_.find(number);
     914           0 :   map<int, Extension>::iterator other_iter = other->extensions_.find(number);
     915             : 
     916           0 :   if (this_iter == extensions_.end() &&
     917           0 :       other_iter == other->extensions_.end()) {
     918           0 :     return;
     919             :   }
     920             : 
     921           0 :   if (this_iter != extensions_.end() &&
     922           0 :       other_iter != other->extensions_.end()) {
     923           0 :     std::swap(this_iter->second, other_iter->second);
     924           0 :     return;
     925             :   }
     926             : 
     927           0 :   if (this_iter == extensions_.end()) {
     928           0 :     extensions_.insert(make_pair(number, other_iter->second));
     929           0 :     other->extensions_.erase(number);
     930           0 :     return;
     931             :   }
     932             : 
     933           0 :   if (other_iter == other->extensions_.end()) {
     934           0 :     other->extensions_.insert(make_pair(number, this_iter->second));
     935           0 :     extensions_.erase(number);
     936           0 :     return;
     937             :   }
     938             : }
     939             : 
     940           9 : bool ExtensionSet::IsInitialized() const {
     941             :   // Extensions are never required.  However, we need to check that all
     942             :   // embedded messages are initialized.
     943          27 :   for (map<int, Extension>::const_iterator iter = extensions_.begin();
     944          18 :        iter != extensions_.end(); ++iter) {
     945           0 :     const Extension& extension = iter->second;
     946           0 :     if (cpp_type(extension.type) == WireFormatLite::CPPTYPE_MESSAGE) {
     947           0 :       if (extension.is_repeated) {
     948           0 :         for (int i = 0; i < extension.repeated_message_value->size(); i++) {
     949           0 :           if (!extension.repeated_message_value->Get(i).IsInitialized()) {
     950           0 :             return false;
     951             :           }
     952             :         }
     953             :       } else {
     954           0 :         if (!extension.is_cleared) {
     955           0 :           if (extension.is_lazy) {
     956           0 :             if (!extension.lazymessage_value->IsInitialized()) return false;
     957             :           } else {
     958           0 :             if (!extension.message_value->IsInitialized()) return false;
     959             :           }
     960             :         }
     961             :       }
     962             :     }
     963             :   }
     964             : 
     965           9 :   return true;
     966             : }
     967             : 
     968           0 : bool ExtensionSet::FindExtensionInfoFromTag(
     969             :     uint32 tag, ExtensionFinder* extension_finder, int* field_number,
     970             :     ExtensionInfo* extension, bool* was_packed_on_wire) {
     971           0 :   *field_number = WireFormatLite::GetTagFieldNumber(tag);
     972           0 :   WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag);
     973           0 :   return FindExtensionInfoFromFieldNumber(wire_type, *field_number,
     974             :                                           extension_finder, extension,
     975           0 :                                           was_packed_on_wire);
     976             : }
     977             : 
     978           0 : bool ExtensionSet::FindExtensionInfoFromFieldNumber(
     979             :     int wire_type, int field_number, ExtensionFinder* extension_finder,
     980             :     ExtensionInfo* extension, bool* was_packed_on_wire) {
     981           0 :   if (!extension_finder->Find(field_number, extension)) {
     982           0 :     return false;
     983             :   }
     984             : 
     985             :   WireFormatLite::WireType expected_wire_type =
     986           0 :       WireFormatLite::WireTypeForFieldType(real_type(extension->type));
     987             : 
     988             :   // Check if this is a packed field.
     989           0 :   *was_packed_on_wire = false;
     990           0 :   if (extension->is_repeated &&
     991           0 :       wire_type == WireFormatLite::WIRETYPE_LENGTH_DELIMITED &&
     992           0 :       is_packable(expected_wire_type)) {
     993           0 :     *was_packed_on_wire = true;
     994           0 :     return true;
     995             :   }
     996             :   // Otherwise the wire type must match.
     997           0 :   return expected_wire_type == wire_type;
     998             : }
     999             : 
    1000           0 : bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
    1001             :                               ExtensionFinder* extension_finder,
    1002             :                               FieldSkipper* field_skipper) {
    1003             :   int number;
    1004             :   bool was_packed_on_wire;
    1005           0 :   ExtensionInfo extension;
    1006           0 :   if (!FindExtensionInfoFromTag(
    1007             :       tag, extension_finder, &number, &extension, &was_packed_on_wire)) {
    1008           0 :     return field_skipper->SkipField(input, tag);
    1009             :   } else {
    1010           0 :     return ParseFieldWithExtensionInfo(
    1011           0 :         number, was_packed_on_wire, extension, input, field_skipper);
    1012             :   }
    1013             : }
    1014             : 
    1015           0 : bool ExtensionSet::ParseFieldWithExtensionInfo(
    1016             :     int number, bool was_packed_on_wire, const ExtensionInfo& extension,
    1017             :     io::CodedInputStream* input,
    1018             :     FieldSkipper* field_skipper) {
    1019             :   // Explicitly not read extension.is_packed, instead check whether the field
    1020             :   // was encoded in packed form on the wire.
    1021           0 :   if (was_packed_on_wire) {
    1022             :     uint32 size;
    1023           0 :     if (!input->ReadVarint32(&size)) return false;
    1024           0 :     io::CodedInputStream::Limit limit = input->PushLimit(size);
    1025             : 
    1026           0 :     switch (extension.type) {
    1027             : #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE)        \
    1028             :       case WireFormatLite::TYPE_##UPPERCASE:                                   \
    1029             :         while (input->BytesUntilLimit() > 0) {                                 \
    1030             :           CPP_LOWERCASE value;                                                 \
    1031             :           if (!WireFormatLite::ReadPrimitive<                                  \
    1032             :                   CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>(            \
    1033             :                 input, &value)) return false;                                  \
    1034             :           Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE,         \
    1035             :                              extension.is_packed, value,                       \
    1036             :                              extension.descriptor);                            \
    1037             :         }                                                                      \
    1038             :         break
    1039             : 
    1040           0 :       HANDLE_TYPE(   INT32,  Int32,   int32);
    1041           0 :       HANDLE_TYPE(   INT64,  Int64,   int64);
    1042           0 :       HANDLE_TYPE(  UINT32, UInt32,  uint32);
    1043           0 :       HANDLE_TYPE(  UINT64, UInt64,  uint64);
    1044           0 :       HANDLE_TYPE(  SINT32,  Int32,   int32);
    1045           0 :       HANDLE_TYPE(  SINT64,  Int64,   int64);
    1046           0 :       HANDLE_TYPE( FIXED32, UInt32,  uint32);
    1047           0 :       HANDLE_TYPE( FIXED64, UInt64,  uint64);
    1048           0 :       HANDLE_TYPE(SFIXED32,  Int32,   int32);
    1049           0 :       HANDLE_TYPE(SFIXED64,  Int64,   int64);
    1050           0 :       HANDLE_TYPE(   FLOAT,  Float,   float);
    1051           0 :       HANDLE_TYPE(  DOUBLE, Double,  double);
    1052           0 :       HANDLE_TYPE(    BOOL,   Bool,    bool);
    1053             : #undef HANDLE_TYPE
    1054             : 
    1055             :       case WireFormatLite::TYPE_ENUM:
    1056           0 :         while (input->BytesUntilLimit() > 0) {
    1057             :           int value;
    1058           0 :           if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
    1059           0 :                   input, &value)) return false;
    1060           0 :           if (extension.enum_validity_check.func(
    1061           0 :                   extension.enum_validity_check.arg, value)) {
    1062           0 :             AddEnum(number, WireFormatLite::TYPE_ENUM, extension.is_packed,
    1063           0 :                     value, extension.descriptor);
    1064             :           }
    1065             :         }
    1066           0 :         break;
    1067             : 
    1068             :       case WireFormatLite::TYPE_STRING:
    1069             :       case WireFormatLite::TYPE_BYTES:
    1070             :       case WireFormatLite::TYPE_GROUP:
    1071             :       case WireFormatLite::TYPE_MESSAGE:
    1072           0 :         GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed.";
    1073           0 :         break;
    1074             :     }
    1075             : 
    1076           0 :     input->PopLimit(limit);
    1077             :   } else {
    1078           0 :     switch (extension.type) {
    1079             : #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE)                   \
    1080             :       case WireFormatLite::TYPE_##UPPERCASE: {                                 \
    1081             :         CPP_LOWERCASE value;                                                   \
    1082             :         if (!WireFormatLite::ReadPrimitive<                                    \
    1083             :                 CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>(              \
    1084             :                input, &value)) return false;                                   \
    1085             :         if (extension.is_repeated) {                                           \
    1086             :           Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE,         \
    1087             :                              extension.is_packed, value,                       \
    1088             :                              extension.descriptor);                            \
    1089             :         } else {                                                               \
    1090             :           Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value,  \
    1091             :                              extension.descriptor);                            \
    1092             :         }                                                                      \
    1093             :       } break
    1094             : 
    1095           0 :       HANDLE_TYPE(   INT32,  Int32,   int32);
    1096           0 :       HANDLE_TYPE(   INT64,  Int64,   int64);
    1097           0 :       HANDLE_TYPE(  UINT32, UInt32,  uint32);
    1098           0 :       HANDLE_TYPE(  UINT64, UInt64,  uint64);
    1099           0 :       HANDLE_TYPE(  SINT32,  Int32,   int32);
    1100           0 :       HANDLE_TYPE(  SINT64,  Int64,   int64);
    1101           0 :       HANDLE_TYPE( FIXED32, UInt32,  uint32);
    1102           0 :       HANDLE_TYPE( FIXED64, UInt64,  uint64);
    1103           0 :       HANDLE_TYPE(SFIXED32,  Int32,   int32);
    1104           0 :       HANDLE_TYPE(SFIXED64,  Int64,   int64);
    1105           0 :       HANDLE_TYPE(   FLOAT,  Float,   float);
    1106           0 :       HANDLE_TYPE(  DOUBLE, Double,  double);
    1107           0 :       HANDLE_TYPE(    BOOL,   Bool,    bool);
    1108             : #undef HANDLE_TYPE
    1109             : 
    1110             :       case WireFormatLite::TYPE_ENUM: {
    1111             :         int value;
    1112           0 :         if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
    1113           0 :                 input, &value)) return false;
    1114             : 
    1115           0 :         if (!extension.enum_validity_check.func(
    1116           0 :                 extension.enum_validity_check.arg, value)) {
    1117             :           // Invalid value.  Treat as unknown.
    1118           0 :           field_skipper->SkipUnknownEnum(number, value);
    1119           0 :         } else if (extension.is_repeated) {
    1120           0 :           AddEnum(number, WireFormatLite::TYPE_ENUM, extension.is_packed, value,
    1121           0 :                   extension.descriptor);
    1122             :         } else {
    1123             :           SetEnum(number, WireFormatLite::TYPE_ENUM, value,
    1124           0 :                   extension.descriptor);
    1125             :         }
    1126           0 :         break;
    1127             :       }
    1128             : 
    1129             :       case WireFormatLite::TYPE_STRING:  {
    1130           0 :         string* value = extension.is_repeated ?
    1131           0 :           AddString(number, WireFormatLite::TYPE_STRING, extension.descriptor) :
    1132             :           MutableString(number, WireFormatLite::TYPE_STRING,
    1133           0 :                         extension.descriptor);
    1134           0 :         if (!WireFormatLite::ReadString(input, value)) return false;
    1135           0 :         break;
    1136             :       }
    1137             : 
    1138             :       case WireFormatLite::TYPE_BYTES:  {
    1139           0 :         string* value = extension.is_repeated ?
    1140           0 :           AddString(number, WireFormatLite::TYPE_BYTES, extension.descriptor) :
    1141             :           MutableString(number, WireFormatLite::TYPE_BYTES,
    1142           0 :                         extension.descriptor);
    1143           0 :         if (!WireFormatLite::ReadBytes(input, value)) return false;
    1144           0 :         break;
    1145             :       }
    1146             : 
    1147             :       case WireFormatLite::TYPE_GROUP: {
    1148           0 :         MessageLite* value = extension.is_repeated ?
    1149             :             AddMessage(number, WireFormatLite::TYPE_GROUP,
    1150           0 :                        *extension.message_prototype, extension.descriptor) :
    1151             :             MutableMessage(number, WireFormatLite::TYPE_GROUP,
    1152           0 :                            *extension.message_prototype, extension.descriptor);
    1153           0 :         if (!WireFormatLite::ReadGroup(number, input, value)) return false;
    1154           0 :         break;
    1155             :       }
    1156             : 
    1157             :       case WireFormatLite::TYPE_MESSAGE: {
    1158           0 :         MessageLite* value = extension.is_repeated ?
    1159             :             AddMessage(number, WireFormatLite::TYPE_MESSAGE,
    1160           0 :                        *extension.message_prototype, extension.descriptor) :
    1161             :             MutableMessage(number, WireFormatLite::TYPE_MESSAGE,
    1162           0 :                            *extension.message_prototype, extension.descriptor);
    1163           0 :         if (!WireFormatLite::ReadMessage(input, value)) return false;
    1164           0 :         break;
    1165             :       }
    1166             :     }
    1167             :   }
    1168             : 
    1169           0 :   return true;
    1170             : }
    1171             : 
    1172           0 : bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
    1173             :                               const MessageLite* containing_type) {
    1174           0 :   FieldSkipper skipper;
    1175           0 :   GeneratedExtensionFinder finder(containing_type);
    1176           0 :   return ParseField(tag, input, &finder, &skipper);
    1177             : }
    1178             : 
    1179           0 : bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
    1180             :                               const MessageLite* containing_type,
    1181             :                               io::CodedOutputStream* unknown_fields) {
    1182           0 :   CodedOutputStreamFieldSkipper skipper(unknown_fields);
    1183           0 :   GeneratedExtensionFinder finder(containing_type);
    1184           0 :   return ParseField(tag, input, &finder, &skipper);
    1185             : }
    1186             : 
    1187             : // Defined in extension_set_heavy.cc.
    1188             : // bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,
    1189             : //                               const MessageLite* containing_type,
    1190             : //                               UnknownFieldSet* unknown_fields)
    1191             : 
    1192             : // Defined in extension_set_heavy.cc.
    1193             : // bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input,
    1194             : //                                    const MessageLite* containing_type,
    1195             : //                                    UnknownFieldSet* unknown_fields);
    1196             : 
    1197           0 : void ExtensionSet::SerializeWithCachedSizes(
    1198             :     int start_field_number, int end_field_number,
    1199             :     io::CodedOutputStream* output) const {
    1200           0 :   map<int, Extension>::const_iterator iter;
    1201           0 :   for (iter = extensions_.lower_bound(start_field_number);
    1202           0 :        iter != extensions_.end() && iter->first < end_field_number;
    1203             :        ++iter) {
    1204           0 :     iter->second.SerializeFieldWithCachedSizes(iter->first, output);
    1205             :   }
    1206           0 : }
    1207             : 
    1208           0 : int ExtensionSet::ByteSize() const {
    1209           0 :   int total_size = 0;
    1210             : 
    1211           0 :   for (map<int, Extension>::const_iterator iter = extensions_.begin();
    1212           0 :        iter != extensions_.end(); ++iter) {
    1213           0 :     total_size += iter->second.ByteSize(iter->first);
    1214             :   }
    1215             : 
    1216           0 :   return total_size;
    1217             : }
    1218             : 
    1219             : // Defined in extension_set_heavy.cc.
    1220             : // int ExtensionSet::SpaceUsedExcludingSelf() const
    1221             : 
    1222           0 : bool ExtensionSet::MaybeNewExtension(int number,
    1223             :                                      const FieldDescriptor* descriptor,
    1224             :                                      Extension** result) {
    1225             :   pair<map<int, Extension>::iterator, bool> insert_result =
    1226           0 :       extensions_.insert(make_pair(number, Extension()));
    1227           0 :   *result = &insert_result.first->second;
    1228           0 :   (*result)->descriptor = descriptor;
    1229           0 :   return insert_result.second;
    1230             : }
    1231             : 
    1232             : // ===================================================================
    1233             : // Methods of ExtensionSet::Extension
    1234             : 
    1235           0 : void ExtensionSet::Extension::Clear() {
    1236           0 :   if (is_repeated) {
    1237           0 :     switch (cpp_type(type)) {
    1238             : #define HANDLE_TYPE(UPPERCASE, LOWERCASE)                          \
    1239             :       case WireFormatLite::CPPTYPE_##UPPERCASE:                    \
    1240             :         repeated_##LOWERCASE##_value->Clear();                     \
    1241             :         break
    1242             : 
    1243           0 :       HANDLE_TYPE(  INT32,   int32);
    1244           0 :       HANDLE_TYPE(  INT64,   int64);
    1245           0 :       HANDLE_TYPE( UINT32,  uint32);
    1246           0 :       HANDLE_TYPE( UINT64,  uint64);
    1247           0 :       HANDLE_TYPE(  FLOAT,   float);
    1248           0 :       HANDLE_TYPE( DOUBLE,  double);
    1249           0 :       HANDLE_TYPE(   BOOL,    bool);
    1250           0 :       HANDLE_TYPE(   ENUM,    enum);
    1251           0 :       HANDLE_TYPE( STRING,  string);
    1252           0 :       HANDLE_TYPE(MESSAGE, message);
    1253             : #undef HANDLE_TYPE
    1254             :     }
    1255             :   } else {
    1256           0 :     if (!is_cleared) {
    1257           0 :       switch (cpp_type(type)) {
    1258             :         case WireFormatLite::CPPTYPE_STRING:
    1259           0 :           string_value->clear();
    1260           0 :           break;
    1261             :         case WireFormatLite::CPPTYPE_MESSAGE:
    1262           0 :           if (is_lazy) {
    1263           0 :             lazymessage_value->Clear();
    1264             :           } else {
    1265           0 :             message_value->Clear();
    1266             :           }
    1267           0 :           break;
    1268             :         default:
    1269             :           // No need to do anything.  Get*() will return the default value
    1270             :           // as long as is_cleared is true and Set*() will overwrite the
    1271             :           // previous value.
    1272           0 :           break;
    1273             :       }
    1274             : 
    1275           0 :       is_cleared = true;
    1276             :     }
    1277             :   }
    1278           0 : }
    1279             : 
    1280           0 : void ExtensionSet::Extension::SerializeFieldWithCachedSizes(
    1281             :     int number,
    1282             :     io::CodedOutputStream* output) const {
    1283           0 :   if (is_repeated) {
    1284           0 :     if (is_packed) {
    1285           0 :       if (cached_size == 0) return;
    1286             : 
    1287             :       WireFormatLite::WriteTag(number,
    1288             :           WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);
    1289           0 :       output->WriteVarint32(cached_size);
    1290             : 
    1291           0 :       switch (real_type(type)) {
    1292             : #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
    1293             :         case WireFormatLite::TYPE_##UPPERCASE:                              \
    1294             :           for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
    1295             :             WireFormatLite::Write##CAMELCASE##NoTag(                        \
    1296             :               repeated_##LOWERCASE##_value->Get(i), output);                \
    1297             :           }                                                                 \
    1298             :           break
    1299             : 
    1300           0 :         HANDLE_TYPE(   INT32,    Int32,   int32);
    1301           0 :         HANDLE_TYPE(   INT64,    Int64,   int64);
    1302           0 :         HANDLE_TYPE(  UINT32,   UInt32,  uint32);
    1303           0 :         HANDLE_TYPE(  UINT64,   UInt64,  uint64);
    1304           0 :         HANDLE_TYPE(  SINT32,   SInt32,   int32);
    1305           0 :         HANDLE_TYPE(  SINT64,   SInt64,   int64);
    1306           0 :         HANDLE_TYPE( FIXED32,  Fixed32,  uint32);
    1307           0 :         HANDLE_TYPE( FIXED64,  Fixed64,  uint64);
    1308           0 :         HANDLE_TYPE(SFIXED32, SFixed32,   int32);
    1309           0 :         HANDLE_TYPE(SFIXED64, SFixed64,   int64);
    1310           0 :         HANDLE_TYPE(   FLOAT,    Float,   float);
    1311           0 :         HANDLE_TYPE(  DOUBLE,   Double,  double);
    1312           0 :         HANDLE_TYPE(    BOOL,     Bool,    bool);
    1313           0 :         HANDLE_TYPE(    ENUM,     Enum,    enum);
    1314             : #undef HANDLE_TYPE
    1315             : 
    1316             :         case WireFormatLite::TYPE_STRING:
    1317             :         case WireFormatLite::TYPE_BYTES:
    1318             :         case WireFormatLite::TYPE_GROUP:
    1319             :         case WireFormatLite::TYPE_MESSAGE:
    1320           0 :           GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed.";
    1321           0 :           break;
    1322             :       }
    1323             :     } else {
    1324           0 :       switch (real_type(type)) {
    1325             : #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
    1326             :         case WireFormatLite::TYPE_##UPPERCASE:                              \
    1327             :           for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
    1328             :             WireFormatLite::Write##CAMELCASE(number,                        \
    1329             :               repeated_##LOWERCASE##_value->Get(i), output);                \
    1330             :           }                                                                 \
    1331             :           break
    1332             : 
    1333           0 :         HANDLE_TYPE(   INT32,    Int32,   int32);
    1334           0 :         HANDLE_TYPE(   INT64,    Int64,   int64);
    1335           0 :         HANDLE_TYPE(  UINT32,   UInt32,  uint32);
    1336           0 :         HANDLE_TYPE(  UINT64,   UInt64,  uint64);
    1337           0 :         HANDLE_TYPE(  SINT32,   SInt32,   int32);
    1338           0 :         HANDLE_TYPE(  SINT64,   SInt64,   int64);
    1339           0 :         HANDLE_TYPE( FIXED32,  Fixed32,  uint32);
    1340           0 :         HANDLE_TYPE( FIXED64,  Fixed64,  uint64);
    1341           0 :         HANDLE_TYPE(SFIXED32, SFixed32,   int32);
    1342           0 :         HANDLE_TYPE(SFIXED64, SFixed64,   int64);
    1343           0 :         HANDLE_TYPE(   FLOAT,    Float,   float);
    1344           0 :         HANDLE_TYPE(  DOUBLE,   Double,  double);
    1345           0 :         HANDLE_TYPE(    BOOL,     Bool,    bool);
    1346           0 :         HANDLE_TYPE(  STRING,   String,  string);
    1347           0 :         HANDLE_TYPE(   BYTES,    Bytes,  string);
    1348           0 :         HANDLE_TYPE(    ENUM,     Enum,    enum);
    1349           0 :         HANDLE_TYPE(   GROUP,    Group, message);
    1350           0 :         HANDLE_TYPE( MESSAGE,  Message, message);
    1351             : #undef HANDLE_TYPE
    1352             :       }
    1353             :     }
    1354           0 :   } else if (!is_cleared) {
    1355           0 :     switch (real_type(type)) {
    1356             : #define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE)                 \
    1357             :       case WireFormatLite::TYPE_##UPPERCASE:                     \
    1358             :         WireFormatLite::Write##CAMELCASE(number, VALUE, output); \
    1359             :         break
    1360             : 
    1361           0 :       HANDLE_TYPE(   INT32,    Int32,    int32_value);
    1362           0 :       HANDLE_TYPE(   INT64,    Int64,    int64_value);
    1363           0 :       HANDLE_TYPE(  UINT32,   UInt32,   uint32_value);
    1364           0 :       HANDLE_TYPE(  UINT64,   UInt64,   uint64_value);
    1365           0 :       HANDLE_TYPE(  SINT32,   SInt32,    int32_value);
    1366           0 :       HANDLE_TYPE(  SINT64,   SInt64,    int64_value);
    1367           0 :       HANDLE_TYPE( FIXED32,  Fixed32,   uint32_value);
    1368           0 :       HANDLE_TYPE( FIXED64,  Fixed64,   uint64_value);
    1369           0 :       HANDLE_TYPE(SFIXED32, SFixed32,    int32_value);
    1370           0 :       HANDLE_TYPE(SFIXED64, SFixed64,    int64_value);
    1371           0 :       HANDLE_TYPE(   FLOAT,    Float,    float_value);
    1372           0 :       HANDLE_TYPE(  DOUBLE,   Double,   double_value);
    1373           0 :       HANDLE_TYPE(    BOOL,     Bool,     bool_value);
    1374           0 :       HANDLE_TYPE(  STRING,   String,  *string_value);
    1375           0 :       HANDLE_TYPE(   BYTES,    Bytes,  *string_value);
    1376           0 :       HANDLE_TYPE(    ENUM,     Enum,     enum_value);
    1377           0 :       HANDLE_TYPE(   GROUP,    Group, *message_value);
    1378             : #undef HANDLE_TYPE
    1379             :       case WireFormatLite::TYPE_MESSAGE:
    1380           0 :         if (is_lazy) {
    1381           0 :           lazymessage_value->WriteMessage(number, output);
    1382             :         } else {
    1383           0 :           WireFormatLite::WriteMessage(number, *message_value, output);
    1384             :         }
    1385           0 :         break;
    1386             :     }
    1387             :   }
    1388             : }
    1389             : 
    1390           0 : int ExtensionSet::Extension::ByteSize(int number) const {
    1391           0 :   int result = 0;
    1392             : 
    1393           0 :   if (is_repeated) {
    1394           0 :     if (is_packed) {
    1395           0 :       switch (real_type(type)) {
    1396             : #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
    1397             :         case WireFormatLite::TYPE_##UPPERCASE:                              \
    1398             :           for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
    1399             :             result += WireFormatLite::CAMELCASE##Size(                      \
    1400             :               repeated_##LOWERCASE##_value->Get(i));                        \
    1401             :           }                                                                 \
    1402             :           break
    1403             : 
    1404           0 :         HANDLE_TYPE(   INT32,    Int32,   int32);
    1405           0 :         HANDLE_TYPE(   INT64,    Int64,   int64);
    1406           0 :         HANDLE_TYPE(  UINT32,   UInt32,  uint32);
    1407           0 :         HANDLE_TYPE(  UINT64,   UInt64,  uint64);
    1408           0 :         HANDLE_TYPE(  SINT32,   SInt32,   int32);
    1409           0 :         HANDLE_TYPE(  SINT64,   SInt64,   int64);
    1410           0 :         HANDLE_TYPE(    ENUM,     Enum,    enum);
    1411             : #undef HANDLE_TYPE
    1412             : 
    1413             :         // Stuff with fixed size.
    1414             : #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
    1415             :         case WireFormatLite::TYPE_##UPPERCASE:                              \
    1416             :           result += WireFormatLite::k##CAMELCASE##Size *                    \
    1417             :                     repeated_##LOWERCASE##_value->size();                   \
    1418             :           break
    1419           0 :         HANDLE_TYPE( FIXED32,  Fixed32, uint32);
    1420           0 :         HANDLE_TYPE( FIXED64,  Fixed64, uint64);
    1421           0 :         HANDLE_TYPE(SFIXED32, SFixed32,  int32);
    1422           0 :         HANDLE_TYPE(SFIXED64, SFixed64,  int64);
    1423           0 :         HANDLE_TYPE(   FLOAT,    Float,  float);
    1424           0 :         HANDLE_TYPE(  DOUBLE,   Double, double);
    1425           0 :         HANDLE_TYPE(    BOOL,     Bool,   bool);
    1426             : #undef HANDLE_TYPE
    1427             : 
    1428             :         case WireFormatLite::TYPE_STRING:
    1429             :         case WireFormatLite::TYPE_BYTES:
    1430             :         case WireFormatLite::TYPE_GROUP:
    1431             :         case WireFormatLite::TYPE_MESSAGE:
    1432           0 :           GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed.";
    1433           0 :           break;
    1434             :       }
    1435             : 
    1436           0 :       cached_size = result;
    1437           0 :       if (result > 0) {
    1438           0 :         result += io::CodedOutputStream::VarintSize32(result);
    1439           0 :         result += io::CodedOutputStream::VarintSize32(
    1440             :             WireFormatLite::MakeTag(number,
    1441             :                 WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
    1442             :       }
    1443             :     } else {
    1444           0 :       int tag_size = WireFormatLite::TagSize(number, real_type(type));
    1445             : 
    1446           0 :       switch (real_type(type)) {
    1447             : #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
    1448             :         case WireFormatLite::TYPE_##UPPERCASE:                              \
    1449             :           result += tag_size * repeated_##LOWERCASE##_value->size();        \
    1450             :           for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
    1451             :             result += WireFormatLite::CAMELCASE##Size(                      \
    1452             :               repeated_##LOWERCASE##_value->Get(i));                        \
    1453             :           }                                                                 \
    1454             :           break
    1455             : 
    1456           0 :         HANDLE_TYPE(   INT32,    Int32,   int32);
    1457           0 :         HANDLE_TYPE(   INT64,    Int64,   int64);
    1458           0 :         HANDLE_TYPE(  UINT32,   UInt32,  uint32);
    1459           0 :         HANDLE_TYPE(  UINT64,   UInt64,  uint64);
    1460           0 :         HANDLE_TYPE(  SINT32,   SInt32,   int32);
    1461           0 :         HANDLE_TYPE(  SINT64,   SInt64,   int64);
    1462           0 :         HANDLE_TYPE(  STRING,   String,  string);
    1463           0 :         HANDLE_TYPE(   BYTES,    Bytes,  string);
    1464           0 :         HANDLE_TYPE(    ENUM,     Enum,    enum);
    1465           0 :         HANDLE_TYPE(   GROUP,    Group, message);
    1466           0 :         HANDLE_TYPE( MESSAGE,  Message, message);
    1467             : #undef HANDLE_TYPE
    1468             : 
    1469             :         // Stuff with fixed size.
    1470             : #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
    1471             :         case WireFormatLite::TYPE_##UPPERCASE:                              \
    1472             :           result += (tag_size + WireFormatLite::k##CAMELCASE##Size) *       \
    1473             :                     repeated_##LOWERCASE##_value->size();                   \
    1474             :           break
    1475           0 :         HANDLE_TYPE( FIXED32,  Fixed32, uint32);
    1476           0 :         HANDLE_TYPE( FIXED64,  Fixed64, uint64);
    1477           0 :         HANDLE_TYPE(SFIXED32, SFixed32,  int32);
    1478           0 :         HANDLE_TYPE(SFIXED64, SFixed64,  int64);
    1479           0 :         HANDLE_TYPE(   FLOAT,    Float,  float);
    1480           0 :         HANDLE_TYPE(  DOUBLE,   Double, double);
    1481           0 :         HANDLE_TYPE(    BOOL,     Bool,   bool);
    1482             : #undef HANDLE_TYPE
    1483             :       }
    1484             :     }
    1485           0 :   } else if (!is_cleared) {
    1486           0 :     result += WireFormatLite::TagSize(number, real_type(type));
    1487           0 :     switch (real_type(type)) {
    1488             : #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                      \
    1489             :       case WireFormatLite::TYPE_##UPPERCASE:                              \
    1490             :         result += WireFormatLite::CAMELCASE##Size(LOWERCASE);             \
    1491             :         break
    1492             : 
    1493           0 :       HANDLE_TYPE(   INT32,    Int32,    int32_value);
    1494           0 :       HANDLE_TYPE(   INT64,    Int64,    int64_value);
    1495           0 :       HANDLE_TYPE(  UINT32,   UInt32,   uint32_value);
    1496           0 :       HANDLE_TYPE(  UINT64,   UInt64,   uint64_value);
    1497           0 :       HANDLE_TYPE(  SINT32,   SInt32,    int32_value);
    1498           0 :       HANDLE_TYPE(  SINT64,   SInt64,    int64_value);
    1499           0 :       HANDLE_TYPE(  STRING,   String,  *string_value);
    1500           0 :       HANDLE_TYPE(   BYTES,    Bytes,  *string_value);
    1501           0 :       HANDLE_TYPE(    ENUM,     Enum,     enum_value);
    1502           0 :       HANDLE_TYPE(   GROUP,    Group, *message_value);
    1503             : #undef HANDLE_TYPE
    1504             :       case WireFormatLite::TYPE_MESSAGE: {
    1505           0 :         if (is_lazy) {
    1506           0 :           int size = lazymessage_value->ByteSize();
    1507           0 :           result += io::CodedOutputStream::VarintSize32(size) + size;
    1508             :         } else {
    1509           0 :           result += WireFormatLite::MessageSize(*message_value);
    1510             :         }
    1511           0 :         break;
    1512             :       }
    1513             : 
    1514             :       // Stuff with fixed size.
    1515             : #define HANDLE_TYPE(UPPERCASE, CAMELCASE)                                 \
    1516             :       case WireFormatLite::TYPE_##UPPERCASE:                              \
    1517             :         result += WireFormatLite::k##CAMELCASE##Size;                     \
    1518             :         break
    1519           0 :       HANDLE_TYPE( FIXED32,  Fixed32);
    1520           0 :       HANDLE_TYPE( FIXED64,  Fixed64);
    1521           0 :       HANDLE_TYPE(SFIXED32, SFixed32);
    1522           0 :       HANDLE_TYPE(SFIXED64, SFixed64);
    1523           0 :       HANDLE_TYPE(   FLOAT,    Float);
    1524           0 :       HANDLE_TYPE(  DOUBLE,   Double);
    1525           0 :       HANDLE_TYPE(    BOOL,     Bool);
    1526             : #undef HANDLE_TYPE
    1527             :     }
    1528             :   }
    1529             : 
    1530           0 :   return result;
    1531             : }
    1532             : 
    1533           0 : int ExtensionSet::Extension::GetSize() const {
    1534           0 :   GOOGLE_DCHECK(is_repeated);
    1535           0 :   switch (cpp_type(type)) {
    1536             : #define HANDLE_TYPE(UPPERCASE, LOWERCASE)                        \
    1537             :     case WireFormatLite::CPPTYPE_##UPPERCASE:                    \
    1538             :       return repeated_##LOWERCASE##_value->size()
    1539             : 
    1540           0 :     HANDLE_TYPE(  INT32,   int32);
    1541           0 :     HANDLE_TYPE(  INT64,   int64);
    1542           0 :     HANDLE_TYPE( UINT32,  uint32);
    1543           0 :     HANDLE_TYPE( UINT64,  uint64);
    1544           0 :     HANDLE_TYPE(  FLOAT,   float);
    1545           0 :     HANDLE_TYPE( DOUBLE,  double);
    1546           0 :     HANDLE_TYPE(   BOOL,    bool);
    1547           0 :     HANDLE_TYPE(   ENUM,    enum);
    1548           0 :     HANDLE_TYPE( STRING,  string);
    1549           0 :     HANDLE_TYPE(MESSAGE, message);
    1550             : #undef HANDLE_TYPE
    1551             :   }
    1552             : 
    1553           0 :   GOOGLE_LOG(FATAL) << "Can't get here.";
    1554           0 :   return 0;
    1555             : }
    1556             : 
    1557           0 : void ExtensionSet::Extension::Free() {
    1558           0 :   if (is_repeated) {
    1559           0 :     switch (cpp_type(type)) {
    1560             : #define HANDLE_TYPE(UPPERCASE, LOWERCASE)                          \
    1561             :       case WireFormatLite::CPPTYPE_##UPPERCASE:                    \
    1562             :         delete repeated_##LOWERCASE##_value;                       \
    1563             :         break
    1564             : 
    1565           0 :       HANDLE_TYPE(  INT32,   int32);
    1566           0 :       HANDLE_TYPE(  INT64,   int64);
    1567           0 :       HANDLE_TYPE( UINT32,  uint32);
    1568           0 :       HANDLE_TYPE( UINT64,  uint64);
    1569           0 :       HANDLE_TYPE(  FLOAT,   float);
    1570           0 :       HANDLE_TYPE( DOUBLE,  double);
    1571           0 :       HANDLE_TYPE(   BOOL,    bool);
    1572           0 :       HANDLE_TYPE(   ENUM,    enum);
    1573           0 :       HANDLE_TYPE( STRING,  string);
    1574           0 :       HANDLE_TYPE(MESSAGE, message);
    1575             : #undef HANDLE_TYPE
    1576             :     }
    1577             :   } else {
    1578           0 :     switch (cpp_type(type)) {
    1579             :       case WireFormatLite::CPPTYPE_STRING:
    1580           0 :         delete string_value;
    1581           0 :         break;
    1582             :       case WireFormatLite::CPPTYPE_MESSAGE:
    1583           0 :         if (is_lazy) {
    1584           0 :           delete lazymessage_value;
    1585             :         } else {
    1586           0 :           delete message_value;
    1587             :         }
    1588           0 :         break;
    1589             :       default:
    1590           0 :         break;
    1591             :     }
    1592             :   }
    1593           0 : }
    1594             : 
    1595             : // Defined in extension_set_heavy.cc.
    1596             : // int ExtensionSet::Extension::SpaceUsedExcludingSelf() const
    1597             : 
    1598             : // ==================================================================
    1599             : // Default repeated field instances for iterator-compatible accessors
    1600             : 
    1601             : const RepeatedStringTypeTraits::RepeatedFieldType*
    1602             : RepeatedStringTypeTraits::default_repeated_field_ = NULL;
    1603             : 
    1604             : const RepeatedMessageGenericTypeTraits::RepeatedFieldType*
    1605             : RepeatedMessageGenericTypeTraits::default_repeated_field_ = NULL;
    1606             : 
    1607             : #define PROTOBUF_DEFINE_DEFAULT_REPEATED(TYPE)                                 \
    1608             :     const RepeatedField<TYPE>*                                                 \
    1609             :     RepeatedPrimitiveGenericTypeTraits::default_repeated_field_##TYPE##_ = NULL;
    1610             : 
    1611             : PROTOBUF_DEFINE_DEFAULT_REPEATED(int32)
    1612             : PROTOBUF_DEFINE_DEFAULT_REPEATED(int64)
    1613             : PROTOBUF_DEFINE_DEFAULT_REPEATED(uint32)
    1614             : PROTOBUF_DEFINE_DEFAULT_REPEATED(uint64)
    1615             : PROTOBUF_DEFINE_DEFAULT_REPEATED(double)
    1616             : PROTOBUF_DEFINE_DEFAULT_REPEATED(float)
    1617             : PROTOBUF_DEFINE_DEFAULT_REPEATED(bool)
    1618             : 
    1619             : #undef PROTOBUF_DEFINE_DEFAULT_REPEATED
    1620             : 
    1621             : struct StaticDefaultRepeatedFieldsInitializer {
    1622           3 :   StaticDefaultRepeatedFieldsInitializer() {
    1623           3 :     InitializeDefaultRepeatedFields();
    1624           3 :     OnShutdown(&DestroyDefaultRepeatedFields);
    1625           3 :   }
    1626           3 : } static_repeated_fields_initializer;
    1627             : 
    1628           3 : void InitializeDefaultRepeatedFields() {
    1629           3 :   RepeatedStringTypeTraits::default_repeated_field_ =
    1630           3 :       new RepeatedStringTypeTraits::RepeatedFieldType;
    1631           3 :   RepeatedMessageGenericTypeTraits::default_repeated_field_ =
    1632           3 :       new RepeatedMessageGenericTypeTraits::RepeatedFieldType;
    1633           3 :   RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int32_ =
    1634           3 :       new RepeatedField<int32>;
    1635           3 :   RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int64_ =
    1636           3 :       new RepeatedField<int64>;
    1637           3 :   RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint32_ =
    1638           3 :       new RepeatedField<uint32>;
    1639           3 :   RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint64_ =
    1640           3 :       new RepeatedField<uint64>;
    1641           3 :   RepeatedPrimitiveGenericTypeTraits::default_repeated_field_double_ =
    1642           3 :       new RepeatedField<double>;
    1643           3 :   RepeatedPrimitiveGenericTypeTraits::default_repeated_field_float_ =
    1644           3 :       new RepeatedField<float>;
    1645           3 :   RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_ =
    1646           3 :       new RepeatedField<bool>;
    1647           3 : }
    1648             : 
    1649           0 : void DestroyDefaultRepeatedFields() {
    1650           0 :   delete RepeatedStringTypeTraits::default_repeated_field_;
    1651           0 :   delete RepeatedMessageGenericTypeTraits::default_repeated_field_;
    1652           0 :   delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int32_;
    1653           0 :   delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int64_;
    1654           0 :   delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint32_;
    1655           0 :   delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint64_;
    1656           0 :   delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_double_;
    1657           0 :   delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_float_;
    1658           0 :   delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_;
    1659           0 : }
    1660             : 
    1661             : }  // namespace internal
    1662             : }  // namespace protobuf
    1663             : }  // namespace google

Generated by: LCOV version 1.13