1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/
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// Contains classes used to keep track of unrecognized fields seen while
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// parsing a protocol message.
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
41a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <assert.h>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <vector>
44a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/stubs/common.h>
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
48a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  namespace io {
49a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    class CodedInputStream;         // coded_stream.h
50a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    class CodedOutputStream;        // coded_stream.h
51a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    class ZeroCopyInputStream;      // zero_copy_stream.h
52a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
53a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  namespace internal {
54a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    class WireFormat;               // wire_format.h
55a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    class MessageSetFieldSkipperUsingCord;
56a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                    // extension_set_heavy.cc
57a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Message;                      // message.h
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass UnknownField;                 // below
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// An UnknownFieldSet contains fields that were encountered while parsing a
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// message but were not defined by its type.  Keeping track of these can be
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// useful, especially in that they may be written if the message is serialized
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// again without being cleared in between.  This means that software which
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// simply receives messages and forwards them to other servers does not need
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to be updated every time a new field is added to the message definition.
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// To get the UnknownFieldSet attached to any message, call
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Reflection::GetUnknownFields().
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class is necessarily tied to the protocol buffer wire format, unlike
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the Reflection interface which is independent of any serialization scheme.
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT UnknownFieldSet {
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  UnknownFieldSet();
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~UnknownFieldSet();
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Remove all fields.
80d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  inline void Clear();
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
82a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Remove all fields and deallocate internal data objects
83a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void ClearAndFreeMemory();
84a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Is this set empty?
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline bool empty() const;
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Merge the contents of some other UnknownFieldSet with this one.
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void MergeFrom(const UnknownFieldSet& other);
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Swaps the contents of some other UnknownFieldSet with this one.
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void Swap(UnknownFieldSet* x);
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Computes (an estimate of) the total number of bytes currently used for
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // storing the unknown fields in memory. Does NOT include
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // sizeof(*this) in the calculation.
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int SpaceUsedExcludingSelf() const;
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Version of SpaceUsed() including sizeof(*this).
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int SpaceUsed() const;
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Returns the number of fields present in the UnknownFieldSet.
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline int field_count() const;
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get a field in the set, where 0 <= index < field_count().  The fields
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // appear in the order in which they were added.
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const UnknownField& field(int index) const;
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get a mutable pointer to a field in the set, where
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // 0 <= index < field_count().  The fields appear in the order in which
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // they were added.
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline UnknownField* mutable_field(int index);
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Adding fields ---------------------------------------------------
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddVarint(int number, uint64 value);
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddFixed32(int number, uint32 value);
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddFixed64(int number, uint64 value);
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddLengthDelimited(int number, const string& value);
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string* AddLengthDelimited(int number);
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  UnknownFieldSet* AddGroup(int number);
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Adds an unknown field from another set.
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddField(const UnknownField& field);
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Delete fields with indices in the range [start .. start+num-1].
125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Caution: implementation moves all fields with indices [start+num .. ].
126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void DeleteSubrange(int start, int num);
127a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
128a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Delete all fields with a specific field number. The order of left fields
129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // is preserved.
130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Caution: implementation moves all fields after the first deleted field.
131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void DeleteByNumber(int number);
132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Parsing helpers -------------------------------------------------
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These work exactly like the similarly-named methods of Message.
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool MergeFromCodedStream(io::CodedInputStream* input);
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool ParseFromCodedStream(io::CodedInputStream* input);
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool ParseFromZeroCopyStream(io::ZeroCopyInputStream* input);
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool ParseFromArray(const void* data, int size);
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline bool ParseFromString(const string& data) {
141afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson    return ParseFromArray(data.data(), static_cast<int>(data.size()));
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
145a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
146d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void ClearFallback();
147d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
148a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  std::vector<UnknownField>* fields_;
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(UnknownFieldSet);
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Represents one field in an UnknownFieldSet.
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT UnknownField {
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  enum Type {
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_VARINT,
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_FIXED32,
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_FIXED64,
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_LENGTH_DELIMITED,
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_GROUP
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The field's tag number, as seen on the wire.
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline int number() const;
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The field type.
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline Type type() const;
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Accessors -------------------------------------------------------
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Each method works only for UnknownFields of the corresponding type.
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline uint64 varint() const;
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline uint32 fixed32() const;
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline uint64 fixed64() const;
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const string& length_delimited() const;
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const UnknownFieldSet& group() const;
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void set_varint(uint64 value);
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void set_fixed32(uint32 value);
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void set_fixed64(uint64 value);
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void set_length_delimited(const string& value);
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline string* mutable_length_delimited();
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline UnknownFieldSet* mutable_group();
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Serialization API.
187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // These methods can take advantage of the underlying implementation and may
188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // archieve a better performance than using getters to retrieve the data and
189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // do the serialization yourself.
190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void SerializeLengthDelimitedNoTag(io::CodedOutputStream* output) const;
191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  uint8* SerializeLengthDelimitedNoTagToArray(uint8* target) const;
192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  inline int GetLengthDelimitedSize() const;
194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class UnknownFieldSet;
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If this UnknownField contains a pointer, delete it.
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void Delete();
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Make a deep copy of any pointers in this UnknownField.
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void DeepCopy();
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Set the wire type of this UnknownField. Should only be used when this
205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // UnknownField is being created.
206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  inline void SetType(Type type);
207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  uint32 number_;
209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  uint32 type_;
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  union {
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    uint64 varint_;
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    uint32 fixed32_;
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    uint64 fixed64_;
214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    mutable union {
215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      string* string_value_;
216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    } length_delimited_;
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    UnknownFieldSet* group_;
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// inline implementations
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
224d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline void UnknownFieldSet::Clear() {
225d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (fields_ != NULL) {
226d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    ClearFallback();
227d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  }
228d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
229d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool UnknownFieldSet::empty() const {
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return fields_ == NULL || fields_->empty();
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void UnknownFieldSet::Swap(UnknownFieldSet* x) {
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  std::swap(fields_, x->fields_);
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int UnknownFieldSet::field_count() const {
239afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson  return (fields_ == NULL) ? 0 : static_cast<int>(fields_->size());
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const UnknownField& UnknownFieldSet::field(int index) const {
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return (*fields_)[index];
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline UnknownField* UnknownFieldSet::mutable_field(int index) {
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return &(*fields_)[index];
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void UnknownFieldSet::AddLengthDelimited(
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int number, const string& value) {
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddLengthDelimited(number)->assign(value);
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int UnknownField::number() const { return number_; }
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline UnknownField::Type UnknownField::type() const {
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return static_cast<Type>(type_);
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline uint64 UnknownField::varint() const {
260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  assert(type() == TYPE_VARINT);
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return varint_;
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint32 UnknownField::fixed32() const {
264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  assert(type() == TYPE_FIXED32);
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return fixed32_;
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint64 UnknownField::fixed64() const {
268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  assert(type() == TYPE_FIXED64);
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return fixed64_;
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const string& UnknownField::length_delimited() const {
272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  assert(type() == TYPE_LENGTH_DELIMITED);
273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return *length_delimited_.string_value_;
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const UnknownFieldSet& UnknownField::group() const {
276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  assert(type() == TYPE_GROUP);
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return *group_;
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void UnknownField::set_varint(uint64 value) {
281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  assert(type() == TYPE_VARINT);
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  varint_ = value;
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void UnknownField::set_fixed32(uint32 value) {
285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  assert(type() == TYPE_FIXED32);
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  fixed32_ = value;
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void UnknownField::set_fixed64(uint64 value) {
289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  assert(type() == TYPE_FIXED64);
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  fixed64_ = value;
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void UnknownField::set_length_delimited(const string& value) {
293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  assert(type() == TYPE_LENGTH_DELIMITED);
294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  length_delimited_.string_value_->assign(value);
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline string* UnknownField::mutable_length_delimited() {
297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  assert(type() == TYPE_LENGTH_DELIMITED);
298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return length_delimited_.string_value_;
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline UnknownFieldSet* UnknownField::mutable_group() {
301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  assert(type() == TYPE_GROUP);
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return group_;
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline int UnknownField::GetLengthDelimitedSize() const {
306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type());
307afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson  return static_cast<int>(length_delimited_.string_value_->size());
308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline void UnknownField::SetType(Type type) {
311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  type_ = type;
312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__
319