15a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Protocol Buffers - Google's data interchange format
25a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Copyright 2008 Google Inc.  All rights reserved.
35a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// http://code.google.com/p/protobuf/
45a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
55a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Redistribution and use in source and binary forms, with or without
65a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// modification, are permitted provided that the following conditions are
75a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// met:
85a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
95a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Redistributions of source code must retain the above copyright
105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// notice, this list of conditions and the following disclaimer.
115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Redistributions in binary form must reproduce the above
125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// copyright notice, this list of conditions and the following disclaimer
135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// in the documentation and/or other materials provided with the
145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// distribution.
155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Neither the name of Google Inc. nor the names of its
165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// contributors may be used to endorse or promote products derived from
175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// this software without specific prior written permission.
185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Author: kenton@google.com (Kenton Varda)
325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//  Based on original Protocol Buffers design by
335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//  Sanjay Ghemawat, Jeff Dean, and others.
345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This header is logically internal, but is made public because it is used
365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// from protocol-compiler-generated code, which may reside in other components.
375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#ifndef GOOGLE_PROTOBUF_EXTENSION_SET_H__
395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define GOOGLE_PROTOBUF_EXTENSION_SET_H__
405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <vector>
425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <map>
435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <utility>
445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <string>
455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/stubs/common.h>
485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace google {
505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace protobuf {
525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class Descriptor;                                    // descriptor.h
535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class FieldDescriptor;                               // descriptor.h
545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class DescriptorPool;                                // descriptor.h
555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class MessageLite;                                   // message_lite.h
565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class Message;                                       // message.h
575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class MessageFactory;                                // message.h
585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class UnknownFieldSet;                               // unknown_field_set.h
595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  namespace io {
605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    class CodedInputStream;                              // coded_stream.h
615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    class CodedOutputStream;                             // coded_stream.h
625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  namespace internal {
645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    class FieldSkipper;                                  // wire_format_lite.h
655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    class RepeatedPtrFieldBase;                          // repeated_field.h
665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename Element> class RepeatedField;     // repeated_field.h
685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename Element> class RepeatedPtrField;  // repeated_field.h
695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace protobuf {
725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace internal {
735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Used to store values of type WireFormatLite::FieldType without having to
755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// #include wire_format_lite.h.  Also, ensures that we use only one byte to
765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// store these values, which is important to keep the layout of
775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ExtensionSet::Extension small.
785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottypedef uint8 FieldType;
795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// A function which, given an integer value, returns true if the number
815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// matches one of the defined values for the corresponding enum type.  This
825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// is used with RegisterEnumExtension, below.
835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottypedef bool EnumValidityFunc(int number);
845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Version of the above which takes an argument.  This is needed to deal with
865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// extensions that are not compiled in.
875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottypedef bool EnumValidityFuncWithArg(const void* arg, int number);
885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Information about a registered extension.
905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotstruct ExtensionInfo {
915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline ExtensionInfo() {}
925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline ExtensionInfo(FieldType type_param, bool isrepeated, bool ispacked)
935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      : type(type_param), is_repeated(isrepeated), is_packed(ispacked),
945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        descriptor(NULL) {}
955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  FieldType type;
975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_repeated;
985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_packed;
995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  struct EnumValidityCheck {
1015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    EnumValidityFuncWithArg* func;
1025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    const void* arg;
1035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
1045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  union {
1065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    EnumValidityCheck enum_validity_check;
1075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    const MessageLite* message_prototype;
1085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
1095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The descriptor for this extension, if one exists and is known.  May be
1115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // NULL.  Must not be NULL if the descriptor for the extension does not
1125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // live in the same pool as the descriptor for the containing type.
1135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* descriptor;
1145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
1155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Abstract interface for an object which looks up extension definitions.  Used
1175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// when parsing.
1185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT ExtensionFinder {
1195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
1205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual ~ExtensionFinder();
1215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Find the extension with the given containing type and number.
1235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual bool Find(int number, ExtensionInfo* output) = 0;
1245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
1255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Implementation of ExtensionFinder which finds extensions defined in .proto
1275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// files which have been compiled into the binary.
1285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT GeneratedExtensionFinder : public ExtensionFinder {
1295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
1305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  GeneratedExtensionFinder(const MessageLite* containing_type)
1315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      : containing_type_(containing_type) {}
1325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual ~GeneratedExtensionFinder() {}
1335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns true and fills in *output if found, otherwise returns false.
1355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual bool Find(int number, ExtensionInfo* output);
1365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
1385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const MessageLite* containing_type_;
1395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
1405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Note:  extension_set_heavy.cc defines DescriptorPoolExtensionFinder for
1425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// finding extensions from a DescriptorPool.
1435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This is an internal helper class intended for use within the protocol buffer
1455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// library and generated classes.  Clients should not use it directly.  Instead,
1465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// use the generated accessors such as GetExtension() of the class being
1475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// extended.
1485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
1495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This class manages extensions for a protocol message object.  The
1505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// message's HasExtension(), GetExtension(), MutableExtension(), and
1515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ClearExtension() methods are just thin wrappers around the embedded
1525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ExtensionSet.  When parsing, if a tag number is encountered which is
1535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// inside one of the message type's extension ranges, the tag is passed
1545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// off to the ExtensionSet for parsing.  Etc.
1555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT ExtensionSet {
1565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
1575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  ExtensionSet();
1585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  ~ExtensionSet();
1595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are called at startup by protocol-compiler-generated code to
1615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // register known extensions.  The registrations are used by ParseField()
1625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // to look up extensions for parsed field numbers.  Note that dynamic parsing
1635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // does not use ParseField(); only protocol-compiler-generated parsing
1645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // methods do.
1655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static void RegisterExtension(const MessageLite* containing_type,
1665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                int number, FieldType type,
1675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                bool is_repeated, bool is_packed);
1685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static void RegisterEnumExtension(const MessageLite* containing_type,
1695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    int number, FieldType type,
1705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    bool is_repeated, bool is_packed,
1715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    EnumValidityFunc* is_valid);
1725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static void RegisterMessageExtension(const MessageLite* containing_type,
1735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                       int number, FieldType type,
1745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                       bool is_repeated, bool is_packed,
1755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                       const MessageLite* prototype);
1765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // =================================================================
1785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Add all fields which are currently present to the given vector.  This
1805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // is useful to implement Reflection::ListFields().
1815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void AppendToList(const Descriptor* containing_type,
1825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                    const DescriptorPool* pool,
1835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                    vector<const FieldDescriptor*>* output) const;
1845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // =================================================================
1865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Accessors
1875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //
1885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Generated message classes include type-safe templated wrappers around
1895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // these methods.  Generally you should use those rather than call these
1905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // directly, unless you are doing low-level memory management.
1915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //
1925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // When calling any of these accessors, the extension number requested
1935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // MUST exist in the DescriptorPool provided to the constructor.  Otheriwse,
1945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // the method will fail an assert.  Normally, though, you would not call
1955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // these directly; you would either call the generated accessors of your
1965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // message class (e.g. GetExtension()) or you would call the accessors
1975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // of the reflection interface.  In both cases, it is impossible to
1985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // trigger this assert failure:  the generated accessors only accept
1995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // linked-in extension types as parameters, while the Reflection interface
2005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // requires you to provide the FieldDescriptor describing the extension.
2015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //
2025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // When calling any of these accessors, a protocol-compiler-generated
2035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // implementation of the extension corresponding to the number MUST
2045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // be linked in, and the FieldDescriptor used to refer to it MUST be
2055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // the one generated by that linked-in code.  Otherwise, the method will
2065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // die on an assert failure.  The message objects returned by the message
2075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // accessors are guaranteed to be of the correct linked-in type.
2085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //
2095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These methods pretty much match Reflection except that:
2105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // - They're not virtual.
2115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // - They identify fields by number rather than FieldDescriptors.
2125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // - They identify enum values using integers rather than descriptors.
2135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // - Strings provide Mutable() in addition to Set() accessors.
2145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool Has(int number) const;
2165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int ExtensionSize(int number) const;   // Size of a repeated extension.
2175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int NumExtensions() const;  // The number of extensions
2185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  FieldType ExtensionType(int number) const;
2195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void ClearExtension(int number);
2205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // singular fields -------------------------------------------------
2225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int32  GetInt32 (int number, int32  default_value) const;
2245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int64  GetInt64 (int number, int64  default_value) const;
2255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  uint32 GetUInt32(int number, uint32 default_value) const;
2265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  uint64 GetUInt64(int number, uint64 default_value) const;
2275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  float  GetFloat (int number, float  default_value) const;
2285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  double GetDouble(int number, double default_value) const;
2295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool   GetBool  (int number, bool   default_value) const;
2305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int    GetEnum  (int number, int    default_value) const;
2315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string & GetString (int number, const string&  default_value) const;
2325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const MessageLite& GetMessage(int number,
2335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                const MessageLite& default_value) const;
2345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const MessageLite& GetMessage(int number, const Descriptor* message_type,
2355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                MessageFactory* factory) const;
2365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // |descriptor| may be NULL so long as it is known that the descriptor for
2385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // the extension lives in the same pool as the descriptor for the containing
2395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // type.
2405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define desc const FieldDescriptor* descriptor  // avoid line wrapping
2415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetInt32 (int number, FieldType type, int32  value, desc);
2425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetInt64 (int number, FieldType type, int64  value, desc);
2435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetUInt32(int number, FieldType type, uint32 value, desc);
2445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetUInt64(int number, FieldType type, uint64 value, desc);
2455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetFloat (int number, FieldType type, float  value, desc);
2465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetDouble(int number, FieldType type, double value, desc);
2475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetBool  (int number, FieldType type, bool   value, desc);
2485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetEnum  (int number, FieldType type, int    value, desc);
2495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetString(int number, FieldType type, const string& value, desc);
2505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string * MutableString (int number, FieldType type, desc);
2515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MessageLite* MutableMessage(int number, FieldType type,
2525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                              const MessageLite& prototype, desc);
2535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MessageLite* MutableMessage(const FieldDescriptor* decsriptor,
2545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                              MessageFactory* factory);
2555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Adds the given message to the ExtensionSet, taking ownership of the
2565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // message object. Existing message with the same number will be deleted.
2575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // If "message" is NULL, this is equivalent to "ClearExtension(number)".
2585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetAllocatedMessage(int number, FieldType type,
2595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                           const FieldDescriptor* descriptor,
2605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                           MessageLite* message);
2615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MessageLite* ReleaseMessage(int number, const MessageLite& prototype);
2625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MessageLite* ReleaseMessage(const FieldDescriptor* descriptor,
2635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                              MessageFactory* factory);
2645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#undef desc
2655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // repeated fields -------------------------------------------------
2675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void* MutableRawRepeatedField(int number);
2695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int32  GetRepeatedInt32 (int number, int index) const;
2715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int64  GetRepeatedInt64 (int number, int index) const;
2725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  uint32 GetRepeatedUInt32(int number, int index) const;
2735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  uint64 GetRepeatedUInt64(int number, int index) const;
2745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  float  GetRepeatedFloat (int number, int index) const;
2755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  double GetRepeatedDouble(int number, int index) const;
2765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool   GetRepeatedBool  (int number, int index) const;
2775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int    GetRepeatedEnum  (int number, int index) const;
2785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string & GetRepeatedString (int number, int index) const;
2795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const MessageLite& GetRepeatedMessage(int number, int index) const;
2805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetRepeatedInt32 (int number, int index, int32  value);
2825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetRepeatedInt64 (int number, int index, int64  value);
2835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetRepeatedUInt32(int number, int index, uint32 value);
2845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetRepeatedUInt64(int number, int index, uint64 value);
2855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetRepeatedFloat (int number, int index, float  value);
2865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetRepeatedDouble(int number, int index, double value);
2875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetRepeatedBool  (int number, int index, bool   value);
2885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetRepeatedEnum  (int number, int index, int    value);
2895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SetRepeatedString(int number, int index, const string& value);
2905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string * MutableRepeatedString (int number, int index);
2915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MessageLite* MutableRepeatedMessage(int number, int index);
2925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define desc const FieldDescriptor* descriptor  // avoid line wrapping
2945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void AddInt32 (int number, FieldType type, bool packed, int32  value, desc);
2955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void AddInt64 (int number, FieldType type, bool packed, int64  value, desc);
2965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void AddUInt32(int number, FieldType type, bool packed, uint32 value, desc);
2975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void AddUInt64(int number, FieldType type, bool packed, uint64 value, desc);
2985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void AddFloat (int number, FieldType type, bool packed, float  value, desc);
2995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void AddDouble(int number, FieldType type, bool packed, double value, desc);
3005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void AddBool  (int number, FieldType type, bool packed, bool   value, desc);
3015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void AddEnum  (int number, FieldType type, bool packed, int    value, desc);
3025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void AddString(int number, FieldType type, const string& value, desc);
3035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string * AddString (int number, FieldType type, desc);
3045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MessageLite* AddMessage(int number, FieldType type,
3055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                          const MessageLite& prototype, desc);
3065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MessageLite* AddMessage(const FieldDescriptor* descriptor,
3075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                          MessageFactory* factory);
3085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#undef desc
3095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void RemoveLast(int number);
3115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MessageLite* ReleaseLast(int number);
3125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SwapElements(int number, int index1, int index2);
3135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // -----------------------------------------------------------------
3155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // TODO(kenton):  Hardcore memory management accessors
3165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // =================================================================
3185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // convenience methods for implementing methods of Message
3195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //
3205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These could all be implemented in terms of the other methods of this
3215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // class, but providing them here helps keep the generated code size down.
3225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void Clear();
3245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void MergeFrom(const ExtensionSet& other);
3255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void Swap(ExtensionSet* other);
3265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool IsInitialized() const;
3275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Parses a single extension from the input. The input should start out
3295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // positioned immediately after the tag.
3305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool ParseField(uint32 tag, io::CodedInputStream* input,
3315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                  ExtensionFinder* extension_finder,
3325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                  FieldSkipper* field_skipper);
3335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Specific versions for lite or full messages (constructs the appropriate
3355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // FieldSkipper automatically).  |containing_type| is the default
3365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // instance for the containing message; it is used only to look up the
3375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extension by number.  See RegisterExtension(), above.  Unlike the other
3385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // methods of ExtensionSet, this only works for generated message types --
3395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // it looks up extensions registered using RegisterExtension().
3405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool ParseField(uint32 tag, io::CodedInputStream* input,
3415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                  const MessageLite* containing_type);
3425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool ParseField(uint32 tag, io::CodedInputStream* input,
3435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                  const Message* containing_type,
3445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                  UnknownFieldSet* unknown_fields);
3455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Parse an entire message in MessageSet format.  Such messages have no
3475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // fields, only extensions.
3485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool ParseMessageSet(io::CodedInputStream* input,
3495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                       ExtensionFinder* extension_finder,
3505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                       FieldSkipper* field_skipper);
3515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Specific versions for lite or full messages (constructs the appropriate
3535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // FieldSkipper automatically).
3545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool ParseMessageSet(io::CodedInputStream* input,
3555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                       const MessageLite* containing_type);
3565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool ParseMessageSet(io::CodedInputStream* input,
3575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                       const Message* containing_type,
3585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                       UnknownFieldSet* unknown_fields);
3595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Write all extension fields with field numbers in the range
3615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   [start_field_number, end_field_number)
3625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // to the output stream, using the cached sizes computed when ByteSize() was
3635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // last called.  Note that the range bounds are inclusive-exclusive.
3645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SerializeWithCachedSizes(int start_field_number,
3655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                int end_field_number,
3665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                io::CodedOutputStream* output) const;
3675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Same as SerializeWithCachedSizes, but without any bounds checking.
3695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The caller must ensure that target has sufficient capacity for the
3705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // serialized extensions.
3715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //
3725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns a pointer past the last written byte.
3735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  uint8* SerializeWithCachedSizesToArray(int start_field_number,
3745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                         int end_field_number,
3755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                         uint8* target) const;
3765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Like above but serializes in MessageSet format.
3785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SerializeMessageSetWithCachedSizes(io::CodedOutputStream* output) const;
3795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  uint8* SerializeMessageSetWithCachedSizesToArray(uint8* target) const;
3805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns the total serialized size of all the extensions.
3825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int ByteSize() const;
3835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Like ByteSize() but uses MessageSet format.
3855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int MessageSetByteSize() const;
3865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns (an estimate of) the total number of bytes used for storing the
3885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extensions in memory, excluding sizeof(*this).  If the ExtensionSet is
3895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // for a lite message (and thus possibly contains lite messages), the results
3905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // are undefined (might work, might crash, might corrupt data, might not even
3915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // be linked in).  It's up to the protocol compiler to avoid calling this on
3925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // such ExtensionSets (easy enough since lite messages don't implement
3935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // SpaceUsed()).
3945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int SpaceUsedExcludingSelf() const;
3955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
3975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Interface of a lazily parsed singular message extension.
3995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class LIBPROTOBUF_EXPORT LazyMessageExtension {
4005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot   public:
4015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    LazyMessageExtension() {}
4025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual ~LazyMessageExtension() {}
4035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual LazyMessageExtension* New() const = 0;
4055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual const MessageLite& GetMessage(
4065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        const MessageLite& prototype) const = 0;
4075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual MessageLite* MutableMessage(const MessageLite& prototype) = 0;
4085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual void SetAllocatedMessage(MessageLite *message) = 0;
4095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual MessageLite* ReleaseMessage(const MessageLite& prototype) = 0;
4105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual bool IsInitialized() const = 0;
4125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual int ByteSize() const = 0;
4135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual int SpaceUsed() const = 0;
4145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual void MergeFrom(const LazyMessageExtension& other) = 0;
4165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual void Clear() = 0;
4175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual bool ReadMessage(const MessageLite& prototype,
4195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                             io::CodedInputStream* input) = 0;
4205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual void WriteMessage(int number,
4215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                              io::CodedOutputStream* output) const = 0;
4225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual uint8* WriteMessageToArray(int number, uint8* target) const = 0;
4235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot   private:
4245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LazyMessageExtension);
4255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
4265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  struct Extension {
4275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // The order of these fields packs Extension into 24 bytes when using 8
4285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // byte alignment. Consider this when adding or removing fields here.
4295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    union {
4305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      int32                 int32_value;
4315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      int64                 int64_value;
4325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      uint32                uint32_value;
4335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      uint64                uint64_value;
4345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      float                 float_value;
4355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      double                double_value;
4365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      bool                  bool_value;
4375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      int                   enum_value;
4385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      string*               string_value;
4395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      MessageLite*          message_value;
4405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      LazyMessageExtension* lazymessage_value;
4415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      RepeatedField   <int32      >* repeated_int32_value;
4435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      RepeatedField   <int64      >* repeated_int64_value;
4445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      RepeatedField   <uint32     >* repeated_uint32_value;
4455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      RepeatedField   <uint64     >* repeated_uint64_value;
4465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      RepeatedField   <float      >* repeated_float_value;
4475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      RepeatedField   <double     >* repeated_double_value;
4485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      RepeatedField   <bool       >* repeated_bool_value;
4495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      RepeatedField   <int        >* repeated_enum_value;
4505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      RepeatedPtrField<string     >* repeated_string_value;
4515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      RepeatedPtrField<MessageLite>* repeated_message_value;
4525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    };
4535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    FieldType type;
4555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool is_repeated;
4565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // For singular types, indicates if the extension is "cleared".  This
4585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // happens when an extension is set and then later cleared by the caller.
4595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // We want to keep the Extension object around for reuse, so instead of
4605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // removing it from the map, we just set is_cleared = true.  This has no
4615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // meaning for repeated types; for those, the size of the RepeatedField
4625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // simply becomes zero when cleared.
4635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool is_cleared : 4;
4645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // For singular message types, indicates whether lazy parsing is enabled
4665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // for this extension. This field is only valid when type == TYPE_MESSAGE
4675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // and !is_repeated because we only support lazy parsing for singular
4685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // message types currently. If is_lazy = true, the extension is stored in
4695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // lazymessage_value. Otherwise, the extension will be message_value.
4705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool is_lazy : 4;
4715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // For repeated types, this indicates if the [packed=true] option is set.
4735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool is_packed;
4745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // For packed fields, the size of the packed data is recorded here when
4765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // ByteSize() is called then used during serialization.
4775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // TODO(kenton):  Use atomic<int> when C++ supports it.
4785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    mutable int cached_size;
4795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // The descriptor for this extension, if one exists and is known.  May be
4815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // NULL.  Must not be NULL if the descriptor for the extension does not
4825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // live in the same pool as the descriptor for the containing type.
4835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    const FieldDescriptor* descriptor;
4845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Some helper methods for operations on a single Extension.
4865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void SerializeFieldWithCachedSizes(
4875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        int number,
4885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        io::CodedOutputStream* output) const;
4895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    uint8* SerializeFieldWithCachedSizesToArray(
4905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        int number,
4915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        uint8* target) const;
4925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void SerializeMessageSetItemWithCachedSizes(
4935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        int number,
4945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        io::CodedOutputStream* output) const;
4955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    uint8* SerializeMessageSetItemWithCachedSizesToArray(
4965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        int number,
4975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        uint8* target) const;
4985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int ByteSize(int number) const;
4995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int MessageSetItemByteSize(int number) const;
5005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void Clear();
5015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int GetSize() const;
5025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    void Free();
5035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int SpaceUsedExcludingSelf() const;
5045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
5055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns true and fills field_number and extension if extension is found.
5085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool FindExtensionInfoFromTag(uint32 tag, ExtensionFinder* extension_finder,
5095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                int* field_number, ExtensionInfo* extension);
5105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Parses a single extension from the input. The input should start out
5125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // positioned immediately after the wire tag. This method is called in
5135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // ParseField() after field number is extracted from the wire tag and
5145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // ExtensionInfo is found by the field number.
5155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool ParseFieldWithExtensionInfo(int field_number,
5165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                   const ExtensionInfo& extension,
5175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                   io::CodedInputStream* input,
5185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                   FieldSkipper* field_skipper);
5195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Like ParseField(), but this method may parse singular message extensions
5215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // lazily depending on the value of FLAGS_eagerly_parse_message_sets.
5225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool ParseFieldMaybeLazily(uint32 tag, io::CodedInputStream* input,
5235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                             ExtensionFinder* extension_finder,
5245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                             FieldSkipper* field_skipper);
5255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets the extension with the given number, creating it if it does not
5275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // already exist.  Returns true if the extension did not already exist.
5285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool MaybeNewExtension(int number, const FieldDescriptor* descriptor,
5295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         Extension** result);
5305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Parse a single MessageSet item -- called just after the item group start
5325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // tag has been read.
5335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool ParseMessageSetItem(io::CodedInputStream* input,
5345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                           ExtensionFinder* extension_finder,
5355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                           FieldSkipper* field_skipper);
5365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Hack:  RepeatedPtrFieldBase declares ExtensionSet as a friend.  This
5395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   friendship should automatically extend to ExtensionSet::Extension, but
5405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   unfortunately some older compilers (e.g. GCC 3.4.4) do not implement this
5415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   correctly.  So, we must provide helpers for calling methods of that
5425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   class.
5435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Defined in extension_set_heavy.cc.
5455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline int RepeatedMessage_SpaceUsedExcludingSelf(
5465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      RepeatedPtrFieldBase* field);
5475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The Extension struct is small enough to be passed by value, so we use it
5495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // directly as the value type in the map rather than use pointers.  We use
5505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // a map rather than hash_map here because we expect most ExtensionSets will
5515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // only contain a small number of extensions whereas hash_map is optimized
5525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // for 100 elements or more.  Also, we want AppendToList() to order fields
5535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // by field number.
5545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  std::map<int, Extension> extensions_;
5555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionSet);
5575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
5585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// These are just for convenience...
5605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void ExtensionSet::SetString(int number, FieldType type,
5615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    const string& value,
5625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    const FieldDescriptor* descriptor) {
5635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MutableString(number, type, descriptor)->assign(value);
5645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
5655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void ExtensionSet::SetRepeatedString(int number, int index,
5665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                            const string& value) {
5675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MutableRepeatedString(number, index)->assign(value);
5685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
5695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void ExtensionSet::AddString(int number, FieldType type,
5705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    const string& value,
5715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    const FieldDescriptor* descriptor) {
5725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  AddString(number, type, descriptor)->assign(value);
5735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
5745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ===================================================================
5765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Glue for generated extension accessors
5775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// -------------------------------------------------------------------
5795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Template magic
5805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// First we have a set of classes representing "type traits" for different
5825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// field types.  A type traits class knows how to implement basic accessors
5835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// for extensions of a particular type given an ExtensionSet.  The signature
5845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// for a type traits class looks like this:
5855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
5865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   class TypeTraits {
5875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//    public:
5885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     typedef ? ConstType;
5895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     typedef ? MutableType;
5905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
5915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     static inline ConstType Get(int number, const ExtensionSet& set);
5925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     static inline void Set(int number, ConstType value, ExtensionSet* set);
5935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     static inline MutableType Mutable(int number, ExtensionSet* set);
5945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
5955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     // Variants for repeated fields.
5965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     static inline ConstType Get(int number, const ExtensionSet& set,
5975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//                                 int index);
5985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     static inline void Set(int number, int index,
5995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//                            ConstType value, ExtensionSet* set);
6005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     static inline MutableType Mutable(int number, int index,
6015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//                                       ExtensionSet* set);
6025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     static inline void Add(int number, ConstType value, ExtensionSet* set);
6035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     static inline MutableType Add(int number, ExtensionSet* set);
6045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   };
6055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
6065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Not all of these methods make sense for all field types.  For example, the
6075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// "Mutable" methods only make sense for strings and messages, and the
6085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// repeated methods only make sense for repeated types.  So, each type
6095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// traits class implements only the set of methods from this signature that it
6105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// actually supports.  This will cause a compiler error if the user tries to
6115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// access an extension using a method that doesn't make sense for its type.
6125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// For example, if "foo" is an extension of type "optional int32", then if you
6135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// try to write code like:
6145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   my_message.MutableExtension(foo)
6155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// you will get a compile error because PrimitiveTypeTraits<int32> does not
6165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// have a "Mutable()" method.
6175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// -------------------------------------------------------------------
6195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// PrimitiveTypeTraits
6205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Since the ExtensionSet has different methods for each primitive type,
6225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// we must explicitly define the methods of the type traits class for each
6235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// known type.
6245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate <typename Type>
6255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass PrimitiveTypeTraits {
6265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
6275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef Type ConstType;
6285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline ConstType Get(int number, const ExtensionSet& set,
6305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                              ConstType default_value);
6315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline void Set(int number, FieldType field_type,
6325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         ConstType value, ExtensionSet* set);
6335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
6345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate <typename Type>
6365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass RepeatedPrimitiveTypeTraits {
6375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
6385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef Type ConstType;
6395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline Type Get(int number, const ExtensionSet& set, int index);
6415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline void Set(int number, int index, Type value, ExtensionSet* set);
6425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline void Add(int number, FieldType field_type,
6435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         bool is_packed, Type value, ExtensionSet* set);
6445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
6455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define PROTOBUF_DEFINE_PRIMITIVE_TYPE(TYPE, METHOD)                       \
6475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<> inline TYPE PrimitiveTypeTraits<TYPE>::Get(                     \
6485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int number, const ExtensionSet& set, TYPE default_value) {             \
6495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return set.Get##METHOD(number, default_value);                           \
6505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}                                                                          \
6515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<> inline void PrimitiveTypeTraits<TYPE>::Set(                     \
6525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int number, FieldType field_type, TYPE value, ExtensionSet* set) {     \
6535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  set->Set##METHOD(number, field_type, value, NULL);                       \
6545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}                                                                          \
6555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                                                           \
6565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<> inline TYPE RepeatedPrimitiveTypeTraits<TYPE>::Get(             \
6575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int number, const ExtensionSet& set, int index) {                      \
6585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return set.GetRepeated##METHOD(number, index);                           \
6595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}                                                                          \
6605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<> inline void RepeatedPrimitiveTypeTraits<TYPE>::Set(             \
6615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int number, int index, TYPE value, ExtensionSet* set) {                \
6625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  set->SetRepeated##METHOD(number, index, value);                          \
6635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}                                                                          \
6645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<> inline void RepeatedPrimitiveTypeTraits<TYPE>::Add(             \
6655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int number, FieldType field_type, bool is_packed,                      \
6665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE value, ExtensionSet* set) {                                       \
6675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  set->Add##METHOD(number, field_type, is_packed, value, NULL);            \
6685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
6695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE( int32,  Int32)
6715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE( int64,  Int64)
6725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE(uint32, UInt32)
6735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE(uint64, UInt64)
6745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE( float,  Float)
6755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE(double, Double)
6765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_PRIMITIVE_TYPE(  bool,   Bool)
6775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#undef PROTOBUF_DEFINE_PRIMITIVE_TYPE
6795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// -------------------------------------------------------------------
6815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// StringTypeTraits
6825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Strings support both Set() and Mutable().
6845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT StringTypeTraits {
6855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
6865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef const string& ConstType;
6875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef string* MutableType;
6885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline const string& Get(int number, const ExtensionSet& set,
6905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                  ConstType default_value) {
6915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return set.GetString(number, default_value);
6925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
6935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline void Set(int number, FieldType field_type,
6945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         const string& value, ExtensionSet* set) {
6955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    set->SetString(number, field_type, value, NULL);
6965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
6975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline string* Mutable(int number, FieldType field_type,
6985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                ExtensionSet* set) {
6995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return set->MutableString(number, field_type, NULL);
7005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
7025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT RepeatedStringTypeTraits {
7045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
7055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef const string& ConstType;
7065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef string* MutableType;
7075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline const string& Get(int number, const ExtensionSet& set,
7095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                  int index) {
7105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return set.GetRepeatedString(number, index);
7115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline void Set(int number, int index,
7135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         const string& value, ExtensionSet* set) {
7145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    set->SetRepeatedString(number, index, value);
7155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline string* Mutable(int number, int index, ExtensionSet* set) {
7175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return set->MutableRepeatedString(number, index);
7185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline void Add(int number, FieldType field_type,
7205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         bool /*is_packed*/, const string& value,
7215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         ExtensionSet* set) {
7225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    set->AddString(number, field_type, value, NULL);
7235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline string* Add(int number, FieldType field_type,
7255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                            ExtensionSet* set) {
7265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return set->AddString(number, field_type, NULL);
7275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
7295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// -------------------------------------------------------------------
7315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// EnumTypeTraits
7325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ExtensionSet represents enums using integers internally, so we have to
7345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// static_cast around.
7355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate <typename Type, bool IsValid(int)>
7365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass EnumTypeTraits {
7375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
7385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef Type ConstType;
7395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline ConstType Get(int number, const ExtensionSet& set,
7415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                              ConstType default_value) {
7425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<Type>(set.GetEnum(number, default_value));
7435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline void Set(int number, FieldType field_type,
7455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         ConstType value, ExtensionSet* set) {
7465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    GOOGLE_DCHECK(IsValid(value));
7475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    set->SetEnum(number, field_type, value, NULL);
7485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
7505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate <typename Type, bool IsValid(int)>
7525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass RepeatedEnumTypeTraits {
7535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
7545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef Type ConstType;
7555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline ConstType Get(int number, const ExtensionSet& set, int index) {
7575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<Type>(set.GetRepeatedEnum(number, index));
7585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline void Set(int number, int index,
7605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         ConstType value, ExtensionSet* set) {
7615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    GOOGLE_DCHECK(IsValid(value));
7625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    set->SetRepeatedEnum(number, index, value);
7635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline void Add(int number, FieldType field_type,
7655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         bool is_packed, ConstType value, ExtensionSet* set) {
7665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    GOOGLE_DCHECK(IsValid(value));
7675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    set->AddEnum(number, field_type, is_packed, value, NULL);
7685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
7705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// -------------------------------------------------------------------
7725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// MessageTypeTraits
7735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ExtensionSet guarantees that when manipulating extensions with message
7755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// types, the implementation used will be the compiled-in class representing
7765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// that type.  So, we can static_cast down to the exact type we expect.
7775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate <typename Type>
7785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass MessageTypeTraits {
7795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
7805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef const Type& ConstType;
7815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef Type* MutableType;
7825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline ConstType Get(int number, const ExtensionSet& set,
7845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                              ConstType default_value) {
7855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<const Type&>(
7865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        set.GetMessage(number, default_value));
7875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline MutableType Mutable(int number, FieldType field_type,
7895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    ExtensionSet* set) {
7905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<Type*>(
7915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      set->MutableMessage(number, field_type, Type::default_instance(), NULL));
7925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline void SetAllocated(int number, FieldType field_type,
7945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                  MutableType message, ExtensionSet* set) {
7955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    set->SetAllocatedMessage(number, field_type, NULL, message);
7965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
7975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline MutableType Release(int number, FieldType field_type,
7985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    ExtensionSet* set) {
7995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<Type*>(set->ReleaseMessage(
8005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        number, Type::default_instance()));
8015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
8025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
8035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate <typename Type>
8055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass RepeatedMessageTypeTraits {
8065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
8075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef const Type& ConstType;
8085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef Type* MutableType;
8095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline ConstType Get(int number, const ExtensionSet& set, int index) {
8115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<const Type&>(set.GetRepeatedMessage(number, index));
8125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
8135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline MutableType Mutable(int number, int index, ExtensionSet* set) {
8145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<Type*>(set->MutableRepeatedMessage(number, index));
8155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
8165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline MutableType Add(int number, FieldType field_type,
8175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                ExtensionSet* set) {
8185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<Type*>(
8195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        set->AddMessage(number, field_type, Type::default_instance(), NULL));
8205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
8215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
8225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// -------------------------------------------------------------------
8245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ExtensionIdentifier
8255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This is the type of actual extension objects.  E.g. if you have:
8275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   extends Foo with optional int32 bar = 1234;
8285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// then "bar" will be defined in C++ as:
8295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   ExtensionIdentifier<Foo, PrimitiveTypeTraits<int32>, 1, false> bar(1234);
8305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
8315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Note that we could, in theory, supply the field number as a template
8325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// parameter, and thus make an instance of ExtensionIdentifier have no
8335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// actual contents.  However, if we did that, then using at extension
8345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// identifier would not necessarily cause the compiler to output any sort
8355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// of reference to any simple defined in the extension's .pb.o file.  Some
8365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// linkers will actually drop object files that are not explicitly referenced,
8375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// but that would be bad because it would cause this extension to not be
8385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// registered at static initialization, and therefore using it would crash.
8395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate <typename ExtendeeType, typename TypeTraitsType,
8415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot          FieldType field_type, bool is_packed>
8425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass ExtensionIdentifier {
8435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
8445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef TypeTraitsType TypeTraits;
8455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef ExtendeeType Extendee;
8465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  ExtensionIdentifier(int number, typename TypeTraits::ConstType default_value)
8485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      : number_(number), default_value_(default_value) {}
8495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline int number() const { return number_; }
8505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typename TypeTraits::ConstType default_value() const {
8515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return default_value_;
8525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
8535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
8555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const int number_;
8565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typename TypeTraits::ConstType default_value_;
8575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
8585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// -------------------------------------------------------------------
8605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Generated accessors
8615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This macro should be expanded in the context of a generated type which
8635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// has extensions.
8645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
8655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// We use "_proto_TypeTraits" as a type name below because "TypeTraits"
8665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// causes problems if the class has a nested message or enum type with that
8675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// name and "_TypeTraits" is technically reserved for the C++ library since
8685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// it starts with an underscore followed by a capital letter.
8695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
8705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// For similar reason, we use "_field_type" and "_is_packed" as parameter names
8715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// below, so that "field_type" and "is_packed" can be used as field names.
8725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(CLASSNAME)                        \
8735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  /* Has, Size, Clear */                                                      \
8745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename _proto_TypeTraits,                                       \
8755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            ::google::protobuf::internal::FieldType _field_type,                        \
8765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            bool _is_packed>                                                  \
8775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline bool HasExtension(                                                   \
8785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const ::google::protobuf::internal::ExtensionIdentifier<                          \
8795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const {   \
8805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return _extensions_.Has(id.number());                                     \
8815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }                                                                           \
8825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                                                              \
8835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename _proto_TypeTraits,                                       \
8845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            ::google::protobuf::internal::FieldType _field_type,                        \
8855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            bool _is_packed>                                                  \
8865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline void ClearExtension(                                                 \
8875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const ::google::protobuf::internal::ExtensionIdentifier<                          \
8885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) {         \
8895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    _extensions_.ClearExtension(id.number());                                 \
8905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }                                                                           \
8915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                                                              \
8925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename _proto_TypeTraits,                                       \
8935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            ::google::protobuf::internal::FieldType _field_type,                        \
8945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            bool _is_packed>                                                  \
8955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline int ExtensionSize(                                                   \
8965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const ::google::protobuf::internal::ExtensionIdentifier<                          \
8975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const {   \
8985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return _extensions_.ExtensionSize(id.number());                           \
8995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }                                                                           \
9005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                                                              \
9015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  /* Singular accessors */                                                    \
9025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename _proto_TypeTraits,                                       \
9035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            ::google::protobuf::internal::FieldType _field_type,                        \
9045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            bool _is_packed>                                                  \
9055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline typename _proto_TypeTraits::ConstType GetExtension(                  \
9065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const ::google::protobuf::internal::ExtensionIdentifier<                          \
9075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const {   \
9085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return _proto_TypeTraits::Get(id.number(), _extensions_,                  \
9095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                  id.default_value());                        \
9105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }                                                                           \
9115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                                                              \
9125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename _proto_TypeTraits,                                       \
9135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            ::google::protobuf::internal::FieldType _field_type,                        \
9145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            bool _is_packed>                                                  \
9155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline typename _proto_TypeTraits::MutableType MutableExtension(            \
9165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const ::google::protobuf::internal::ExtensionIdentifier<                          \
9175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) {         \
9185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return _proto_TypeTraits::Mutable(id.number(), _field_type,               \
9195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                      &_extensions_);                         \
9205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }                                                                           \
9215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                                                              \
9225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename _proto_TypeTraits,                                       \
9235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            ::google::protobuf::internal::FieldType _field_type,                        \
9245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            bool _is_packed>                                                  \
9255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline void SetExtension(                                                   \
9265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const ::google::protobuf::internal::ExtensionIdentifier<                          \
9275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id,           \
9285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      typename _proto_TypeTraits::ConstType value) {                          \
9295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    _proto_TypeTraits::Set(id.number(), _field_type, value, &_extensions_);   \
9305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }                                                                           \
9315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                                                              \
9325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename _proto_TypeTraits,                                       \
9335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            ::google::protobuf::internal::FieldType _field_type,                        \
9345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            bool _is_packed>                                                  \
9355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline void SetAllocatedExtension(                                          \
9365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const ::google::protobuf::internal::ExtensionIdentifier<                          \
9375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id,           \
9385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      typename _proto_TypeTraits::MutableType value) {                        \
9395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    _proto_TypeTraits::SetAllocated(id.number(), _field_type,                 \
9405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    value, &_extensions_);                    \
9415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }                                                                           \
9425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename _proto_TypeTraits,                                       \
9435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            ::google::protobuf::internal::FieldType _field_type,                        \
9445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            bool _is_packed>                                                  \
9455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline typename _proto_TypeTraits::MutableType ReleaseExtension(            \
9465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const ::google::protobuf::internal::ExtensionIdentifier<                          \
9475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) {         \
9485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return _proto_TypeTraits::Release(id.number(), _field_type,               \
9495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                      &_extensions_);                         \
9505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }                                                                           \
9515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                                                              \
9525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  /* Repeated accessors */                                                    \
9535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename _proto_TypeTraits,                                       \
9545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            ::google::protobuf::internal::FieldType _field_type,                        \
9555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            bool _is_packed>                                                  \
9565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline typename _proto_TypeTraits::ConstType GetExtension(                  \
9575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const ::google::protobuf::internal::ExtensionIdentifier<                          \
9585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id,           \
9595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      int index) const {                                                      \
9605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return _proto_TypeTraits::Get(id.number(), _extensions_, index);          \
9615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }                                                                           \
9625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                                                              \
9635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename _proto_TypeTraits,                                       \
9645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            ::google::protobuf::internal::FieldType _field_type,                        \
9655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            bool _is_packed>                                                  \
9665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline typename _proto_TypeTraits::MutableType MutableExtension(            \
9675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const ::google::protobuf::internal::ExtensionIdentifier<                          \
9685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id,           \
9695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      int index) {                                                            \
9705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return _proto_TypeTraits::Mutable(id.number(), index, &_extensions_);     \
9715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }                                                                           \
9725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                                                              \
9735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename _proto_TypeTraits,                                       \
9745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            ::google::protobuf::internal::FieldType _field_type,                        \
9755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            bool _is_packed>                                                  \
9765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline void SetExtension(                                                   \
9775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const ::google::protobuf::internal::ExtensionIdentifier<                          \
9785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id,           \
9795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      int index, typename _proto_TypeTraits::ConstType value) {               \
9805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    _proto_TypeTraits::Set(id.number(), index, value, &_extensions_);         \
9815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }                                                                           \
9825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                                                              \
9835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename _proto_TypeTraits,                                       \
9845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            ::google::protobuf::internal::FieldType _field_type,                        \
9855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            bool _is_packed>                                                  \
9865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline typename _proto_TypeTraits::MutableType AddExtension(                \
9875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const ::google::protobuf::internal::ExtensionIdentifier<                          \
9885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) {         \
9895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return _proto_TypeTraits::Add(id.number(), _field_type, &_extensions_);   \
9905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }                                                                           \
9915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                                                              \
9925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <typename _proto_TypeTraits,                                       \
9935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            ::google::protobuf::internal::FieldType _field_type,                        \
9945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            bool _is_packed>                                                  \
9955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline void AddExtension(                                                   \
9965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const ::google::protobuf::internal::ExtensionIdentifier<                          \
9975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id,           \
9985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      typename _proto_TypeTraits::ConstType value) {                          \
9995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    _proto_TypeTraits::Add(id.number(), _field_type, _is_packed,              \
10005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                           value, &_extensions_);                             \
10015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
10025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace internal
10045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace protobuf
10055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace google
10075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif  // GOOGLE_PROTOBUF_EXTENSION_SET_H__
1008