1555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Protocol Buffers - Google's data interchange format 2555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Copyright 2008 Google Inc. All rights reserved. 3555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// http://code.google.com/p/protobuf/ 4555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 5555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Redistribution and use in source and binary forms, with or without 6555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// modification, are permitted provided that the following conditions are 7555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// met: 8555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 9555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * Redistributions of source code must retain the above copyright 10555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// notice, this list of conditions and the following disclaimer. 11555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * Redistributions in binary form must reproduce the above 12555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// copyright notice, this list of conditions and the following disclaimer 13555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// in the documentation and/or other materials provided with the 14555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// distribution. 15555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * Neither the name of Google Inc. nor the names of its 16555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// contributors may be used to endorse or promote products derived from 17555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// this software without specific prior written permission. 18555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 19555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 31555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Author: kenton@google.com (Kenton Varda) 32555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Based on original Protocol Buffers design by 33555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Sanjay Ghemawat, Jeff Dean, and others. 34555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 35555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This header is logically internal, but is made public because it is used 36555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// from protocol-compiler-generated code, which may reside in other components. 37555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 38555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#ifndef GOOGLE_PROTOBUF_EXTENSION_SET_H__ 39555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define GOOGLE_PROTOBUF_EXTENSION_SET_H__ 40555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 41555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <vector> 42555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <map> 43555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <utility> 44555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <string> 45555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 46555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 47555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/stubs/common.h> 48555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 49555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace google { 50555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 51555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace protobuf { 52555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class Descriptor; // descriptor.h 53555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class FieldDescriptor; // descriptor.h 54555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class DescriptorPool; // descriptor.h 55555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class MessageLite; // message_lite.h 56555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class Message; // message.h 57555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class MessageFactory; // message.h 58555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class UnknownFieldSet; // unknown_field_set.h 59555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot namespace io { 60555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class CodedInputStream; // coded_stream.h 61555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class CodedOutputStream; // coded_stream.h 62555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 63555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot namespace internal { 64555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class FieldSkipper; // wire_format_lite.h 65555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class RepeatedPtrFieldBase; // repeated_field.h 66555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 67555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename Element> class RepeatedField; // repeated_field.h 68555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename Element> class RepeatedPtrField; // repeated_field.h 69555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 70555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 71555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace protobuf { 72555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace internal { 73555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 74555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Used to store values of type WireFormatLite::FieldType without having to 75555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// #include wire_format_lite.h. Also, ensures that we use only one byte to 76555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// store these values, which is important to keep the layout of 77555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ExtensionSet::Extension small. 78555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottypedef uint8 FieldType; 79555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 80555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// A function which, given an integer value, returns true if the number 81555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// matches one of the defined values for the corresponding enum type. This 82555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// is used with RegisterEnumExtension, below. 83555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottypedef bool EnumValidityFunc(int number); 84555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 85555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Version of the above which takes an argument. This is needed to deal with 86555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// extensions that are not compiled in. 87555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottypedef bool EnumValidityFuncWithArg(const void* arg, int number); 88555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 89555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Information about a registered extension. 90555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstruct ExtensionInfo { 91555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline ExtensionInfo() {} 92555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline ExtensionInfo(FieldType type_param, bool isrepeated, bool ispacked) 93555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot : type(type_param), is_repeated(isrepeated), is_packed(ispacked), 94555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot descriptor(NULL) {} 95555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 96555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot FieldType type; 97555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool is_repeated; 98555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool is_packed; 99555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 100555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot struct EnumValidityCheck { 101555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot EnumValidityFuncWithArg* func; 102555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const void* arg; 103555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot }; 104555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 105555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot union { 106555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot EnumValidityCheck enum_validity_check; 107555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const MessageLite* message_prototype; 108555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot }; 109555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 110555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // The descriptor for this extension, if one exists and is known. May be 111555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // NULL. Must not be NULL if the descriptor for the extension does not 112555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // live in the same pool as the descriptor for the containing type. 113555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* descriptor; 114555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 115555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 116555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Abstract interface for an object which looks up extension definitions. Used 117555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// when parsing. 118555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass LIBPROTOBUF_EXPORT ExtensionFinder { 119555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 120555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual ~ExtensionFinder(); 121555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 122555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Find the extension with the given containing type and number. 123555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual bool Find(int number, ExtensionInfo* output) = 0; 124555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 125555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 126555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Implementation of ExtensionFinder which finds extensions defined in .proto 127555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// files which have been compiled into the binary. 128555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass LIBPROTOBUF_EXPORT GeneratedExtensionFinder : public ExtensionFinder { 129555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 130555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot GeneratedExtensionFinder(const MessageLite* containing_type) 131555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot : containing_type_(containing_type) {} 132555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual ~GeneratedExtensionFinder() {} 133555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 134555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns true and fills in *output if found, otherwise returns false. 135555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual bool Find(int number, ExtensionInfo* output); 136555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 137555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot private: 138555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const MessageLite* containing_type_; 139555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 140555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 141555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Note: extension_set_heavy.cc defines DescriptorPoolExtensionFinder for 142555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// finding extensions from a DescriptorPool. 143555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 144555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This is an internal helper class intended for use within the protocol buffer 145555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// library and generated classes. Clients should not use it directly. Instead, 146555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// use the generated accessors such as GetExtension() of the class being 147555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// extended. 148555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 149555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This class manages extensions for a protocol message object. The 150555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// message's HasExtension(), GetExtension(), MutableExtension(), and 151555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ClearExtension() methods are just thin wrappers around the embedded 152555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ExtensionSet. When parsing, if a tag number is encountered which is 153555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// inside one of the message type's extension ranges, the tag is passed 154555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// off to the ExtensionSet for parsing. Etc. 155555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass LIBPROTOBUF_EXPORT ExtensionSet { 156555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 157555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ExtensionSet(); 158555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ~ExtensionSet(); 159555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 160555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // These are called at startup by protocol-compiler-generated code to 161555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // register known extensions. The registrations are used by ParseField() 162555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // to look up extensions for parsed field numbers. Note that dynamic parsing 163555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // does not use ParseField(); only protocol-compiler-generated parsing 164555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // methods do. 165555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static void RegisterExtension(const MessageLite* containing_type, 166555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int number, FieldType type, 167555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool is_repeated, bool is_packed); 168555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static void RegisterEnumExtension(const MessageLite* containing_type, 169555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int number, FieldType type, 170555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool is_repeated, bool is_packed, 171555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot EnumValidityFunc* is_valid); 172555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static void RegisterMessageExtension(const MessageLite* containing_type, 173555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int number, FieldType type, 174555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool is_repeated, bool is_packed, 175555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const MessageLite* prototype); 176555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 177555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // ================================================================= 178555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 179555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Add all fields which are currently present to the given vector. This 180555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // is useful to implement Reflection::ListFields(). 181555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void AppendToList(const Descriptor* containing_type, 182555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const DescriptorPool* pool, 183555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot vector<const FieldDescriptor*>* output) const; 184555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 185555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // ================================================================= 186555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Accessors 187555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 188555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Generated message classes include type-safe templated wrappers around 189555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // these methods. Generally you should use those rather than call these 190555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // directly, unless you are doing low-level memory management. 191555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 192555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // When calling any of these accessors, the extension number requested 193555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // MUST exist in the DescriptorPool provided to the constructor. Otheriwse, 194555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // the method will fail an assert. Normally, though, you would not call 195555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // these directly; you would either call the generated accessors of your 196555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // message class (e.g. GetExtension()) or you would call the accessors 197555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // of the reflection interface. In both cases, it is impossible to 198555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // trigger this assert failure: the generated accessors only accept 199555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // linked-in extension types as parameters, while the Reflection interface 200555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // requires you to provide the FieldDescriptor describing the extension. 201555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 202555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // When calling any of these accessors, a protocol-compiler-generated 203555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // implementation of the extension corresponding to the number MUST 204555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // be linked in, and the FieldDescriptor used to refer to it MUST be 205555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // the one generated by that linked-in code. Otherwise, the method will 206555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // die on an assert failure. The message objects returned by the message 207555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // accessors are guaranteed to be of the correct linked-in type. 208555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 209555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // These methods pretty much match Reflection except that: 210555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // - They're not virtual. 211555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // - They identify fields by number rather than FieldDescriptors. 212555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // - They identify enum values using integers rather than descriptors. 213555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // - Strings provide Mutable() in addition to Set() accessors. 214555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 215555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool Has(int number) const; 216555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int ExtensionSize(int number) const; // Size of a repeated extension. 217555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int NumExtensions() const; // The number of extensions 218555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot FieldType ExtensionType(int number) const; 219555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void ClearExtension(int number); 220555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 221555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // singular fields ------------------------------------------------- 222555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 223555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int32 GetInt32 (int number, int32 default_value) const; 224555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int64 GetInt64 (int number, int64 default_value) const; 225555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 GetUInt32(int number, uint32 default_value) const; 226555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint64 GetUInt64(int number, uint64 default_value) const; 227555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot float GetFloat (int number, float default_value) const; 228555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot double GetDouble(int number, double default_value) const; 229555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool GetBool (int number, bool default_value) const; 230555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int GetEnum (int number, int default_value) const; 231555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const string & GetString (int number, const string& default_value) const; 232555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const MessageLite& GetMessage(int number, 233555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const MessageLite& default_value) const; 234555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const MessageLite& GetMessage(int number, const Descriptor* message_type, 235555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageFactory* factory) const; 236555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 237555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // |descriptor| may be NULL so long as it is known that the descriptor for 238555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // the extension lives in the same pool as the descriptor for the containing 239555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // type. 240555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define desc const FieldDescriptor* descriptor // avoid line wrapping 241555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetInt32 (int number, FieldType type, int32 value, desc); 242555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetInt64 (int number, FieldType type, int64 value, desc); 243555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetUInt32(int number, FieldType type, uint32 value, desc); 244555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetUInt64(int number, FieldType type, uint64 value, desc); 245555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetFloat (int number, FieldType type, float value, desc); 246555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetDouble(int number, FieldType type, double value, desc); 247555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetBool (int number, FieldType type, bool value, desc); 248555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetEnum (int number, FieldType type, int value, desc); 249555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetString(int number, FieldType type, const string& value, desc); 250555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot string * MutableString (int number, FieldType type, desc); 251555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageLite* MutableMessage(int number, FieldType type, 252555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const MessageLite& prototype, desc); 253555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageLite* MutableMessage(const FieldDescriptor* decsriptor, 254555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageFactory* factory); 255555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Adds the given message to the ExtensionSet, taking ownership of the 256555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // message object. Existing message with the same number will be deleted. 257555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // If "message" is NULL, this is equivalent to "ClearExtension(number)". 258555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetAllocatedMessage(int number, FieldType type, 259555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* descriptor, 260555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageLite* message); 261555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageLite* ReleaseMessage(int number, const MessageLite& prototype); 262555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageLite* ReleaseMessage(const FieldDescriptor* descriptor, 263555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageFactory* factory); 264555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#undef desc 265555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 266555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // repeated fields ------------------------------------------------- 267555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 268555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void* MutableRawRepeatedField(int number); 269555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 270555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int32 GetRepeatedInt32 (int number, int index) const; 271555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int64 GetRepeatedInt64 (int number, int index) const; 272555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 GetRepeatedUInt32(int number, int index) const; 273555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint64 GetRepeatedUInt64(int number, int index) const; 274555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot float GetRepeatedFloat (int number, int index) const; 275555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot double GetRepeatedDouble(int number, int index) const; 276555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool GetRepeatedBool (int number, int index) const; 277555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int GetRepeatedEnum (int number, int index) const; 278555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const string & GetRepeatedString (int number, int index) const; 279555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const MessageLite& GetRepeatedMessage(int number, int index) const; 280555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 281555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetRepeatedInt32 (int number, int index, int32 value); 282555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetRepeatedInt64 (int number, int index, int64 value); 283555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetRepeatedUInt32(int number, int index, uint32 value); 284555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetRepeatedUInt64(int number, int index, uint64 value); 285555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetRepeatedFloat (int number, int index, float value); 286555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetRepeatedDouble(int number, int index, double value); 287555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetRepeatedBool (int number, int index, bool value); 288555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetRepeatedEnum (int number, int index, int value); 289555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SetRepeatedString(int number, int index, const string& value); 290555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot string * MutableRepeatedString (int number, int index); 291555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageLite* MutableRepeatedMessage(int number, int index); 292555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 293555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define desc const FieldDescriptor* descriptor // avoid line wrapping 294555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void AddInt32 (int number, FieldType type, bool packed, int32 value, desc); 295555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void AddInt64 (int number, FieldType type, bool packed, int64 value, desc); 296555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void AddUInt32(int number, FieldType type, bool packed, uint32 value, desc); 297555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void AddUInt64(int number, FieldType type, bool packed, uint64 value, desc); 298555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void AddFloat (int number, FieldType type, bool packed, float value, desc); 299555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void AddDouble(int number, FieldType type, bool packed, double value, desc); 300555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void AddBool (int number, FieldType type, bool packed, bool value, desc); 301555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void AddEnum (int number, FieldType type, bool packed, int value, desc); 302555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void AddString(int number, FieldType type, const string& value, desc); 303555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot string * AddString (int number, FieldType type, desc); 304555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageLite* AddMessage(int number, FieldType type, 305555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const MessageLite& prototype, desc); 306555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageLite* AddMessage(const FieldDescriptor* descriptor, 307555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageFactory* factory); 308555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#undef desc 309555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 310555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void RemoveLast(int number); 311555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageLite* ReleaseLast(int number); 312555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SwapElements(int number, int index1, int index2); 313555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 314555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // ----------------------------------------------------------------- 315555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // TODO(kenton): Hardcore memory management accessors 316555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 317555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // ================================================================= 318555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // convenience methods for implementing methods of Message 319555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 320555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // These could all be implemented in terms of the other methods of this 321555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // class, but providing them here helps keep the generated code size down. 322555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 323555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void Clear(); 324555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void MergeFrom(const ExtensionSet& other); 325555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void Swap(ExtensionSet* other); 326555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool IsInitialized() const; 327555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 328555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Parses a single extension from the input. The input should start out 329555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // positioned immediately after the tag. 330555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ParseField(uint32 tag, io::CodedInputStream* input, 331555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ExtensionFinder* extension_finder, 332555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot FieldSkipper* field_skipper); 333555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 334555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Specific versions for lite or full messages (constructs the appropriate 335555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // FieldSkipper automatically). |containing_type| is the default 336555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // instance for the containing message; it is used only to look up the 337555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // extension by number. See RegisterExtension(), above. Unlike the other 338555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // methods of ExtensionSet, this only works for generated message types -- 339555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // it looks up extensions registered using RegisterExtension(). 340555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ParseField(uint32 tag, io::CodedInputStream* input, 341555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const MessageLite* containing_type); 342555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ParseField(uint32 tag, io::CodedInputStream* input, 343555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const Message* containing_type, 344555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot UnknownFieldSet* unknown_fields); 345555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 346555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Parse an entire message in MessageSet format. Such messages have no 347555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // fields, only extensions. 348555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ParseMessageSet(io::CodedInputStream* input, 349555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ExtensionFinder* extension_finder, 350555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot FieldSkipper* field_skipper); 351555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 352555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Specific versions for lite or full messages (constructs the appropriate 353555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // FieldSkipper automatically). 354555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ParseMessageSet(io::CodedInputStream* input, 355555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const MessageLite* containing_type); 356555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ParseMessageSet(io::CodedInputStream* input, 357555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const Message* containing_type, 358555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot UnknownFieldSet* unknown_fields); 359555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 360555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Write all extension fields with field numbers in the range 361555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // [start_field_number, end_field_number) 362555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // to the output stream, using the cached sizes computed when ByteSize() was 363555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // last called. Note that the range bounds are inclusive-exclusive. 364555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SerializeWithCachedSizes(int start_field_number, 365555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int end_field_number, 366555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot io::CodedOutputStream* output) const; 367555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 368555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Same as SerializeWithCachedSizes, but without any bounds checking. 369555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // The caller must ensure that target has sufficient capacity for the 370555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // serialized extensions. 371555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // 372555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns a pointer past the last written byte. 373555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* SerializeWithCachedSizesToArray(int start_field_number, 374555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int end_field_number, 375555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* target) const; 376555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 377555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like above but serializes in MessageSet format. 378555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SerializeMessageSetWithCachedSizes(io::CodedOutputStream* output) const; 379555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* SerializeMessageSetWithCachedSizesToArray(uint8* target) const; 380555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 381555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns the total serialized size of all the extensions. 382555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int ByteSize() const; 383555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 384555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like ByteSize() but uses MessageSet format. 385555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int MessageSetByteSize() const; 386555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 387555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns (an estimate of) the total number of bytes used for storing the 388555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // extensions in memory, excluding sizeof(*this). If the ExtensionSet is 389555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // for a lite message (and thus possibly contains lite messages), the results 390555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // are undefined (might work, might crash, might corrupt data, might not even 391555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // be linked in). It's up to the protocol compiler to avoid calling this on 392555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // such ExtensionSets (easy enough since lite messages don't implement 393555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // SpaceUsed()). 394555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int SpaceUsedExcludingSelf() const; 395555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 396555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot private: 397555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 398555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Interface of a lazily parsed singular message extension. 399555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot class LIBPROTOBUF_EXPORT LazyMessageExtension { 400555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 401555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot LazyMessageExtension() {} 402555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual ~LazyMessageExtension() {} 403555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 404555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual LazyMessageExtension* New() const = 0; 405555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual const MessageLite& GetMessage( 406555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const MessageLite& prototype) const = 0; 407555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual MessageLite* MutableMessage(const MessageLite& prototype) = 0; 408555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual void SetAllocatedMessage(MessageLite *message) = 0; 409555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual MessageLite* ReleaseMessage(const MessageLite& prototype) = 0; 410555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 411555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual bool IsInitialized() const = 0; 412555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual int ByteSize() const = 0; 413555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual int SpaceUsed() const = 0; 414555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 415555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual void MergeFrom(const LazyMessageExtension& other) = 0; 416555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual void Clear() = 0; 417555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 418555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual bool ReadMessage(const MessageLite& prototype, 419555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot io::CodedInputStream* input) = 0; 420555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual void WriteMessage(int number, 421555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot io::CodedOutputStream* output) const = 0; 422555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual uint8* WriteMessageToArray(int number, uint8* target) const = 0; 423555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot private: 424555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LazyMessageExtension); 425555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot }; 426555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot struct Extension { 427555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // The order of these fields packs Extension into 24 bytes when using 8 428555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // byte alignment. Consider this when adding or removing fields here. 429555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot union { 430555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int32 int32_value; 431555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int64 int64_value; 432555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint32 uint32_value; 433555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint64 uint64_value; 434555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot float float_value; 435555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot double double_value; 436555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool bool_value; 437555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int enum_value; 438555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot string* string_value; 439555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MessageLite* message_value; 440555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot LazyMessageExtension* lazymessage_value; 441555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 442555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot RepeatedField <int32 >* repeated_int32_value; 443555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot RepeatedField <int64 >* repeated_int64_value; 444555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot RepeatedField <uint32 >* repeated_uint32_value; 445555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot RepeatedField <uint64 >* repeated_uint64_value; 446555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot RepeatedField <float >* repeated_float_value; 447555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot RepeatedField <double >* repeated_double_value; 448555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot RepeatedField <bool >* repeated_bool_value; 449555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot RepeatedField <int >* repeated_enum_value; 450555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot RepeatedPtrField<string >* repeated_string_value; 451555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot RepeatedPtrField<MessageLite>* repeated_message_value; 452555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot }; 453555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 454555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot FieldType type; 455555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool is_repeated; 456555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 457555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // For singular types, indicates if the extension is "cleared". This 458555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // happens when an extension is set and then later cleared by the caller. 459555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // We want to keep the Extension object around for reuse, so instead of 460555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // removing it from the map, we just set is_cleared = true. This has no 461555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // meaning for repeated types; for those, the size of the RepeatedField 462555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // simply becomes zero when cleared. 463555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool is_cleared : 4; 464555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 465555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // For singular message types, indicates whether lazy parsing is enabled 466555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // for this extension. This field is only valid when type == TYPE_MESSAGE 467555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // and !is_repeated because we only support lazy parsing for singular 468555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // message types currently. If is_lazy = true, the extension is stored in 469555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // lazymessage_value. Otherwise, the extension will be message_value. 470555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool is_lazy : 4; 471555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 472555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // For repeated types, this indicates if the [packed=true] option is set. 473555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool is_packed; 474555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 475555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // For packed fields, the size of the packed data is recorded here when 476555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // ByteSize() is called then used during serialization. 477555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // TODO(kenton): Use atomic<int> when C++ supports it. 478555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot mutable int cached_size; 479555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 480555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // The descriptor for this extension, if one exists and is known. May be 481555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // NULL. Must not be NULL if the descriptor for the extension does not 482555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // live in the same pool as the descriptor for the containing type. 483555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* descriptor; 484555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 485555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Some helper methods for operations on a single Extension. 486555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SerializeFieldWithCachedSizes( 487555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int number, 488555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot io::CodedOutputStream* output) const; 489555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* SerializeFieldWithCachedSizesToArray( 490555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int number, 491555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* target) const; 492555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void SerializeMessageSetItemWithCachedSizes( 493555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int number, 494555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot io::CodedOutputStream* output) const; 495555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* SerializeMessageSetItemWithCachedSizesToArray( 496555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int number, 497555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot uint8* target) const; 498555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int ByteSize(int number) const; 499555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int MessageSetItemByteSize(int number) const; 500555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void Clear(); 501555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int GetSize() const; 502555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void Free(); 503555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int SpaceUsedExcludingSelf() const; 504555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot }; 505555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 506555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 507555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Returns true and fills field_number and extension if extension is found. 508555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool FindExtensionInfoFromTag(uint32 tag, ExtensionFinder* extension_finder, 509555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int* field_number, ExtensionInfo* extension); 510555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 511555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Parses a single extension from the input. The input should start out 512555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // positioned immediately after the wire tag. This method is called in 513555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // ParseField() after field number is extracted from the wire tag and 514555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // ExtensionInfo is found by the field number. 515555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ParseFieldWithExtensionInfo(int field_number, 516555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ExtensionInfo& extension, 517555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot io::CodedInputStream* input, 518555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot FieldSkipper* field_skipper); 519555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 520555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Like ParseField(), but this method may parse singular message extensions 521555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // lazily depending on the value of FLAGS_eagerly_parse_message_sets. 522555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ParseFieldMaybeLazily(uint32 tag, io::CodedInputStream* input, 523555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ExtensionFinder* extension_finder, 524555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot FieldSkipper* field_skipper); 525555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 526555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Gets the extension with the given number, creating it if it does not 527555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // already exist. Returns true if the extension did not already exist. 528555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool MaybeNewExtension(int number, const FieldDescriptor* descriptor, 529555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Extension** result); 530555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 531555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Parse a single MessageSet item -- called just after the item group start 532555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // tag has been read. 533555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool ParseMessageSetItem(io::CodedInputStream* input, 534555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ExtensionFinder* extension_finder, 535555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot FieldSkipper* field_skipper); 536555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 537555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 538555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Hack: RepeatedPtrFieldBase declares ExtensionSet as a friend. This 539555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // friendship should automatically extend to ExtensionSet::Extension, but 540555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // unfortunately some older compilers (e.g. GCC 3.4.4) do not implement this 541555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // correctly. So, we must provide helpers for calling methods of that 542555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // class. 543555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 544555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Defined in extension_set_heavy.cc. 545555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline int RepeatedMessage_SpaceUsedExcludingSelf( 546555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot RepeatedPtrFieldBase* field); 547555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 548555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // The Extension struct is small enough to be passed by value, so we use it 549555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // directly as the value type in the map rather than use pointers. We use 550555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // a map rather than hash_map here because we expect most ExtensionSets will 551555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // only contain a small number of extensions whereas hash_map is optimized 552555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // for 100 elements or more. Also, we want AppendToList() to order fields 553555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // by field number. 554555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot std::map<int, Extension> extensions_; 555555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 556555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionSet); 557555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 558555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 559555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// These are just for convenience... 560555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void ExtensionSet::SetString(int number, FieldType type, 561555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const string& value, 562555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* descriptor) { 563555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MutableString(number, type, descriptor)->assign(value); 564555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 565555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void ExtensionSet::SetRepeatedString(int number, int index, 566555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const string& value) { 567555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MutableRepeatedString(number, index)->assign(value); 568555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 569555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotinline void ExtensionSet::AddString(int number, FieldType type, 570555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const string& value, 571555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* descriptor) { 572555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot AddString(number, type, descriptor)->assign(value); 573555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 574555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 575555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// =================================================================== 576555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Glue for generated extension accessors 577555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 578555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ------------------------------------------------------------------- 579555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Template magic 580555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 581555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// First we have a set of classes representing "type traits" for different 582555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// field types. A type traits class knows how to implement basic accessors 583555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// for extensions of a particular type given an ExtensionSet. The signature 584555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// for a type traits class looks like this: 585555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 586555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// class TypeTraits { 587555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// public: 588555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// typedef ? ConstType; 589555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// typedef ? MutableType; 590555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 591555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// static inline ConstType Get(int number, const ExtensionSet& set); 592555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// static inline void Set(int number, ConstType value, ExtensionSet* set); 593555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// static inline MutableType Mutable(int number, ExtensionSet* set); 594555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 595555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// // Variants for repeated fields. 596555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// static inline ConstType Get(int number, const ExtensionSet& set, 597555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// int index); 598555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// static inline void Set(int number, int index, 599555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ConstType value, ExtensionSet* set); 600555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// static inline MutableType Mutable(int number, int index, 601555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ExtensionSet* set); 602555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// static inline void Add(int number, ConstType value, ExtensionSet* set); 603555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// static inline MutableType Add(int number, ExtensionSet* set); 604555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// }; 605555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 606555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Not all of these methods make sense for all field types. For example, the 607555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// "Mutable" methods only make sense for strings and messages, and the 608555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// repeated methods only make sense for repeated types. So, each type 609555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// traits class implements only the set of methods from this signature that it 610555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// actually supports. This will cause a compiler error if the user tries to 611555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// access an extension using a method that doesn't make sense for its type. 612555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// For example, if "foo" is an extension of type "optional int32", then if you 613555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// try to write code like: 614555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// my_message.MutableExtension(foo) 615555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// you will get a compile error because PrimitiveTypeTraits<int32> does not 616555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// have a "Mutable()" method. 617555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 618555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ------------------------------------------------------------------- 619555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// PrimitiveTypeTraits 620555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 621555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Since the ExtensionSet has different methods for each primitive type, 622555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// we must explicitly define the methods of the type traits class for each 623555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// known type. 624555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottemplate <typename Type> 625555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass PrimitiveTypeTraits { 626555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 627555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef Type ConstType; 628555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 629555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline ConstType Get(int number, const ExtensionSet& set, 630555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ConstType default_value); 631555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline void Set(int number, FieldType field_type, 632555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ConstType value, ExtensionSet* set); 633555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 634555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 635555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottemplate <typename Type> 636555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass RepeatedPrimitiveTypeTraits { 637555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 638555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef Type ConstType; 639555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 640555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline Type Get(int number, const ExtensionSet& set, int index); 641555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline void Set(int number, int index, Type value, ExtensionSet* set); 642555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline void Add(int number, FieldType field_type, 643555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool is_packed, Type value, ExtensionSet* set); 644555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 645555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 646555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define PROTOBUF_DEFINE_PRIMITIVE_TYPE(TYPE, METHOD) \ 647555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottemplate<> inline TYPE PrimitiveTypeTraits<TYPE>::Get( \ 648555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int number, const ExtensionSet& set, TYPE default_value) { \ 649555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return set.Get##METHOD(number, default_value); \ 650555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} \ 651555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottemplate<> inline void PrimitiveTypeTraits<TYPE>::Set( \ 652555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int number, FieldType field_type, TYPE value, ExtensionSet* set) { \ 653555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot set->Set##METHOD(number, field_type, value, NULL); \ 654555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} \ 655555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot \ 656555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottemplate<> inline TYPE RepeatedPrimitiveTypeTraits<TYPE>::Get( \ 657555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int number, const ExtensionSet& set, int index) { \ 658555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return set.GetRepeated##METHOD(number, index); \ 659555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} \ 660555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottemplate<> inline void RepeatedPrimitiveTypeTraits<TYPE>::Set( \ 661555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int number, int index, TYPE value, ExtensionSet* set) { \ 662555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot set->SetRepeated##METHOD(number, index, value); \ 663555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} \ 664555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottemplate<> inline void RepeatedPrimitiveTypeTraits<TYPE>::Add( \ 665555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int number, FieldType field_type, bool is_packed, \ 666555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot TYPE value, ExtensionSet* set) { \ 667555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot set->Add##METHOD(number, field_type, is_packed, value, NULL); \ 668555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 669555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 670555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE( int32, Int32) 671555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE( int64, Int64) 672555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE(uint32, UInt32) 673555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE(uint64, UInt64) 674555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE( float, Float) 675555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE(double, Double) 676555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE( bool, Bool) 677555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 678555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#undef PROTOBUF_DEFINE_PRIMITIVE_TYPE 679555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 680555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ------------------------------------------------------------------- 681555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// StringTypeTraits 682555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 683555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Strings support both Set() and Mutable(). 684555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass LIBPROTOBUF_EXPORT StringTypeTraits { 685555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 686555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef const string& ConstType; 687555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef string* MutableType; 688555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 689555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline const string& Get(int number, const ExtensionSet& set, 690555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ConstType default_value) { 691555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return set.GetString(number, default_value); 692555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 693555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline void Set(int number, FieldType field_type, 694555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const string& value, ExtensionSet* set) { 695555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot set->SetString(number, field_type, value, NULL); 696555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 697555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline string* Mutable(int number, FieldType field_type, 698555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ExtensionSet* set) { 699555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return set->MutableString(number, field_type, NULL); 700555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 701555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 702555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 703555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass LIBPROTOBUF_EXPORT RepeatedStringTypeTraits { 704555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 705555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef const string& ConstType; 706555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef string* MutableType; 707555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 708555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline const string& Get(int number, const ExtensionSet& set, 709555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int index) { 710555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return set.GetRepeatedString(number, index); 711555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 712555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline void Set(int number, int index, 713555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const string& value, ExtensionSet* set) { 714555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot set->SetRepeatedString(number, index, value); 715555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 716555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline string* Mutable(int number, int index, ExtensionSet* set) { 717555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return set->MutableRepeatedString(number, index); 718555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 719555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline void Add(int number, FieldType field_type, 720555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool /*is_packed*/, const string& value, 721555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ExtensionSet* set) { 722555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot set->AddString(number, field_type, value, NULL); 723555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 724555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline string* Add(int number, FieldType field_type, 725555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ExtensionSet* set) { 726555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return set->AddString(number, field_type, NULL); 727555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 728555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 729555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 730555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ------------------------------------------------------------------- 731555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// EnumTypeTraits 732555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 733555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ExtensionSet represents enums using integers internally, so we have to 734555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// static_cast around. 735555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottemplate <typename Type, bool IsValid(int)> 736555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass EnumTypeTraits { 737555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 738555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef Type ConstType; 739555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 740555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline ConstType Get(int number, const ExtensionSet& set, 741555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ConstType default_value) { 742555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return static_cast<Type>(set.GetEnum(number, default_value)); 743555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 744555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline void Set(int number, FieldType field_type, 745555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ConstType value, ExtensionSet* set) { 746555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot GOOGLE_DCHECK(IsValid(value)); 747555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot set->SetEnum(number, field_type, value, NULL); 748555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 749555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 750555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 751555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottemplate <typename Type, bool IsValid(int)> 752555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass RepeatedEnumTypeTraits { 753555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 754555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef Type ConstType; 755555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 756555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline ConstType Get(int number, const ExtensionSet& set, int index) { 757555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return static_cast<Type>(set.GetRepeatedEnum(number, index)); 758555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 759555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline void Set(int number, int index, 760555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ConstType value, ExtensionSet* set) { 761555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot GOOGLE_DCHECK(IsValid(value)); 762555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot set->SetRepeatedEnum(number, index, value); 763555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 764555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline void Add(int number, FieldType field_type, 765555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool is_packed, ConstType value, ExtensionSet* set) { 766555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot GOOGLE_DCHECK(IsValid(value)); 767555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot set->AddEnum(number, field_type, is_packed, value, NULL); 768555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 769555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 770555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 771555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ------------------------------------------------------------------- 772555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// MessageTypeTraits 773555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 774555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ExtensionSet guarantees that when manipulating extensions with message 775555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// types, the implementation used will be the compiled-in class representing 776555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// that type. So, we can static_cast down to the exact type we expect. 777555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottemplate <typename Type> 778555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass MessageTypeTraits { 779555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 780555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef const Type& ConstType; 781555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef Type* MutableType; 782555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 783555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline ConstType Get(int number, const ExtensionSet& set, 784555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ConstType default_value) { 785555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return static_cast<const Type&>( 786555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot set.GetMessage(number, default_value)); 787555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 788555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline MutableType Mutable(int number, FieldType field_type, 789555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ExtensionSet* set) { 790555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return static_cast<Type*>( 791555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot set->MutableMessage(number, field_type, Type::default_instance(), NULL)); 792555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 793555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline void SetAllocated(int number, FieldType field_type, 794555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot MutableType message, ExtensionSet* set) { 795555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot set->SetAllocatedMessage(number, field_type, NULL, message); 796555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 797555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline MutableType Release(int number, FieldType field_type, 798555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ExtensionSet* set) { 799555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return static_cast<Type*>(set->ReleaseMessage( 800555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot number, Type::default_instance())); 801555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 802555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 803555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 804555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottemplate <typename Type> 805555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass RepeatedMessageTypeTraits { 806555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 807555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef const Type& ConstType; 808555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef Type* MutableType; 809555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 810555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline ConstType Get(int number, const ExtensionSet& set, int index) { 811555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return static_cast<const Type&>(set.GetRepeatedMessage(number, index)); 812555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 813555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline MutableType Mutable(int number, int index, ExtensionSet* set) { 814555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return static_cast<Type*>(set->MutableRepeatedMessage(number, index)); 815555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 816555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot static inline MutableType Add(int number, FieldType field_type, 817555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ExtensionSet* set) { 818555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return static_cast<Type*>( 819555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot set->AddMessage(number, field_type, Type::default_instance(), NULL)); 820555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 821555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 822555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 823555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ------------------------------------------------------------------- 824555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ExtensionIdentifier 825555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 826555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This is the type of actual extension objects. E.g. if you have: 827555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// extends Foo with optional int32 bar = 1234; 828555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// then "bar" will be defined in C++ as: 829555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ExtensionIdentifier<Foo, PrimitiveTypeTraits<int32>, 1, false> bar(1234); 830555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 831555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Note that we could, in theory, supply the field number as a template 832555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// parameter, and thus make an instance of ExtensionIdentifier have no 833555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// actual contents. However, if we did that, then using at extension 834555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// identifier would not necessarily cause the compiler to output any sort 835555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// of reference to any simple defined in the extension's .pb.o file. Some 836555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// linkers will actually drop object files that are not explicitly referenced, 837555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// but that would be bad because it would cause this extension to not be 838555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// registered at static initialization, and therefore using it would crash. 839555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 840555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottemplate <typename ExtendeeType, typename TypeTraitsType, 841555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot FieldType field_type, bool is_packed> 842555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass ExtensionIdentifier { 843555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 844555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef TypeTraitsType TypeTraits; 845555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typedef ExtendeeType Extendee; 846555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 847555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ExtensionIdentifier(int number, typename TypeTraits::ConstType default_value) 848555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot : number_(number), default_value_(default_value) {} 849555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline int number() const { return number_; } 850555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typename TypeTraits::ConstType default_value() const { 851555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return default_value_; 852555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 853555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 854555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot private: 855555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const int number_; 856555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typename TypeTraits::ConstType default_value_; 857555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 858555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 859555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// ------------------------------------------------------------------- 860555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Generated accessors 861555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 862555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// This macro should be expanded in the context of a generated type which 863555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// has extensions. 864555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 865555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// We use "_proto_TypeTraits" as a type name below because "TypeTraits" 866555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// causes problems if the class has a nested message or enum type with that 867555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// name and "_TypeTraits" is technically reserved for the C++ library since 868555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// it starts with an underscore followed by a capital letter. 869555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 870555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// For similar reason, we use "_field_type" and "_is_packed" as parameter names 871555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// below, so that "field_type" and "is_packed" can be used as field names. 872555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(CLASSNAME) \ 873555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot /* Has, Size, Clear */ \ 874555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename _proto_TypeTraits, \ 875555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ::google::protobuf::internal::FieldType _field_type, \ 876555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool _is_packed> \ 877555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline bool HasExtension( \ 878555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ::google::protobuf::internal::ExtensionIdentifier< \ 879555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const { \ 880555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return _extensions_.Has(id.number()); \ 881555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } \ 882555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot \ 883555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename _proto_TypeTraits, \ 884555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ::google::protobuf::internal::FieldType _field_type, \ 885555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool _is_packed> \ 886555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline void ClearExtension( \ 887555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ::google::protobuf::internal::ExtensionIdentifier< \ 888555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ 889555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot _extensions_.ClearExtension(id.number()); \ 890555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } \ 891555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot \ 892555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename _proto_TypeTraits, \ 893555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ::google::protobuf::internal::FieldType _field_type, \ 894555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool _is_packed> \ 895555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline int ExtensionSize( \ 896555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ::google::protobuf::internal::ExtensionIdentifier< \ 897555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const { \ 898555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return _extensions_.ExtensionSize(id.number()); \ 899555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } \ 900555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot \ 901555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot /* Singular accessors */ \ 902555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename _proto_TypeTraits, \ 903555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ::google::protobuf::internal::FieldType _field_type, \ 904555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool _is_packed> \ 905555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline typename _proto_TypeTraits::ConstType GetExtension( \ 906555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ::google::protobuf::internal::ExtensionIdentifier< \ 907555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const { \ 908555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return _proto_TypeTraits::Get(id.number(), _extensions_, \ 909555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot id.default_value()); \ 910555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } \ 911555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot \ 912555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename _proto_TypeTraits, \ 913555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ::google::protobuf::internal::FieldType _field_type, \ 914555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool _is_packed> \ 915555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline typename _proto_TypeTraits::MutableType MutableExtension( \ 916555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ::google::protobuf::internal::ExtensionIdentifier< \ 917555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ 918555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return _proto_TypeTraits::Mutable(id.number(), _field_type, \ 919555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot &_extensions_); \ 920555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } \ 921555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot \ 922555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename _proto_TypeTraits, \ 923555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ::google::protobuf::internal::FieldType _field_type, \ 924555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool _is_packed> \ 925555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline void SetExtension( \ 926555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ::google::protobuf::internal::ExtensionIdentifier< \ 927555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ 928555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typename _proto_TypeTraits::ConstType value) { \ 929555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot _proto_TypeTraits::Set(id.number(), _field_type, value, &_extensions_); \ 930555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } \ 931555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot \ 932555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename _proto_TypeTraits, \ 933555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ::google::protobuf::internal::FieldType _field_type, \ 934555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool _is_packed> \ 935555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline void SetAllocatedExtension( \ 936555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ::google::protobuf::internal::ExtensionIdentifier< \ 937555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ 938555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typename _proto_TypeTraits::MutableType value) { \ 939555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot _proto_TypeTraits::SetAllocated(id.number(), _field_type, \ 940555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot value, &_extensions_); \ 941555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } \ 942555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename _proto_TypeTraits, \ 943555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ::google::protobuf::internal::FieldType _field_type, \ 944555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool _is_packed> \ 945555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline typename _proto_TypeTraits::MutableType ReleaseExtension( \ 946555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ::google::protobuf::internal::ExtensionIdentifier< \ 947555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ 948555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return _proto_TypeTraits::Release(id.number(), _field_type, \ 949555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot &_extensions_); \ 950555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } \ 951555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot \ 952555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot /* Repeated accessors */ \ 953555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename _proto_TypeTraits, \ 954555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ::google::protobuf::internal::FieldType _field_type, \ 955555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool _is_packed> \ 956555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline typename _proto_TypeTraits::ConstType GetExtension( \ 957555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ::google::protobuf::internal::ExtensionIdentifier< \ 958555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ 959555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int index) const { \ 960555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return _proto_TypeTraits::Get(id.number(), _extensions_, index); \ 961555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } \ 962555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot \ 963555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename _proto_TypeTraits, \ 964555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ::google::protobuf::internal::FieldType _field_type, \ 965555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool _is_packed> \ 966555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline typename _proto_TypeTraits::MutableType MutableExtension( \ 967555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ::google::protobuf::internal::ExtensionIdentifier< \ 968555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ 969555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int index) { \ 970555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return _proto_TypeTraits::Mutable(id.number(), index, &_extensions_); \ 971555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } \ 972555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot \ 973555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename _proto_TypeTraits, \ 974555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ::google::protobuf::internal::FieldType _field_type, \ 975555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool _is_packed> \ 976555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline void SetExtension( \ 977555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ::google::protobuf::internal::ExtensionIdentifier< \ 978555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ 979555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int index, typename _proto_TypeTraits::ConstType value) { \ 980555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot _proto_TypeTraits::Set(id.number(), index, value, &_extensions_); \ 981555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } \ 982555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot \ 983555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename _proto_TypeTraits, \ 984555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ::google::protobuf::internal::FieldType _field_type, \ 985555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool _is_packed> \ 986555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline typename _proto_TypeTraits::MutableType AddExtension( \ 987555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ::google::protobuf::internal::ExtensionIdentifier< \ 988555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ 989555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot return _proto_TypeTraits::Add(id.number(), _field_type, &_extensions_); \ 990555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } \ 991555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot \ 992555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename _proto_TypeTraits, \ 993555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot ::google::protobuf::internal::FieldType _field_type, \ 994555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool _is_packed> \ 995555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot inline void AddExtension( \ 996555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ::google::protobuf::internal::ExtensionIdentifier< \ 997555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ 998555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot typename _proto_TypeTraits::ConstType value) { \ 999555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot _proto_TypeTraits::Add(id.number(), _field_type, _is_packed, \ 1000555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot value, &_extensions_); \ 1001555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot } 1002555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1003555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} // namespace internal 1004555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} // namespace protobuf 1005555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1006555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} // namespace google 1007555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif // GOOGLE_PROTOBUF_EXTENSION_SET_H__ 1008