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