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