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// This header is logically internal, but is made public because it is used 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// from protocol-compiler-generated code, which may reside in other components. 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GOOGLE_PROTOBUF_EXTENSION_SET_H__ 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_EXTENSION_SET_H__ 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <vector> 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <stack> 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <map> 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <utility> 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string> 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h> 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class Descriptor; // descriptor.h 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class FieldDescriptor; // descriptor.h 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class DescriptorPool; // descriptor.h 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class MessageLite; // message_lite.h 56d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville class Message; // message.h 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class MessageFactory; // message.h 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class UnknownFieldSet; // unknown_field_set.h 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville namespace io { 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class CodedInputStream; // coded_stream.h 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class CodedOutputStream; // coded_stream.h 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville namespace internal { 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class FieldSkipper; // wire_format_lite.h 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class RepeatedPtrFieldBase; // repeated_field.h 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template <typename Element> class RepeatedField; // repeated_field.h 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template <typename Element> class RepeatedPtrField; // repeated_field.h 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal { 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Used to store values of type WireFormatLite::FieldType without having to 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// #include wire_format_lite.h. Also, ensures that we use only one byte to 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// store these values, which is important to keep the layout of 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ExtensionSet::Extension small. 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletypedef uint8 FieldType; 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 80d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// A function which, given an integer value, returns true if the number 81d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// matches one of the defined values for the corresponding enum type. This 82d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// is used with RegisterEnumExtension, below. 83d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletypedef bool EnumValidityFunc(int number); 84d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 85d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Version of the above which takes an argument. This is needed to deal with 86d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// extensions that are not compiled in. 87d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletypedef bool EnumValidityFuncWithArg(const void* arg, int number); 88d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 89d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Information about a registered extension. 90d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillestruct ExtensionInfo { 91d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville inline ExtensionInfo() {} 92d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville inline ExtensionInfo(FieldType type, bool is_repeated, bool is_packed) 93d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville : type(type), is_repeated(is_repeated), is_packed(is_packed), 94d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville descriptor(NULL) {} 95d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 96d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville FieldType type; 97d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville bool is_repeated; 98d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville bool is_packed; 99d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 100d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville struct EnumValidityCheck { 101d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EnumValidityFuncWithArg* func; 102d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const void* arg; 103d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville }; 104d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 105d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville union { 106d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EnumValidityCheck enum_validity_check; 107d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const MessageLite* message_prototype; 108d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville }; 109d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 110d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // The descriptor for this extension, if one exists and is known. May be 111d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // NULL. Must not be NULL if the descriptor for the extension does not 112d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // live in the same pool as the descriptor for the containing type. 113d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const FieldDescriptor* descriptor; 114d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}; 115d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 116d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Abstract interface for an object which looks up extension definitions. Used 117d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// when parsing. 118d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass LIBPROTOBUF_EXPORT ExtensionFinder { 119d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville public: 120d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville virtual ~ExtensionFinder(); 121d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 122d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Find the extension with the given containing type and number. 123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville virtual bool Find(int number, ExtensionInfo* output) = 0; 124d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}; 125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Implementation of ExtensionFinder which finds extensions defined in .proto 127d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// files which have been compiled into the binary. 128d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass LIBPROTOBUF_EXPORT GeneratedExtensionFinder : public ExtensionFinder { 129d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville public: 130d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville GeneratedExtensionFinder(const MessageLite* containing_type) 131d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville : containing_type_(containing_type) {} 132d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville virtual ~GeneratedExtensionFinder() {} 133d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 134d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Returns true and fills in *output if found, otherwise returns false. 135d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville virtual bool Find(int number, ExtensionInfo* output); 136d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 137d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville private: 138d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const MessageLite* containing_type_; 139d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}; 140d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 141d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Note: extension_set_heavy.cc defines DescriptorPoolExtensionFinder for 142d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// finding extensions from a DescriptorPool. 143d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This is an internal helper class intended for use within the protocol buffer 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// library and generated classes. Clients should not use it directly. Instead, 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// use the generated accessors such as GetExtension() of the class being 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// extended. 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class manages extensions for a protocol message object. The 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// message's HasExtension(), GetExtension(), MutableExtension(), and 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ClearExtension() methods are just thin wrappers around the embedded 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ExtensionSet. When parsing, if a tag number is encountered which is 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// inside one of the message type's extension ranges, the tag is passed 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// off to the ExtensionSet for parsing. Etc. 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT ExtensionSet { 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExtensionSet(); 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~ExtensionSet(); 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are called at startup by protocol-compiler-generated code to 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // register known extensions. The registrations are used by ParseField() 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to look up extensions for parsed field numbers. Note that dynamic parsing 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // does not use ParseField(); only protocol-compiler-generated parsing 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // methods do. 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void RegisterExtension(const MessageLite* containing_type, 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number, FieldType type, 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_repeated, bool is_packed); 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void RegisterEnumExtension(const MessageLite* containing_type, 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number, FieldType type, 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_repeated, bool is_packed, 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumValidityFunc* is_valid); 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void RegisterMessageExtension(const MessageLite* containing_type, 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number, FieldType type, 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_repeated, bool is_packed, 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageLite* prototype); 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ================================================================= 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Add all fields which are currently present to the given vector. This 180d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // is useful to implement Reflection::ListFields(). 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void AppendToList(const Descriptor* containing_type, 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const DescriptorPool* pool, 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<const FieldDescriptor*>* output) const; 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ================================================================= 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Accessors 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Generated message classes include type-safe templated wrappers around 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // these methods. Generally you should use those rather than call these 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // directly, unless you are doing low-level memory management. 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // When calling any of these accessors, the extension number requested 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // MUST exist in the DescriptorPool provided to the constructor. Otheriwse, 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the method will fail an assert. Normally, though, you would not call 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // these directly; you would either call the generated accessors of your 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message class (e.g. GetExtension()) or you would call the accessors 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of the reflection interface. In both cases, it is impossible to 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // trigger this assert failure: the generated accessors only accept 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // linked-in extension types as parameters, while the Reflection interface 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // requires you to provide the FieldDescriptor describing the extension. 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // When calling any of these accessors, a protocol-compiler-generated 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implementation of the extension corresponding to the number MUST 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // be linked in, and the FieldDescriptor used to refer to it MUST be 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the one generated by that linked-in code. Otherwise, the method will 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // die on an assert failure. The message objects returned by the message 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // accessors are guaranteed to be of the correct linked-in type. 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These methods pretty much match Reflection except that: 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // - They're not virtual. 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // - They identify fields by number rather than FieldDescriptors. 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // - They identify enum values using integers rather than descriptors. 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // - Strings provide Mutable() in addition to Set() accessors. 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool Has(int number) const; 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int ExtensionSize(int number) const; // Size of a repeated extension. 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ClearExtension(int number); 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // singular fields ------------------------------------------------- 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int32 GetInt32 (int number, int32 default_value) const; 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int64 GetInt64 (int number, int64 default_value) const; 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint32 GetUInt32(int number, uint32 default_value) const; 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint64 GetUInt64(int number, uint64 default_value) const; 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville float GetFloat (int number, float default_value) const; 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville double GetDouble(int number, double default_value) const; 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool GetBool (int number, bool default_value) const; 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int GetEnum (int number, int default_value) const; 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string & GetString (int number, const string& default_value) const; 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageLite& GetMessage(int number, 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageLite& default_value) const; 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageLite& GetMessage(int number, const Descriptor* message_type, 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MessageFactory* factory) const; 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 235d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // |descriptor| may be NULL so long as it is known that the descriptor for 236d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // the extension lives in the same pool as the descriptor for the containing 237d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // type. 238d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#define desc const FieldDescriptor* descriptor // avoid line wrapping 239d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void SetInt32 (int number, FieldType type, int32 value, desc); 240d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void SetInt64 (int number, FieldType type, int64 value, desc); 241d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void SetUInt32(int number, FieldType type, uint32 value, desc); 242d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void SetUInt64(int number, FieldType type, uint64 value, desc); 243d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void SetFloat (int number, FieldType type, float value, desc); 244d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void SetDouble(int number, FieldType type, double value, desc); 245d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void SetBool (int number, FieldType type, bool value, desc); 246d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void SetEnum (int number, FieldType type, int value, desc); 247d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void SetString(int number, FieldType type, const string& value, desc); 248d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string * MutableString (int number, FieldType type, desc); 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MessageLite* MutableMessage(int number, FieldType type, 250d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const MessageLite& prototype, desc); 251d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville MessageLite* MutableMessage(const FieldDescriptor* decsriptor, 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MessageFactory* factory); 253d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#undef desc 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // repeated fields ------------------------------------------------- 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int32 GetRepeatedInt32 (int number, int index) const; 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int64 GetRepeatedInt64 (int number, int index) const; 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint32 GetRepeatedUInt32(int number, int index) const; 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint64 GetRepeatedUInt64(int number, int index) const; 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville float GetRepeatedFloat (int number, int index) const; 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville double GetRepeatedDouble(int number, int index) const; 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool GetRepeatedBool (int number, int index) const; 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int GetRepeatedEnum (int number, int index) const; 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string & GetRepeatedString (int number, int index) const; 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageLite& GetRepeatedMessage(int number, int index) const; 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetRepeatedInt32 (int number, int index, int32 value); 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetRepeatedInt64 (int number, int index, int64 value); 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetRepeatedUInt32(int number, int index, uint32 value); 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetRepeatedUInt64(int number, int index, uint64 value); 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetRepeatedFloat (int number, int index, float value); 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetRepeatedDouble(int number, int index, double value); 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetRepeatedBool (int number, int index, bool value); 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetRepeatedEnum (int number, int index, int value); 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SetRepeatedString(int number, int index, const string& value); 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string * MutableRepeatedString (int number, int index); 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MessageLite* MutableRepeatedMessage(int number, int index); 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 280d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#define desc const FieldDescriptor* descriptor // avoid line wrapping 281d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void AddInt32 (int number, FieldType type, bool packed, int32 value, desc); 282d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void AddInt64 (int number, FieldType type, bool packed, int64 value, desc); 283d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void AddUInt32(int number, FieldType type, bool packed, uint32 value, desc); 284d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void AddUInt64(int number, FieldType type, bool packed, uint64 value, desc); 285d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void AddFloat (int number, FieldType type, bool packed, float value, desc); 286d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void AddDouble(int number, FieldType type, bool packed, double value, desc); 287d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void AddBool (int number, FieldType type, bool packed, bool value, desc); 288d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void AddEnum (int number, FieldType type, bool packed, int value, desc); 289d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void AddString(int number, FieldType type, const string& value, desc); 290d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string * AddString (int number, FieldType type, desc); 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MessageLite* AddMessage(int number, FieldType type, 292d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const MessageLite& prototype, desc); 293d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville MessageLite* AddMessage(const FieldDescriptor* descriptor, 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MessageFactory* factory); 295d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#undef desc 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void RemoveLast(int number); 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SwapElements(int number, int index1, int index2); 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ----------------------------------------------------------------- 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TODO(kenton): Hardcore memory management accessors 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ================================================================= 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // convenience methods for implementing methods of Message 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These could all be implemented in terms of the other methods of this 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // class, but providing them here helps keep the generated code size down. 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void Clear(); 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void MergeFrom(const ExtensionSet& other); 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void Swap(ExtensionSet* other); 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool IsInitialized() const; 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parses a single extension from the input. The input should start out 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // positioned immediately after the tag. |containing_type| is the default 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // instance for the containing message; it is used only to look up the 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extension by number. See RegisterExtension(), above. Unlike the other 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // methods of ExtensionSet, this only works for generated message types -- 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // it looks up extensions registered using RegisterExtension(). 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool ParseField(uint32 tag, io::CodedInputStream* input, 321d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ExtensionFinder* extension_finder, 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldSkipper* field_skipper); 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Specific versions for lite or full messages (constructs the appropriate 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FieldSkipper automatically). 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool ParseField(uint32 tag, io::CodedInputStream* input, 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageLite* containing_type); 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool ParseField(uint32 tag, io::CodedInputStream* input, 329d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const Message* containing_type, 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UnknownFieldSet* unknown_fields); 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse an entire message in MessageSet format. Such messages have no 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fields, only extensions. 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool ParseMessageSet(io::CodedInputStream* input, 335d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ExtensionFinder* extension_finder, 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldSkipper* field_skipper); 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Specific versions for lite or full messages (constructs the appropriate 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FieldSkipper automatically). 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool ParseMessageSet(io::CodedInputStream* input, 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageLite* containing_type); 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool ParseMessageSet(io::CodedInputStream* input, 343d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const Message* containing_type, 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UnknownFieldSet* unknown_fields); 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write all extension fields with field numbers in the range 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // [start_field_number, end_field_number) 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to the output stream, using the cached sizes computed when ByteSize() was 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // last called. Note that the range bounds are inclusive-exclusive. 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SerializeWithCachedSizes(int start_field_number, 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int end_field_number, 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::CodedOutputStream* output) const; 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Same as SerializeWithCachedSizes, but without any bounds checking. 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The caller must ensure that target has sufficient capacity for the 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // serialized extensions. 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Returns a pointer past the last written byte. 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint8* SerializeWithCachedSizesToArray(int start_field_number, 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int end_field_number, 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint8* target) const; 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like above but serializes in MessageSet format. 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SerializeMessageSetWithCachedSizes(io::CodedOutputStream* output) const; 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint8* SerializeMessageSetWithCachedSizesToArray(uint8* target) const; 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Returns the total serialized size of all the extensions. 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int ByteSize() const; 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like ByteSize() but uses MessageSet format. 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int MessageSetByteSize() const; 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Returns (an estimate of) the total number of bytes used for storing the 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extensions in memory, excluding sizeof(*this). If the ExtensionSet is 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // for a lite message (and thus possibly contains lite messages), the results 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // are undefined (might work, might crash, might corrupt data, might not even 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // be linked in). It's up to the protocol compiler to avoid calling this on 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // such ExtensionSets (easy enough since lite messages don't implement 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // SpaceUsed()). 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int SpaceUsedExcludingSelf() const; 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville struct Extension { 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville union { 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int32 int32_value; 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int64 int64_value; 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint32 uint32_value; 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint64 uint64_value; 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville float float_value; 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville double double_value; 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool bool_value; 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int enum_value; 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string* string_value; 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MessageLite* message_value; 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField <int32 >* repeated_int32_value; 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField <int64 >* repeated_int64_value; 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField <uint32 >* repeated_uint32_value; 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField <uint64 >* repeated_uint64_value; 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField <float >* repeated_float_value; 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField <double >* repeated_double_value; 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField <bool >* repeated_bool_value; 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField <int >* repeated_enum_value; 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string >* repeated_string_value; 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<MessageLite>* repeated_message_value; 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldType type; 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_repeated; 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // For singular types, indicates if the extension is "cleared". This 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // happens when an extension is set and then later cleared by the caller. 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We want to keep the Extension object around for reuse, so instead of 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // removing it from the map, we just set is_cleared = true. This has no 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // meaning for repeated types; for those, the size of the RepeatedField 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // simply becomes zero when cleared. 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_cleared; 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // For repeated types, this indicates if the [packed=true] option is set. 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed; 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 423d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // The descriptor for this extension, if one exists and is known. May be 424d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // NULL. Must not be NULL if the descriptor for the extension does not 425d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // live in the same pool as the descriptor for the containing type. 426d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const FieldDescriptor* descriptor; 427d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // For packed fields, the size of the packed data is recorded here when 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ByteSize() is called then used during serialization. 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // TODO(kenton): Use atomic<int> when C++ supports it. 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville mutable int cached_size; 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Some helper methods for operations on a single Extension. 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SerializeFieldWithCachedSizes( 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number, 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::CodedOutputStream* output) const; 437d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville uint8* SerializeFieldWithCachedSizesToArray( 438d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville int number, 439d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville uint8* target) const; 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void SerializeMessageSetItemWithCachedSizes( 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number, 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::CodedOutputStream* output) const; 443d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville uint8* SerializeMessageSetItemWithCachedSizesToArray( 444d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville int number, 445d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville uint8* target) const; 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int ByteSize(int number) const; 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int MessageSetItemByteSize(int number) const; 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void Clear(); 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int GetSize() const; 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void Free(); 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int SpaceUsedExcludingSelf() const; 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets the extension with the given number, creating it if it does not 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // already exist. Returns true if the extension did not already exist. 456d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville bool MaybeNewExtension(int number, const FieldDescriptor* descriptor, 457d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville Extension** result); 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Parse a single MessageSet item -- called just after the item group start 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // tag has been read. 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool ParseMessageSetItem(io::CodedInputStream* input, 462d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ExtensionFinder* extension_finder, 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldSkipper* field_skipper); 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 465d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Hack: RepeatedPtrFieldBase declares ExtensionSet as a friend. This 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // friendship should automatically extend to ExtensionSet::Extension, but 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // unfortunately some older compilers (e.g. GCC 3.4.4) do not implement this 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // correctly. So, we must provide helpers for calling methods of that 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // class. 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Defined in extension_set_heavy.cc. 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int RepeatedMessage_SpaceUsedExcludingSelf( 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrFieldBase* field); 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The Extension struct is small enough to be passed by value, so we use it 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // directly as the value type in the map rather than use pointers. We use 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // a map rather than hash_map here because we expect most ExtensionSets will 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // only contain a small number of extensions whereas hash_map is optimized 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // for 100 elements or more. Also, we want AppendToList() to order fields 481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // by field number. 482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville map<int, Extension> extensions_; 483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionSet); 485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// These are just for convenience... 488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void ExtensionSet::SetString(int number, FieldType type, 489d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const string& value, 490d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const FieldDescriptor* descriptor) { 491d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville MutableString(number, type, descriptor)->assign(value); 492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void ExtensionSet::SetRepeatedString(int number, int index, 494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& value) { 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MutableRepeatedString(number, index)->assign(value); 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void ExtensionSet::AddString(int number, FieldType type, 498d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const string& value, 499d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville const FieldDescriptor* descriptor) { 500d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville AddString(number, type, descriptor)->assign(value); 501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Glue for generated extension accessors 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Template magic 508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// First we have a set of classes representing "type traits" for different 510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// field types. A type traits class knows how to implement basic accessors 511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// for extensions of a particular type given an ExtensionSet. The signature 512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// for a type traits class looks like this: 513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// class TypeTraits { 515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// public: 516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// typedef ? ConstType; 517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// typedef ? MutableType; 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static inline ConstType Get(int number, const ExtensionSet& set); 520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static inline void Set(int number, ConstType value, ExtensionSet* set); 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static inline MutableType Mutable(int number, ExtensionSet* set); 522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// // Variants for repeated fields. 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static inline ConstType Get(int number, const ExtensionSet& set, 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// int index); 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static inline void Set(int number, int index, 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ConstType value, ExtensionSet* set); 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static inline MutableType Mutable(int number, int index, 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ExtensionSet* set); 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static inline void Add(int number, ConstType value, ExtensionSet* set); 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static inline MutableType Add(int number, ExtensionSet* set); 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// }; 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Not all of these methods make sense for all field types. For example, the 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "Mutable" methods only make sense for strings and messages, and the 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// repeated methods only make sense for repeated types. So, each type 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// traits class implements only the set of methods from this signature that it 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// actually supports. This will cause a compiler error if the user tries to 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// access an extension using a method that doesn't make sense for its type. 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// For example, if "foo" is an extension of type "optional int32", then if you 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// try to write code like: 542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// my_message.MutableExtension(foo) 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// you will get a compile error because PrimitiveTypeTraits<int32> does not 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// have a "Mutable()" method. 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// PrimitiveTypeTraits 548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Since the ExtensionSet has different methods for each primitive type, 550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// we must explicitly define the methods of the type traits class for each 551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// known type. 552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass PrimitiveTypeTraits { 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef Type ConstType; 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline ConstType Get(int number, const ExtensionSet& set, 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ConstType default_value); 559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void Set(int number, FieldType field_type, 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ConstType value, ExtensionSet* set); 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass RepeatedPrimitiveTypeTraits { 565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef Type ConstType; 567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline Type Get(int number, const ExtensionSet& set, int index); 569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void Set(int number, int index, Type value, ExtensionSet* set); 570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void Add(int number, FieldType field_type, 571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed, Type value, ExtensionSet* set); 572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define PROTOBUF_DEFINE_PRIMITIVE_TYPE(TYPE, METHOD) \ 575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<> inline TYPE PrimitiveTypeTraits<TYPE>::Get( \ 576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number, const ExtensionSet& set, TYPE default_value) { \ 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return set.Get##METHOD(number, default_value); \ 578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} \ 579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<> inline void PrimitiveTypeTraits<TYPE>::Set( \ 580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number, FieldType field_type, TYPE value, ExtensionSet* set) { \ 581d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville set->Set##METHOD(number, field_type, value, NULL); \ 582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} \ 583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<> inline TYPE RepeatedPrimitiveTypeTraits<TYPE>::Get( \ 585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number, const ExtensionSet& set, int index) { \ 586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return set.GetRepeated##METHOD(number, index); \ 587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} \ 588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<> inline void RepeatedPrimitiveTypeTraits<TYPE>::Set( \ 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number, int index, TYPE value, ExtensionSet* set) { \ 590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville set->SetRepeated##METHOD(number, index, value); \ 591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} \ 592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<> inline void RepeatedPrimitiveTypeTraits<TYPE>::Add( \ 593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number, FieldType field_type, bool is_packed, \ 594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE value, ExtensionSet* set) { \ 595d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville set->Add##METHOD(number, field_type, is_packed, value, NULL); \ 596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_PRIMITIVE_TYPE( int32, Int32) 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_PRIMITIVE_TYPE( int64, Int64) 600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_PRIMITIVE_TYPE(uint32, UInt32) 601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_PRIMITIVE_TYPE(uint64, UInt64) 602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_PRIMITIVE_TYPE( float, Float) 603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_PRIMITIVE_TYPE(double, Double) 604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_PRIMITIVE_TYPE( bool, Bool) 605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef PROTOBUF_DEFINE_PRIMITIVE_TYPE 607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// StringTypeTraits 610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Strings support both Set() and Mutable(). 612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT StringTypeTraits { 613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef const string& ConstType; 615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef string* MutableType; 616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline const string& Get(int number, const ExtensionSet& set, 618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ConstType default_value) { 619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return set.GetString(number, default_value); 620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void Set(int number, FieldType field_type, 622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& value, ExtensionSet* set) { 623d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville set->SetString(number, field_type, value, NULL); 624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline string* Mutable(int number, FieldType field_type, 626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExtensionSet* set) { 627d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return set->MutableString(number, field_type, NULL); 628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT RepeatedStringTypeTraits { 632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef const string& ConstType; 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef string* MutableType; 635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline const string& Get(int number, const ExtensionSet& set, 637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index) { 638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return set.GetRepeatedString(number, index); 639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void Set(int number, int index, 641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& value, ExtensionSet* set) { 642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville set->SetRepeatedString(number, index, value); 643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline string* Mutable(int number, int index, ExtensionSet* set) { 645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return set->MutableRepeatedString(number, index); 646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void Add(int number, FieldType field_type, 648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool /*is_packed*/, const string& value, 649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExtensionSet* set) { 650d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville set->AddString(number, field_type, value, NULL); 651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline string* Add(int number, FieldType field_type, 653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExtensionSet* set) { 654d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return set->AddString(number, field_type, NULL); 655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// EnumTypeTraits 660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ExtensionSet represents enums using integers internally, so we have to 662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static_cast around. 663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type, bool IsValid(int)> 664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumTypeTraits { 665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef Type ConstType; 667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline ConstType Get(int number, const ExtensionSet& set, 669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ConstType default_value) { 670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<Type>(set.GetEnum(number, default_value)); 671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void Set(int number, FieldType field_type, 673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ConstType value, ExtensionSet* set) { 674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DCHECK(IsValid(value)); 675d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville set->SetEnum(number, field_type, value, NULL); 676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type, bool IsValid(int)> 680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass RepeatedEnumTypeTraits { 681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef Type ConstType; 683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline ConstType Get(int number, const ExtensionSet& set, int index) { 685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<Type>(set.GetRepeatedEnum(number, index)); 686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void Set(int number, int index, 688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ConstType value, ExtensionSet* set) { 689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DCHECK(IsValid(value)); 690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville set->SetRepeatedEnum(number, index, value); 691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void Add(int number, FieldType field_type, 693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed, ConstType value, ExtensionSet* set) { 694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DCHECK(IsValid(value)); 695d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville set->AddEnum(number, field_type, is_packed, value, NULL); 696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// MessageTypeTraits 701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ExtensionSet guarantees that when manipulating extensions with message 703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// types, the implementation used will be the compiled-in class representing 704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// that type. So, we can static_cast down to the exact type we expect. 705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MessageTypeTraits { 707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef const Type& ConstType; 709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef Type* MutableType; 710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline ConstType Get(int number, const ExtensionSet& set, 712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ConstType default_value) { 713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<const Type&>( 714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville set.GetMessage(number, default_value)); 715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline MutableType Mutable(int number, FieldType field_type, 717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExtensionSet* set) { 718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<Type*>( 719d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville set->MutableMessage(number, field_type, Type::default_instance(), NULL)); 720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type> 724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass RepeatedMessageTypeTraits { 725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef const Type& ConstType; 727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef Type* MutableType; 728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline ConstType Get(int number, const ExtensionSet& set, int index) { 730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<const Type&>(set.GetRepeatedMessage(number, index)); 731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline MutableType Mutable(int number, int index, ExtensionSet* set) { 733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<Type*>(set->MutableRepeatedMessage(number, index)); 734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline MutableType Add(int number, FieldType field_type, 736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExtensionSet* set) { 737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<Type*>( 738d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville set->AddMessage(number, field_type, Type::default_instance(), NULL)); 739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ExtensionIdentifier 744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This is the type of actual extension objects. E.g. if you have: 746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// extends Foo with optional int32 bar = 1234; 747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// then "bar" will be defined in C++ as: 748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ExtensionIdentifier<Foo, PrimitiveTypeTraits<int32>, 1, false> bar(1234); 749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Note that we could, in theory, supply the field number as a template 751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// parameter, and thus make an instance of ExtensionIdentifier have no 752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// actual contents. However, if we did that, then using at extension 753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// identifier would not necessarily cause the compiler to output any sort 754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// of reference to any simple defined in the extension's .pb.o file. Some 755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// linkers will actually drop object files that are not explicitly referenced, 756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// but that would be bad because it would cause this extension to not be 757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// registered at static initialization, and therefore using it would crash. 758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename ExtendeeType, typename TypeTraitsType, 760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldType field_type, bool is_packed> 761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ExtensionIdentifier { 762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef TypeTraitsType TypeTraits; 764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef ExtendeeType Extendee; 765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExtensionIdentifier(int number, typename TypeTraits::ConstType default_value) 767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville : number_(number), default_value_(default_value) {} 768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline int number() const { return number_; } 769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typename TypeTraits::ConstType default_value() const { 770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return default_value_; 771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const int number_; 775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typename TypeTraits::ConstType default_value_; 776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Generated accessors 780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This macro should be expanded in the context of a generated type which 782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// has extensions. 783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// We use "_proto_TypeTraits" as a type name below because "TypeTraits" 785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// causes problems if the class has a nested message or enum type with that 786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// name and "_TypeTraits" is technically reserved for the C++ library since 787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// it starts with an underscore followed by a capital letter. 788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(CLASSNAME) \ 789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /* Has, Size, Clear */ \ 790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template <typename _proto_TypeTraits, \ 791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ::google::protobuf::internal::FieldType field_type, \ 792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed> \ 793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline bool HasExtension( \ 794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::google::protobuf::internal::ExtensionIdentifier< \ 795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const { \ 796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return _extensions_.Has(id.number()); \ 797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template <typename _proto_TypeTraits, \ 800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ::google::protobuf::internal::FieldType field_type, \ 801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed> \ 802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline void ClearExtension( \ 803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::google::protobuf::internal::ExtensionIdentifier< \ 804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) { \ 805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville _extensions_.ClearExtension(id.number()); \ 806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template <typename _proto_TypeTraits, \ 809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ::google::protobuf::internal::FieldType field_type, \ 810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed> \ 811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline int ExtensionSize( \ 812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::google::protobuf::internal::ExtensionIdentifier< \ 813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const { \ 814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return _extensions_.ExtensionSize(id.number()); \ 815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /* Singular accessors */ \ 818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template <typename _proto_TypeTraits, \ 819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ::google::protobuf::internal::FieldType field_type, \ 820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed> \ 821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline typename _proto_TypeTraits::ConstType GetExtension( \ 822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::google::protobuf::internal::ExtensionIdentifier< \ 823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const { \ 824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return _proto_TypeTraits::Get(id.number(), _extensions_, \ 825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville id.default_value()); \ 826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template <typename _proto_TypeTraits, \ 829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ::google::protobuf::internal::FieldType field_type, \ 830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed> \ 831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline typename _proto_TypeTraits::MutableType MutableExtension( \ 832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::google::protobuf::internal::ExtensionIdentifier< \ 833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) { \ 834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return _proto_TypeTraits::Mutable(id.number(), field_type, &_extensions_);\ 835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template <typename _proto_TypeTraits, \ 838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ::google::protobuf::internal::FieldType field_type, \ 839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed> \ 840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline void SetExtension( \ 841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::google::protobuf::internal::ExtensionIdentifier< \ 842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ 843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typename _proto_TypeTraits::ConstType value) { \ 844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville _proto_TypeTraits::Set(id.number(), field_type, value, &_extensions_); \ 845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /* Repeated accessors */ \ 848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template <typename _proto_TypeTraits, \ 849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ::google::protobuf::internal::FieldType field_type, \ 850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed> \ 851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline typename _proto_TypeTraits::ConstType GetExtension( \ 852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::google::protobuf::internal::ExtensionIdentifier< \ 853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ 854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index) const { \ 855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return _proto_TypeTraits::Get(id.number(), _extensions_, index); \ 856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template <typename _proto_TypeTraits, \ 859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ::google::protobuf::internal::FieldType field_type, \ 860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed> \ 861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline typename _proto_TypeTraits::MutableType MutableExtension( \ 862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::google::protobuf::internal::ExtensionIdentifier< \ 863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ 864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index) { \ 865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return _proto_TypeTraits::Mutable(id.number(), index, &_extensions_); \ 866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template <typename _proto_TypeTraits, \ 869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ::google::protobuf::internal::FieldType field_type, \ 870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed> \ 871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline void SetExtension( \ 872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::google::protobuf::internal::ExtensionIdentifier< \ 873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ 874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index, typename _proto_TypeTraits::ConstType value) { \ 875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville _proto_TypeTraits::Set(id.number(), index, value, &_extensions_); \ 876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template <typename _proto_TypeTraits, \ 879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ::google::protobuf::internal::FieldType field_type, \ 880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed> \ 881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline typename _proto_TypeTraits::MutableType AddExtension( \ 882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::google::protobuf::internal::ExtensionIdentifier< \ 883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) { \ 884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return _proto_TypeTraits::Add(id.number(), field_type, &_extensions_); \ 885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } \ 886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville \ 887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template <typename _proto_TypeTraits, \ 888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ::google::protobuf::internal::FieldType field_type, \ 889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_packed> \ 890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline void AddExtension( \ 891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ::google::protobuf::internal::ExtensionIdentifier< \ 892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ 893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typename _proto_TypeTraits::ConstType value) { \ 894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville _proto_TypeTraits::Add(id.number(), field_type, is_packed, \ 895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value, &_extensions_); \ 896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace internal 899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // GOOGLE_PROTOBUF_EXTENSION_SET_H__ 903