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