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