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// 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
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <vector>
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/repeated_field.h>
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Message;                      // message.h
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass UnknownField;                 // below
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// An UnknownFieldSet contains fields that were encountered while parsing a
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// message but were not defined by its type.  Keeping track of these can be
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// useful, especially in that they may be written if the message is serialized
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// again without being cleared in between.  This means that software which
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// simply receives messages and forwards them to other servers does not need
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to be updated every time a new field is added to the message definition.
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// To get the UnknownFieldSet attached to any message, call
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Reflection::GetUnknownFields().
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class is necessarily tied to the protocol buffer wire format, unlike
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the Reflection interface which is independent of any serialization scheme.
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT UnknownFieldSet {
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  UnknownFieldSet();
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~UnknownFieldSet();
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Remove all fields.
69d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  inline void Clear();
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Is this set empty?
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline bool empty() const;
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Merge the contents of some other UnknownFieldSet with this one.
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void MergeFrom(const UnknownFieldSet& other);
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Swaps the contents of some other UnknownFieldSet with this one.
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void Swap(UnknownFieldSet* x);
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Computes (an estimate of) the total number of bytes currently used for
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // storing the unknown fields in memory. Does NOT include
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // sizeof(*this) in the calculation.
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int SpaceUsedExcludingSelf() const;
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Version of SpaceUsed() including sizeof(*this).
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int SpaceUsed() const;
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Returns the number of fields present in the UnknownFieldSet.
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline int field_count() const;
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get a field in the set, where 0 <= index < field_count().  The fields
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // appear in the order in which they were added.
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const UnknownField& field(int index) const;
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get a mutable pointer to a field in the set, where
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // 0 <= index < field_count().  The fields appear in the order in which
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // they were added.
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline UnknownField* mutable_field(int index);
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Adding fields ---------------------------------------------------
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddVarint(int number, uint64 value);
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddFixed32(int number, uint32 value);
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddFixed64(int number, uint64 value);
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddLengthDelimited(int number, const string& value);
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string* AddLengthDelimited(int number);
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  UnknownFieldSet* AddGroup(int number);
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Adds an unknown field from another set.
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddField(const UnknownField& field);
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Parsing helpers -------------------------------------------------
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These work exactly like the similarly-named methods of Message.
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool MergeFromCodedStream(io::CodedInputStream* input);
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool ParseFromCodedStream(io::CodedInputStream* input);
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool ParseFromZeroCopyStream(io::ZeroCopyInputStream* input);
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool ParseFromArray(const void* data, int size);
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline bool ParseFromString(const string& data) {
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return ParseFromArray(data.data(), data.size());
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
122d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void ClearFallback();
123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  vector<UnknownField>* fields_;
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(UnknownFieldSet);
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Represents one field in an UnknownFieldSet.
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT UnknownField {
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  enum Type {
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_VARINT,
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_FIXED32,
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_FIXED64,
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_LENGTH_DELIMITED,
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    TYPE_GROUP
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The field's tag number, as seen on the wire.
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline int number() const;
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The field type.
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline Type type() const;
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Accessors -------------------------------------------------------
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Each method works only for UnknownFields of the corresponding type.
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline uint64 varint() const;
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline uint32 fixed32() const;
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline uint64 fixed64() const;
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const string& length_delimited() const;
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const UnknownFieldSet& group() const;
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void set_varint(uint64 value);
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void set_fixed32(uint32 value);
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void set_fixed64(uint64 value);
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void set_length_delimited(const string& value);
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline string* mutable_length_delimited();
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline UnknownFieldSet* mutable_group();
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class UnknownFieldSet;
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If this UnknownField contains a pointer, delete it.
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void Delete();
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Make a deep copy of any pointers in this UnknownField.
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void DeepCopy();
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unsigned int number_ : 29;
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unsigned int type_   : 3;
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  union {
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    uint64 varint_;
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    uint32 fixed32_;
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    uint64 fixed64_;
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string* length_delimited_;
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    UnknownFieldSet* group_;
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// inline implementations
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
185d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline void UnknownFieldSet::Clear() {
186d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (fields_ != NULL) {
187d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    ClearFallback();
188d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  }
189d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
190d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool UnknownFieldSet::empty() const {
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return fields_ == NULL || fields_->empty();
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void UnknownFieldSet::Swap(UnknownFieldSet* x) {
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  std::swap(fields_, x->fields_);
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int UnknownFieldSet::field_count() const {
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return (fields_ == NULL) ? 0 : fields_->size();
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const UnknownField& UnknownFieldSet::field(int index) const {
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return (*fields_)[index];
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline UnknownField* UnknownFieldSet::mutable_field(int index) {
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return &(*fields_)[index];
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void UnknownFieldSet::AddLengthDelimited(
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int number, const string& value) {
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  AddLengthDelimited(number)->assign(value);
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int UnknownField::number() const { return number_; }
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline UnknownField::Type UnknownField::type() const {
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return static_cast<Type>(type_);
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint64 UnknownField::varint () const {
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_EQ(type_, TYPE_VARINT);
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return varint_;
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint32 UnknownField::fixed32() const {
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_EQ(type_, TYPE_FIXED32);
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return fixed32_;
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint64 UnknownField::fixed64() const {
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_EQ(type_, TYPE_FIXED64);
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return fixed64_;
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const string& UnknownField::length_delimited() const {
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_EQ(type_, TYPE_LENGTH_DELIMITED);
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return *length_delimited_;
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const UnknownFieldSet& UnknownField::group() const {
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_EQ(type_, TYPE_GROUP);
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return *group_;
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void UnknownField::set_varint(uint64 value) {
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_EQ(type_, TYPE_VARINT);
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  varint_ = value;
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void UnknownField::set_fixed32(uint32 value) {
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_EQ(type_, TYPE_FIXED32);
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  fixed32_ = value;
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void UnknownField::set_fixed64(uint64 value) {
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_EQ(type_, TYPE_FIXED64);
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  fixed64_ = value;
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void UnknownField::set_length_delimited(const string& value) {
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_EQ(type_, TYPE_LENGTH_DELIMITED);
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  length_delimited_->assign(value);
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline string* UnknownField::mutable_length_delimited() {
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_EQ(type_, TYPE_LENGTH_DELIMITED);
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return length_delimited_;
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline UnknownFieldSet* UnknownField::mutable_group() {
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_EQ(type_, TYPE_GROUP);
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return group_;
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__
269