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// This file contains classes which describe a type of protocol message. 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// You can use a message's descriptor to learn at runtime what fields 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// it contains and what the types of those fields are. The Message 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// interface also allows you to dynamically access and modify individual 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// fields by passing the FieldDescriptor of the field you are interested 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in. 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Most users will not care about descriptors, because they will write 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// code specific to certain protocol types and will simply use the classes 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// generated by the protocol compiler directly. Advanced users who want 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to operate on arbitrary types (not known at compile time) may want to 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// read descriptors in order to learn about the contents of a message. 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A very small number of users will want to construct their own 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Descriptors, either because they are implementing Message manually or 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// because they are writing something like the protocol compiler. 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// For an example of how you might use descriptors, see the code example 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// at the top of message.h. 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GOOGLE_PROTOBUF_DESCRIPTOR_H__ 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_DESCRIPTOR_H__ 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <memory> 58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifndef _SHARED_PTR_H 59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/shared_ptr.h> 60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif 61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <set> 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string> 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <vector> 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h> 65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/scoped_ptr.h> 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// TYPE_BOOL is defined in the MacOS's ConditionalMacros.h. 68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifdef TYPE_BOOL 69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#undef TYPE_BOOL 70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif // TYPE_BOOL 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in this file. 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Descriptor; 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FieldDescriptor; 78a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass OneofDescriptor; 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumDescriptor; 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumValueDescriptor; 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ServiceDescriptor; 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MethodDescriptor; 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FileDescriptor; 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorDatabase; 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorPool; 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in descriptor.proto 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorProto; 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FieldDescriptorProto; 90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass OneofDescriptorProto; 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumDescriptorProto; 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumValueDescriptorProto; 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ServiceDescriptorProto; 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MethodDescriptorProto; 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FileDescriptorProto; 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MessageOptions; 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FieldOptions; 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumOptions; 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumValueOptions; 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ServiceOptions; 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MethodOptions; 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FileOptions; 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass UninterpretedOption; 104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass SourceCodeInfo; 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in message.h 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass Message; 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in descriptor.cc 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorBuilder; 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FileDescriptorTables; 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in unknown_field_set.h. 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass UnknownField; 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Defined in generated_message_reflection.h. 117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace internal { 118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass GeneratedMessageReflection; 119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace internal 120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Defined in command_line_interface.cc 122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace compiler { 123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass CommandLineInterface; 124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace compiler 125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace descriptor_unittest { 127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass DescriptorTest; 128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace descriptor_unittest 129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Defined in printer.h 131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace io { 132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass Printer; 133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace io 134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 135a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// NB, all indices are zero-based. 136a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonstruct SourceLocation { 137a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int start_line; 138a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int end_line; 139a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int start_column; 140a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int end_column; 141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Doc comments found at the source location. 143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // See the comments in SourceCodeInfo.Location (descriptor.proto) for details. 144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson string leading_comments; 145a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson string trailing_comments; 146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer vector<string> leading_detached_comments; 147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}; 148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Options when generating machine-parsable output from a descriptor with 150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DebugString(). 151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstruct DebugStringOptions { 152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // include original user comments as recorded in SourceLocation entries. N.B. 153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // that this must be |false| by default: several other pieces of code (for 154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // example, the C++ code generation for fields in the proto compiler) rely on 155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // DebugString() output being unobstructed by user comments. 156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool include_comments; 157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // If true, elide the braced body in the debug string. 158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool elide_group_body; 159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool elide_oneof_body; 160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer DebugStringOptions() 162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer : include_comments(false), 163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer elide_group_body(false), 164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer elide_oneof_body(false) {} 165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes a type of protocol message, or a particular group within a 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// message. To obtain the Descriptor for a given message object, call 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Message::GetDescriptor(). Generated message classes also have a 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static method called descriptor() which returns the type's descriptor. 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Use DescriptorPool to construct your own descriptors. 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT Descriptor { 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The name of the message type, not including its scope. 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name() const; 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The fully-qualified name of the message type, scope delimited by 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // periods. For example, message type "Foo" which is declared in package 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // "bar" has full name "bar.Foo". If a type "Baz" is nested within 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Foo, Baz's full_name is "bar.Foo.Baz". To get only the part that 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // comes after the last '.', use name(). 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& full_name() const; 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Index of this descriptor within the file or containing type's message 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // type array. 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index() const; 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The .proto file in which this message type was defined. Never NULL. 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file() const; 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // If this Descriptor describes a nested type, this returns the type 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // in which it is nested. Otherwise, returns NULL. 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* containing_type() const; 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get options for this message type. These are specified in the .proto file 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // by placing lines like "option foo = 1234;" in the message definition. 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Allowed options are defined by MessageOptions in 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // google/protobuf/descriptor.proto, and any available extensions of that 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message. 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageOptions& options() const; 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write the contents of this Descriptor into the given DescriptorProto. 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The target DescriptorProto must be clear before calling this; if it 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // isn't, the result may be garbage. 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void CopyTo(DescriptorProto* proto) const; 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write the contents of this decriptor in a human-readable form. Output 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // will be suitable for re-parsing. 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string DebugString() const; 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Similar to DebugString(), but additionally takes options (e.g., 212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // include original user comments in output). 213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string DebugStringWithOptions(const DebugStringOptions& options) const; 214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Returns true if this is a placeholder for an unknown type. This will 216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // only be the case if this descriptor comes from a DescriptorPool 217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // with AllowUnknownDependencies() set. 218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool is_placeholder() const; 219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Field stuff ----------------------------------------------------- 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The number of fields in this message type. 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int field_count() const; 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets a field by index, where 0 <= index < field_count(). 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are returned in the order they were defined in the .proto file. 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field(int index) const; 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Looks up a field by declared tag number. Returns NULL if no such field 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // exists. 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* FindFieldByNumber(int number) const; 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Looks up a field by name. Returns NULL if no such field exists. 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* FindFieldByName(const string& name) const; 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Looks up a field by lowercased name (as returned by lowercase_name()). 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This lookup may be ambiguous if multiple field names differ only by case, 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // in which case the field returned is chosen arbitrarily from the matches. 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* FindFieldByLowercaseName( 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& lowercase_name) const; 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Looks up a field by camel-case name (as returned by camelcase_name()). 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This lookup may be ambiguous if multiple field names differ in a way that 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // leads them to have identical camel-case names, in which case the field 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // returned is chosen arbitrarily from the matches. 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* FindFieldByCamelcaseName( 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& camelcase_name) const; 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The number of oneofs in this message type. 248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int oneof_decl_count() const; 249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Get a oneof by index, where 0 <= index < oneof_decl_count(). 250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // These are returned in the order they were defined in the .proto file. 251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofDescriptor* oneof_decl(int index) const; 252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Looks up a oneof by name. Returns NULL if no such oneof exists. 254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofDescriptor* FindOneofByName(const string& name) const; 255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Nested type stuff ----------------------------------------------- 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The number of nested types in this message type. 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int nested_type_count() const; 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets a nested type by index, where 0 <= index < nested_type_count(). 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are returned in the order they were defined in the .proto file. 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* nested_type(int index) const; 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Looks up a nested type by name. Returns NULL if no such nested type 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // exists. 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* FindNestedTypeByName(const string& name) const; 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Enum stuff ------------------------------------------------------ 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The number of enum types in this message type. 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int enum_type_count() const; 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets an enum type by index, where 0 <= index < enum_type_count(). 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are returned in the order they were defined in the .proto file. 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enum_type(int index) const; 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Looks up an enum type by name. Returns NULL if no such enum type exists. 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* FindEnumTypeByName(const string& name) const; 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Looks up an enum value by name, among all enum types in this message. 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Returns NULL if no such value exists. 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* FindEnumValueByName(const string& name) const; 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Extensions ------------------------------------------------------ 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // A range of field numbers which are designated for third-party 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extensions. 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville struct ExtensionRange { 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int start; // inclusive 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int end; // exclusive 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The number of extension ranges in this message type. 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int extension_range_count() const; 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets an extension range by index, where 0 <= index < 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extension_range_count(). These are returned in the order they were defined 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // in the .proto file. 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ExtensionRange* extension_range(int index) const; 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Returns true if the number is in one of the extension ranges. 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool IsExtensionNumber(int number) const; 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Returns NULL if no extension range contains the given number. 303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const ExtensionRange* FindExtensionRangeContainingNumber(int number) const; 304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The number of extensions -- extending *other* messages -- that were 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // defined nested within this message type's scope. 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int extension_count() const; 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get an extension by index, where 0 <= index < extension_count(). 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are returned in the order they were defined in the .proto file. 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* extension(int index) const; 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Looks up a named extension (which extends some *other* message type) 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // defined within this message type's scope. 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* FindExtensionByName(const string& name) const; 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Similar to FindFieldByLowercaseName(), but finds extensions defined within 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // this message type's scope. 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const; 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Similar to FindFieldByCamelcaseName(), but finds extensions defined within 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // this message type's scope. 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const; 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Reserved fields ------------------------------------------------- 325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // A range of reserved field numbers. 327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer struct ReservedRange { 328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int start; // inclusive 329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int end; // exclusive 330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }; 331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // The number of reserved ranges in this message type. 333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int reserved_range_count() const; 334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Gets an reserved range by index, where 0 <= index < 335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // reserved_range_count(). These are returned in the order they were defined 336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // in the .proto file. 337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ReservedRange* reserved_range(int index) const; 338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Returns true if the number is in one of the reserved ranges. 340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool IsReservedNumber(int number) const; 341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Returns NULL if no reserved range contains the given number. 343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const ReservedRange* FindReservedRangeContainingNumber(int number) const; 344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // The number of reserved field names in this message type. 346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int reserved_name_count() const; 347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Gets a reserved name by index, where 0 <= index < reserved_name_count(). 349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& reserved_name(int index) const; 350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Returns true if the field name is reserved. 352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool IsReservedName(const string& name) const; 353b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Source Location --------------------------------------------------- 355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Updates |*out_location| to the source location of the complete 357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // extent of this message declaration. Returns false and leaves 358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // |*out_location| unchanged iff location information was not available. 359a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool GetSourceLocation(SourceLocation* out_location) const; 360a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef MessageOptions OptionsType; 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Allows tests to test CopyTo(proto, true). 365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer friend class ::google::protobuf::descriptor_unittest::DescriptorTest; 366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Allows access to GetLocationPath for annotations. 368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer friend class ::google::protobuf::io::Printer; 369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Fill the json_name field of FieldDescriptorProto. 371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void CopyJsonNameTo(DescriptorProto* proto) const; 372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Internal version of DebugString; controls the level of indenting for 374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // correct depth. Takes |options| to control debug-string options, and 375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // |include_opening_clause| to indicate whether the "message ... " part of the 376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // clause has already been generated (this varies depending on context). 377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void DebugString(int depth, string *contents, 378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const DebugStringOptions& options, 379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool include_opening_clause) const; 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Walks up the descriptor tree to generate the source location path 382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // to this descriptor from the file root. 383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void GetLocationPath(std::vector<int>* output) const; 384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* name_; 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* full_name_; 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file_; 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* containing_type_; 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MessageOptions* options_; 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // True if this is a placeholder for an unknown type. 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_placeholder_; 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // True if this is a placeholder and the type name wasn't fully-qualified. 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_unqualified_placeholder_; 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int field_count_; 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptor* fields_; 398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int oneof_decl_count_; 399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson OneofDescriptor* oneof_decls_; 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int nested_type_count_; 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Descriptor* nested_types_; 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int enum_type_count_; 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptor* enum_types_; 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int extension_range_count_; 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExtensionRange* extension_ranges_; 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int extension_count_; 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptor* extensions_; 408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int reserved_range_count_; 409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ReservedRange* reserved_ranges_; 410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int reserved_name_count_; 411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string** reserved_names_; 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // IMPORTANT: If you add a new field, make sure to search for all instances 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of Allocate<Descriptor>() and AllocateArray<Descriptor>() in descriptor.cc 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // and update them to initialize the field. 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Must be constructed using DescriptorPool. 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Descriptor() {} 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class DescriptorBuilder; 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class EnumDescriptor; 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class FieldDescriptor; 421a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson friend class OneofDescriptor; 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class MethodDescriptor; 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class FileDescriptor; 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Descriptor); 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes a single field of a message. To get the descriptor for a given 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// field, first get the Descriptor for the message in which it is defined, 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// then call Descriptor::FindFieldByName(). To get a FieldDescriptor for 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// an extension, do one of the following: 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - Get the Descriptor or FileDescriptor for its containing scope, then 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// call Descriptor::FindExtensionByName() or 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// FileDescriptor::FindExtensionByName(). 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - Given a DescriptorPool, call DescriptorPool::FindExtensionByNumber(). 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// - Given a Reflection for a message object, call 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Reflection::FindKnownExtensionByName() or 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Reflection::FindKnownExtensionByNumber(). 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Use DescriptorPool to construct your own descriptors. 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT FieldDescriptor { 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Identifies a field type. 0 is reserved for errors. The order is weird 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // for historical reasons. Types 12 and up are new in proto2. 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum Type { 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_DOUBLE = 1, // double, exactly eight bytes on the wire. 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_FLOAT = 2, // float, exactly four bytes on the wire. 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_INT64 = 3, // int64, varint on the wire. Negative numbers 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // take 10 bytes. Use TYPE_SINT64 if negative 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // values are likely. 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_UINT64 = 4, // uint64, varint on the wire. 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_INT32 = 5, // int32, varint on the wire. Negative numbers 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // take 10 bytes. Use TYPE_SINT32 if negative 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // values are likely. 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_FIXED64 = 6, // uint64, exactly eight bytes on the wire. 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_FIXED32 = 7, // uint32, exactly four bytes on the wire. 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_BOOL = 8, // bool, varint on the wire. 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_STRING = 9, // UTF-8 text. 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_GROUP = 10, // Tag-delimited message. Deprecated. 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_MESSAGE = 11, // Length-delimited message. 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_BYTES = 12, // Arbitrary byte array. 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_UINT32 = 13, // uint32, varint on the wire 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_ENUM = 14, // Enum, varint on the wire 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SFIXED32 = 15, // int32, exactly four bytes on the wire 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SFIXED64 = 16, // int64, exactly eight bytes on the wire 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SINT32 = 17, // int32, ZigZag-encoded varint on the wire 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SINT64 = 18, // int64, ZigZag-encoded varint on the wire 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MAX_TYPE = 18, // Constant useful for defining lookup tables 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // indexed by Type. 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Specifies the C++ data type used to represent the field. There is a 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fixed mapping from Type to CppType where each Type maps to exactly one 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // CppType. 0 is reserved for errors. 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum CppType { 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_INT32 = 1, // TYPE_INT32, TYPE_SINT32, TYPE_SFIXED32 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_INT64 = 2, // TYPE_INT64, TYPE_SINT64, TYPE_SFIXED64 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_UINT32 = 3, // TYPE_UINT32, TYPE_FIXED32 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_UINT64 = 4, // TYPE_UINT64, TYPE_FIXED64 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_DOUBLE = 5, // TYPE_DOUBLE 481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_FLOAT = 6, // TYPE_FLOAT 482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_BOOL = 7, // TYPE_BOOL 483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_ENUM = 8, // TYPE_ENUM 484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_STRING = 9, // TYPE_STRING, TYPE_BYTES 485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_MESSAGE = 10, // TYPE_MESSAGE, TYPE_GROUP 486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MAX_CPPTYPE = 10, // Constant useful for defining lookup tables 488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // indexed by CppType. 489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Identifies whether the field is optional, required, or repeated. 0 is 492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // reserved for errors. 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum Label { 494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville LABEL_OPTIONAL = 1, // optional 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville LABEL_REQUIRED = 2, // required 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville LABEL_REPEATED = 3, // repeated 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MAX_LABEL = 3, // Constant useful for defining lookup tables 499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // indexed by Label. 500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Valid field numbers are positive integers up to kMaxNumber. 503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kMaxNumber = (1 << 29) - 1; 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // First field number reserved for the protocol buffer library implementation. 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Users may not declare fields that use reserved numbers. 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kFirstReservedNumber = 19000; 508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Last field number reserved for the protocol buffer library implementation. 509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Users may not declare fields that use reserved numbers. 510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kLastReservedNumber = 19999; 511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name() const; // Name of this field within the message. 513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& full_name() const; // Fully-qualified name of the field. 514b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string& json_name() const; // JSON name of this field. 515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file() const;// File in which this field was defined. 516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_extension() const; // Is this an extension field? 517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number() const; // Declared tag number. 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Same as name() except converted to lower-case. This (and especially the 520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FindFieldByLowercaseName() method) can be useful when parsing formats 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // which prefer to use lowercase naming style. (Although, technically 522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // field names should be lowercased anyway according to the protobuf style 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // guide, so this only makes a difference when dealing with old .proto files 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // which do not follow the guide.) 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& lowercase_name() const; 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Same as name() except converted to camel-case. In this conversion, any 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // time an underscore appears in the name, it is removed and the next 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // letter is capitalized. Furthermore, the first letter of the name is 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // lower-cased. Examples: 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // FooBar -> fooBar 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // foo_bar -> fooBar 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fooBar -> fooBar 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This (and especially the FindFieldByCamelcaseName() method) can be useful 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // when parsing formats which prefer to use camel-case naming style. 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& camelcase_name() const; 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 538a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Type type() const; // Declared type of this field. 539a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const char* type_name() const; // Name of the declared type. 540a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson CppType cpp_type() const; // C++ type of this field. 541a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const char* cpp_type_name() const; // Name of the C++ type. 542a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Label label() const; // optional/required/repeated 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_required() const; // shorthand for label() == LABEL_REQUIRED 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_optional() const; // shorthand for label() == LABEL_OPTIONAL 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_repeated() const; // shorthand for label() == LABEL_REPEATED 547d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville bool is_packable() const; // shorthand for is_repeated() && 548d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // IsTypePackable(type()) 549a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool is_packed() const; // shorthand for is_packable() && 550a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // options().packed() 551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool is_map() const; // shorthand for type() == TYPE_MESSAGE && 552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // message_type()->options().map_entry() 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Index of this field within the message's field array, or the file or 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extension scope's extensions array. 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index() const; 557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Does this field have an explicitly-declared default value? 559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool has_default_value() const; 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the field default value if cpp_type() == CPPTYPE_INT32. If no 562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // explicit default was defined, the default is 0. 563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int32 default_value_int32() const; 564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the field default value if cpp_type() == CPPTYPE_INT64. If no 565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // explicit default was defined, the default is 0. 566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int64 default_value_int64() const; 567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the field default value if cpp_type() == CPPTYPE_UINT32. If no 568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // explicit default was defined, the default is 0. 569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint32 default_value_uint32() const; 570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the field default value if cpp_type() == CPPTYPE_UINT64. If no 571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // explicit default was defined, the default is 0. 572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint64 default_value_uint64() const; 573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the field default value if cpp_type() == CPPTYPE_FLOAT. If no 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // explicit default was defined, the default is 0.0. 575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville float default_value_float() const; 576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the field default value if cpp_type() == CPPTYPE_DOUBLE. If no 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // explicit default was defined, the default is 0.0. 578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville double default_value_double() const; 579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the field default value if cpp_type() == CPPTYPE_BOOL. If no 580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // explicit default was defined, the default is false. 581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool default_value_bool() const; 582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the field default value if cpp_type() == CPPTYPE_ENUM. If no 583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // explicit default was defined, the default is the first value defined 584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // in the enum type (all enum types are required to have at least one value). 585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This never returns NULL. 586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* default_value_enum() const; 587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the field default value if cpp_type() == CPPTYPE_STRING. If no 588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // explicit default was defined, the default is the empty string. 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& default_value_string() const; 590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The Descriptor for the message of which this is a field. For extensions, 592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // this is the extended type. Never NULL. 593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* containing_type() const; 594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // If the field is a member of a oneof, this is the one, otherwise this is 596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // NULL. 597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofDescriptor* containing_oneof() const; 598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 599a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // If the field is a member of a oneof, returns the index in that oneof. 600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int index_in_oneof() const; 601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // An extension may be declared within the scope of another message. If this 603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // field is an extension (is_extension() is true), then extension_scope() 604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // returns that message, or NULL if the extension was declared at global 605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // scope. If this is not an extension, extension_scope() is undefined (may 606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // assert-fail). 607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* extension_scope() const; 608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // If type is TYPE_MESSAGE or TYPE_GROUP, returns a descriptor for the 610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message or the group type. Otherwise, returns null. 611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message_type() const; 612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // If type is TYPE_ENUM, returns a descriptor for the enum. Otherwise, 613a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // returns null. 614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enum_type() const; 615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the FieldOptions for this field. This includes things listed in 617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // square brackets after the field definition. E.g., the field: 618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // optional string text = 1 [ctype=CORD]; 619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // has the "ctype" option set. Allowed options are defined by FieldOptions 620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // in google/protobuf/descriptor.proto, and any available extensions of that 621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message. 622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldOptions& options() const; 623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::CopyTo(). 625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void CopyTo(FieldDescriptorProto* proto) const; 626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::DebugString(). 628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string DebugString() const; 629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // See Descriptor::DebugStringWithOptions(). 631b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string DebugStringWithOptions(const DebugStringOptions& options) const; 632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Helper method to get the CppType for a particular Type. 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static CppType TypeToCppType(Type type); 635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 636a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Helper method to get the name of a Type. 637a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson static const char* TypeName(Type type); 638a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 639a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Helper method to get the name of a CppType. 640a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson static const char* CppTypeName(CppType cpp_type); 641a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 642d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Return true iff [packed = true] is valid for fields of this type. 643d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static inline bool IsTypePackable(Type field_type); 644d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 645a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Source Location --------------------------------------------------- 646a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 647a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Updates |*out_location| to the source location of the complete 648a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // extent of this field declaration. Returns false and leaves 649a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // |*out_location| unchanged iff location information was not available. 650a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool GetSourceLocation(SourceLocation* out_location) const; 651a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef FieldOptions OptionsType; 654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Allows access to GetLocationPath for annotations. 656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer friend class ::google::protobuf::io::Printer; 657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Fill the json_name field of FieldDescriptorProto. 659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void CopyJsonNameTo(FieldDescriptorProto* proto) const; 660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::DebugString(). 662a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson enum PrintLabelFlag { PRINT_LABEL, OMIT_LABEL }; 663a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void DebugString(int depth, PrintLabelFlag print_label_flag, 664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string* contents, const DebugStringOptions& options) const; 665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // formats the default value appropriately and returns it as a string. 667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Must have a default value to call this. If quote_string_type is true, then 668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // types of CPPTYPE_STRING whill be surrounded by quotes and CEscaped. 669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string DefaultValueAsString(bool quote_string_type) const; 670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Helper function that returns the field type name for DebugString. 672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string FieldTypeNameDebugString() const; 673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 674a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Walks up the descriptor tree to generate the source location path 675a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // to this descriptor from the file root. 676a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void GetLocationPath(std::vector<int>* output) const; 677a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* name_; 679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* full_name_; 680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* lowercase_name_; 681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* camelcase_name_; 682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Whether the user has specified the json_name field option in the .proto 683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // file. 684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool has_json_name_; 685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // If has_json_name_ is true, it's the value specified by the user. 686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Otherwise, it has the same value as lowercase_name_. 687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string* json_name_; 688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file_; 689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number_; 690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Type type_; 691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Label label_; 692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_extension_; 693a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int index_in_oneof_; 694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* containing_type_; 695a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofDescriptor* containing_oneof_; 696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* extension_scope_; 697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message_type_; 698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enum_type_; 699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldOptions* options_; 700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // IMPORTANT: If you add a new field, make sure to search for all instances 701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of Allocate<FieldDescriptor>() and AllocateArray<FieldDescriptor>() in 702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // descriptor.cc and update them to initialize the field. 703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool has_default_value_; 705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville union { 706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int32 default_value_int32_; 707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int64 default_value_int64_; 708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint32 default_value_uint32_; 709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville uint64 default_value_uint64_; 710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville float default_value_float_; 711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville double default_value_double_; 712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool default_value_bool_; 713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* default_value_enum_; 715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* default_value_string_; 716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const CppType kTypeToCppTypeMap[MAX_TYPE + 1]; 719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const char * const kTypeToName[MAX_TYPE + 1]; 721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 722a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson static const char * const kCppTypeToName[MAX_CPPTYPE + 1]; 723a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const char * const kLabelToName[MAX_LABEL + 1]; 725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Must be constructed using DescriptorPool. 727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptor() {} 728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class DescriptorBuilder; 729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class FileDescriptor; 730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class Descriptor; 731a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson friend class OneofDescriptor; 732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldDescriptor); 733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 735a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Describes a oneof defined in a message type. 736a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass LIBPROTOBUF_EXPORT OneofDescriptor { 737a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public: 738a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const string& name() const; // Name of this oneof. 739a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const string& full_name() const; // Fully-qualified name of the oneof. 740a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 741a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Index of this oneof within the message's oneof array. 742a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int index() const; 743a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 744a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The Descriptor for the message containing this oneof. 745a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* containing_type() const; 746a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 747a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The number of (non-extension) fields which are members of this oneof. 748a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int field_count() const; 749a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Get a member of this oneof, in the order in which they were declared in the 750a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // .proto file. Does not include extensions. 751a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor* field(int index) const; 752a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 753a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // See Descriptor::CopyTo(). 754a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void CopyTo(OneofDescriptorProto* proto) const; 755a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 756a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // See Descriptor::DebugString(). 757a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson string DebugString() const; 758a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 759b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // See Descriptor::DebugStringWithOptions(). 760b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string DebugStringWithOptions(const DebugStringOptions& options) const; 761b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 762a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Source Location --------------------------------------------------- 763a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 764a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Updates |*out_location| to the source location of the complete 765a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // extent of this oneof declaration. Returns false and leaves 766a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // |*out_location| unchanged iff location information was not available. 767a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool GetSourceLocation(SourceLocation* out_location) const; 768a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 769a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private: 770b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Allows access to GetLocationPath for annotations. 771b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer friend class ::google::protobuf::io::Printer; 772b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 773a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // See Descriptor::DebugString(). 774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void DebugString(int depth, string* contents, 775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const DebugStringOptions& options) const; 776a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 777a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Walks up the descriptor tree to generate the source location path 778a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // to this descriptor from the file root. 779a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void GetLocationPath(std::vector<int>* output) const; 780a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 781a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const string* name_; 782a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const string* full_name_; 783a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* containing_type_; 784a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool is_extendable_; 785a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int field_count_; 786a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldDescriptor** fields_; 787a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // IMPORTANT: If you add a new field, make sure to search for all instances 788a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // of Allocate<OneofDescriptor>() and AllocateArray<OneofDescriptor>() 789a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // in descriptor.cc and update them to initialize the field. 790a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 791a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Must be constructed using DescriptorPool. 792a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson OneofDescriptor() {} 793a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson friend class DescriptorBuilder; 794a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson friend class Descriptor; 795a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OneofDescriptor); 796a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}; 797a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes an enum type defined in a .proto file. To get the EnumDescriptor 799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// for a generated enum type, call TypeName_descriptor(). Use DescriptorPool 800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to construct your own descriptors. 801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT EnumDescriptor { 802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The name of this enum type in the containing scope. 804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name() const; 805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The fully-qualified name of the enum type, scope delimited by periods. 807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& full_name() const; 808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Index of this enum within the file or containing message's enum array. 810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index() const; 811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The .proto file in which this enum type was defined. Never NULL. 813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file() const; 814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The number of values for this EnumDescriptor. Guaranteed to be greater 816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // than zero. 817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int value_count() const; 818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets a value by index, where 0 <= index < value_count(). 819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are returned in the order they were defined in the .proto file. 820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* value(int index) const; 821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Looks up a value by name. Returns NULL if no such value exists. 823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* FindValueByName(const string& name) const; 824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Looks up a value by number. Returns NULL if no such value exists. If 825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // multiple values have this number, the first one defined is returned. 826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* FindValueByNumber(int number) const; 827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // If this enum type is nested in a message type, this is that message type. 829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Otherwise, NULL. 830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* containing_type() const; 831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get options for this enum type. These are specified in the .proto file by 833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // placing lines like "option foo = 1234;" in the enum definition. Allowed 834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // options are defined by EnumOptions in google/protobuf/descriptor.proto, 835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // and any available extensions of that message. 836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumOptions& options() const; 837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::CopyTo(). 839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void CopyTo(EnumDescriptorProto* proto) const; 840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::DebugString(). 842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string DebugString() const; 843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 844b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // See Descriptor::DebugStringWithOptions(). 845b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string DebugStringWithOptions(const DebugStringOptions& options) const; 846b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 847b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 848a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Returns true if this is a placeholder for an unknown enum. This will 849a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // only be the case if this descriptor comes from a DescriptorPool 850a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // with AllowUnknownDependencies() set. 851a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool is_placeholder() const; 852a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 853a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Source Location --------------------------------------------------- 854a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 855a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Updates |*out_location| to the source location of the complete 856a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // extent of this enum declaration. Returns false and leaves 857a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // |*out_location| unchanged iff location information was not available. 858a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool GetSourceLocation(SourceLocation* out_location) const; 859a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef EnumOptions OptionsType; 862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 863b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Allows access to GetLocationPath for annotations. 864b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer friend class ::google::protobuf::io::Printer; 865b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 866b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Looks up a value by number. If the value does not exist, dynamically 867b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // creates a new EnumValueDescriptor for that value, assuming that it was 868b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // unknown. If a new descriptor is created, this is done in a thread-safe way, 869b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // and future calls will return the same value descriptor pointer. 870b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // 871b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // This is private but is used by GeneratedMessageReflection (which is 872b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // friended below) to return a valid EnumValueDescriptor from GetEnum() when 873b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // this feature is enabled. 874b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const EnumValueDescriptor* 875b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FindValueByNumberCreatingIfUnknown(int number) const; 876b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 877b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::DebugString(). 879b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void DebugString(int depth, string *contents, 880b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const DebugStringOptions& options) const; 881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 882a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Walks up the descriptor tree to generate the source location path 883a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // to this descriptor from the file root. 884a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void GetLocationPath(std::vector<int>* output) const; 885a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* name_; 887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* full_name_; 888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file_; 889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* containing_type_; 890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumOptions* options_; 891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // True if this is a placeholder for an unknown type. 893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_placeholder_; 894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // True if this is a placeholder and the type name wasn't fully-qualified. 895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool is_unqualified_placeholder_; 896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int value_count_; 898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumValueDescriptor* values_; 899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // IMPORTANT: If you add a new field, make sure to search for all instances 900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of Allocate<EnumDescriptor>() and AllocateArray<EnumDescriptor>() in 901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // descriptor.cc and update them to initialize the field. 902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Must be constructed using DescriptorPool. 904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptor() {} 905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class DescriptorBuilder; 906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class Descriptor; 907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class FieldDescriptor; 908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class EnumValueDescriptor; 909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class FileDescriptor; 910b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer friend class internal::GeneratedMessageReflection; 911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumDescriptor); 912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes an individual enum constant of a particular type. To get the 915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// EnumValueDescriptor for a given enum value, first get the EnumDescriptor 916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// for its type, then use EnumDescriptor::FindValueByName() or 917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// EnumDescriptor::FindValueByNumber(). Use DescriptorPool to construct 918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// your own descriptors. 919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT EnumValueDescriptor { 920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name() const; // Name of this enum constant. 922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index() const; // Index within the enums's Descriptor. 923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number() const; // Numeric value of this enum constant. 924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The full_name of an enum value is a sibling symbol of the enum type. 926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // e.g. the full name of FieldDescriptorProto::TYPE_INT32 is actually 927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // "google.protobuf.FieldDescriptorProto.TYPE_INT32", NOT 928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // "google.protobuf.FieldDescriptorProto.Type.TYPE_INT32". This is to conform 929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // with C++ scoping rules for enums. 930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& full_name() const; 931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The type of this value. Never NULL. 933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* type() const; 934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get options for this enum value. These are specified in the .proto file 936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // by adding text like "[foo = 1234]" after an enum value definition. 937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Allowed options are defined by EnumValueOptions in 938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // google/protobuf/descriptor.proto, and any available extensions of that 939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message. 940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueOptions& options() const; 941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::CopyTo(). 943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void CopyTo(EnumValueDescriptorProto* proto) const; 944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::DebugString(). 946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string DebugString() const; 947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 948b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // See Descriptor::DebugStringWithOptions(). 949b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string DebugStringWithOptions(const DebugStringOptions& options) const; 950b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 951b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 952a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Source Location --------------------------------------------------- 953a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 954a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Updates |*out_location| to the source location of the complete 955a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // extent of this enum value declaration. Returns false and leaves 956a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // |*out_location| unchanged iff location information was not available. 957a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool GetSourceLocation(SourceLocation* out_location) const; 958a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef EnumValueOptions OptionsType; 961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 962b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Allows access to GetLocationPath for annotations. 963b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer friend class ::google::protobuf::io::Printer; 964b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::DebugString(). 966b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void DebugString(int depth, string *contents, 967b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const DebugStringOptions& options) const; 968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 969a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Walks up the descriptor tree to generate the source location path 970a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // to this descriptor from the file root. 971a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void GetLocationPath(std::vector<int>* output) const; 972a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* name_; 974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* full_name_; 975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number_; 976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* type_; 977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueOptions* options_; 978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // IMPORTANT: If you add a new field, make sure to search for all instances 979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of Allocate<EnumValueDescriptor>() and AllocateArray<EnumValueDescriptor>() 980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // in descriptor.cc and update them to initialize the field. 981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Must be constructed using DescriptorPool. 983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumValueDescriptor() {} 984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class DescriptorBuilder; 985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class EnumDescriptor; 986b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer friend class FileDescriptorTables; 987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumValueDescriptor); 988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes an RPC service. To get the ServiceDescriptor for a service, 991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// call Service::GetDescriptor(). Generated service classes also have a 992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// static method called descriptor() which returns the type's 993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ServiceDescriptor. Use DescriptorPool to construct your own descriptors. 994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT ServiceDescriptor { 995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The name of the service, not including its containing scope. 997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name() const; 998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The fully-qualified name of the service, scope delimited by periods. 999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& full_name() const; 1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Index of this service within the file's services array. 1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index() const; 1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The .proto file in which this service was defined. Never NULL. 1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file() const; 1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get options for this service type. These are specified in the .proto file 1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // by placing lines like "option foo = 1234;" in the service definition. 1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Allowed options are defined by ServiceOptions in 1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // google/protobuf/descriptor.proto, and any available extensions of that 1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message. 1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceOptions& options() const; 1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The number of methods this service defines. 1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int method_count() const; 1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets a MethodDescriptor by index, where 0 <= index < method_count(). 1016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are returned in the order they were defined in the .proto file. 1017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor* method(int index) const; 1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Look up a MethodDescriptor by name. 1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor* FindMethodByName(const string& name) const; 1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::CopyTo(). 1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void CopyTo(ServiceDescriptorProto* proto) const; 1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::DebugString(). 1025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string DebugString() const; 1026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1027b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // See Descriptor::DebugStringWithOptions(). 1028b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string DebugStringWithOptions(const DebugStringOptions& options) const; 1029b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1030b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1031a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Source Location --------------------------------------------------- 1032a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1033a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Updates |*out_location| to the source location of the complete 1034a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // extent of this service declaration. Returns false and leaves 1035a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // |*out_location| unchanged iff location information was not available. 1036a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool GetSourceLocation(SourceLocation* out_location) const; 1037a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 1039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef ServiceOptions OptionsType; 1040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1041b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Allows access to GetLocationPath for annotations. 1042b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer friend class ::google::protobuf::io::Printer; 1043b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::DebugString(). 1045b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void DebugString(string *contents, const DebugStringOptions& options) const; 1046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1047a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Walks up the descriptor tree to generate the source location path 1048a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // to this descriptor from the file root. 1049a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void GetLocationPath(std::vector<int>* output) const; 1050a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* name_; 1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* full_name_; 1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* file_; 1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceOptions* options_; 1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int method_count_; 1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MethodDescriptor* methods_; 1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // IMPORTANT: If you add a new field, make sure to search for all instances 1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of Allocate<ServiceDescriptor>() and AllocateArray<ServiceDescriptor>() in 1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // descriptor.cc and update them to initialize the field. 1060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Must be constructed using DescriptorPool. 1062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ServiceDescriptor() {} 1063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class DescriptorBuilder; 1064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class FileDescriptor; 1065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class MethodDescriptor; 1066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceDescriptor); 1067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes an individual service method. To obtain a MethodDescriptor given 1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// a service, first get its ServiceDescriptor, then call 1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ServiceDescriptor::FindMethodByName(). Use DescriptorPool to construct your 1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// own descriptors. 1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT MethodDescriptor { 1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 1075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Name of this method, not including containing scope. 1076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name() const; 1077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The fully-qualified name of the method, scope delimited by periods. 1078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& full_name() const; 1079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Index within the service's Descriptor. 1080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int index() const; 1081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets the service to which this method belongs. Never NULL. 1083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* service() const; 1084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets the type of protocol message which this method accepts as input. 1086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* input_type() const; 1087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets the type of protocol message which this message produces as output. 1088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* output_type() const; 1089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1090b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Gets whether the client streams multiple requests. 1091b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool client_streaming() const; 1092b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Gets whether the server streams multiple responses. 1093b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool server_streaming() const; 1094b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get options for this method. These are specified in the .proto file by 1096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // placing lines like "option foo = 1234;" in curly-braces after a method 1097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // declaration. Allowed options are defined by MethodOptions in 1098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // google/protobuf/descriptor.proto, and any available extensions of that 1099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message. 1100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodOptions& options() const; 1101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::CopyTo(). 1103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void CopyTo(MethodDescriptorProto* proto) const; 1104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::DebugString(). 1106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string DebugString() const; 1107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // See Descriptor::DebugStringWithOptions(). 1109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string DebugStringWithOptions(const DebugStringOptions& options) const; 1110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1112a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Source Location --------------------------------------------------- 1113a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1114a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Updates |*out_location| to the source location of the complete 1115a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // extent of this method declaration. Returns false and leaves 1116a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // |*out_location| unchanged iff location information was not available. 1117a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool GetSourceLocation(SourceLocation* out_location) const; 1118a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 1120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef MethodOptions OptionsType; 1121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Allows access to GetLocationPath for annotations. 1123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer friend class ::google::protobuf::io::Printer; 1124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::DebugString(). 1126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void DebugString(int depth, string *contents, 1127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const DebugStringOptions& options) const; 1128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Walks up the descriptor tree to generate the source location path 1130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // to this descriptor from the file root. 1131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void GetLocationPath(std::vector<int>* output) const; 1132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* name_; 1134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* full_name_; 1135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* service_; 1136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* input_type_; 1137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* output_type_; 1138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodOptions* options_; 1139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool client_streaming_; 1140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool server_streaming_; 1141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // IMPORTANT: If you add a new field, make sure to search for all instances 1142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of Allocate<MethodDescriptor>() and AllocateArray<MethodDescriptor>() in 1143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // descriptor.cc and update them to initialize the field. 1144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Must be constructed using DescriptorPool. 1146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MethodDescriptor() {} 1147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class DescriptorBuilder; 1148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class ServiceDescriptor; 1149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MethodDescriptor); 1150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Describes a whole .proto file. To get the FileDescriptor for a compiled-in 1154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// file, get the descriptor for something defined in that file and call 1155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// descriptor->file(). Use DescriptorPool to construct your own descriptors. 1156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT FileDescriptor { 1157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 1158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The filename, relative to the source tree. 1159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // e.g. "google/protobuf/descriptor.proto" 1160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& name() const; 1161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The package, e.g. "google.protobuf.compiler". 1163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& package() const; 1164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The DescriptorPool in which this FileDescriptor and all its contents were 1166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // allocated. Never NULL. 1167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const DescriptorPool* pool() const; 1168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The number of files imported by this one. 1170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int dependency_count() const; 1171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets an imported file by index, where 0 <= index < dependency_count(). 1172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are returned in the order they were defined in the .proto file. 1173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* dependency(int index) const; 1174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The number of files public imported by this one. 1176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The public dependency list is a subset of the dependency list. 1177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int public_dependency_count() const; 1178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Gets a public imported file by index, where 0 <= index < 1179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // public_dependency_count(). 1180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // These are returned in the order they were defined in the .proto file. 1181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* public_dependency(int index) const; 1182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The number of files that are imported for weak fields. 1184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The weak dependency list is a subset of the dependency list. 1185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int weak_dependency_count() const; 1186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Gets a weak imported file by index, where 0 <= index < 1187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // weak_dependency_count(). 1188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // These are returned in the order they were defined in the .proto file. 1189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FileDescriptor* weak_dependency(int index) const; 1190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Number of top-level message types defined in this file. (This does not 1192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // include nested types.) 1193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int message_type_count() const; 1194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets a top-level message type, where 0 <= index < message_type_count(). 1195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are returned in the order they were defined in the .proto file. 1196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* message_type(int index) const; 1197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Number of top-level enum types defined in this file. (This does not 1199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // include nested types.) 1200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int enum_type_count() const; 1201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets a top-level enum type, where 0 <= index < enum_type_count(). 1202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are returned in the order they were defined in the .proto file. 1203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* enum_type(int index) const; 1204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Number of services defined in this file. 1206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int service_count() const; 1207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets a service, where 0 <= index < service_count(). 1208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are returned in the order they were defined in the .proto file. 1209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* service(int index) const; 1210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Number of extensions defined at file scope. (This does not include 1212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // extensions nested within message types.) 1213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int extension_count() const; 1214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Gets an extension's descriptor, where 0 <= index < extension_count(). 1215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are returned in the order they were defined in the .proto file. 1216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* extension(int index) const; 1217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get options for this file. These are specified in the .proto file by 1219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // placing lines like "option foo = 1234;" at the top level, outside of any 1220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // other definitions. Allowed options are defined by FileOptions in 1221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // google/protobuf/descriptor.proto, and any available extensions of that 1222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message. 1223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileOptions& options() const; 1224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Syntax of this file. 1226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer enum Syntax { 1227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer SYNTAX_UNKNOWN = 0, 1228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer SYNTAX_PROTO2 = 2, 1229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer SYNTAX_PROTO3 = 3, 1230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }; 1231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Syntax syntax() const; 1232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static const char* SyntaxName(Syntax syntax); 1233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Find a top-level message type by name. Returns NULL if not found. 1235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* FindMessageTypeByName(const string& name) const; 1236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Find a top-level enum type by name. Returns NULL if not found. 1237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* FindEnumTypeByName(const string& name) const; 1238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Find an enum value defined in any top-level enum by name. Returns NULL if 1239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // not found. 1240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* FindEnumValueByName(const string& name) const; 1241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Find a service definition by name. Returns NULL if not found. 1242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* FindServiceByName(const string& name) const; 1243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Find a top-level extension definition by name. Returns NULL if not found. 1244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* FindExtensionByName(const string& name) const; 1245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Similar to FindExtensionByName(), but searches by lowercased-name. See 1246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Descriptor::FindFieldByLowercaseName(). 1247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const; 1248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Similar to FindExtensionByName(), but searches by camelcased-name. See 1249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Descriptor::FindFieldByCamelcaseName(). 1250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const; 1251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::CopyTo(). 1253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Notes: 1254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // - This method does NOT copy source code information since it is relatively 1255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // large and rarely needed. See CopySourceCodeInfoTo() below. 1256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void CopyTo(FileDescriptorProto* proto) const; 1257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Write the source code information of this FileDescriptor into the given 1258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // FileDescriptorProto. See CopyTo() above. 1259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void CopySourceCodeInfoTo(FileDescriptorProto* proto) const; 1260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Fill the json_name field of FieldDescriptorProto for all fields. Can only 1261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // be called after CopyTo(). 1262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void CopyJsonNameTo(FileDescriptorProto* proto) const; 1263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See Descriptor::DebugString(). 1265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string DebugString() const; 1266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // See Descriptor::DebugStringWithOptions(). 1268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer string DebugStringWithOptions(const DebugStringOptions& options) const; 1269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Returns true if this is a placeholder for an unknown file. This will 1271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // only be the case if this descriptor comes from a DescriptorPool 1272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // with AllowUnknownDependencies() set. 1273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool is_placeholder() const; 1274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Updates |*out_location| to the source location of the complete extent of 1276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // this file declaration (namely, the empty path). 1277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool GetSourceLocation(SourceLocation* out_location) const; 1278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Updates |*out_location| to the source location of the complete 1280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // extent of the declaration or declaration-part denoted by |path|. 1281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Returns false and leaves |*out_location| unchanged iff location 1282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // information was not available. (See SourceCodeInfo for 1283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // description of path encoding.) 1284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool GetSourceLocation(const std::vector<int>& path, 1285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SourceLocation* out_location) const; 1286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private: 1288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef FileOptions OptionsType; 1289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* name_; 1291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* package_; 1292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const DescriptorPool* pool_; 1293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int dependency_count_; 1294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor** dependencies_; 1295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int public_dependency_count_; 1296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int* public_dependencies_; 1297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int weak_dependency_count_; 1298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int* weak_dependencies_; 1299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int message_type_count_; 1300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Descriptor* message_types_; 1301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int enum_type_count_; 1302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EnumDescriptor* enum_types_; 1303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int service_count_; 1304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ServiceDescriptor* services_; 1305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int extension_count_; 1306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Syntax syntax_; 1307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool is_placeholder_; 1308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptor* extensions_; 1309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileOptions* options_; 1310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptorTables* tables_; 1312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const SourceCodeInfo* source_code_info_; 1313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // IMPORTANT: If you add a new field, make sure to search for all instances 1314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of Allocate<FileDescriptor>() and AllocateArray<FileDescriptor>() in 1315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // descriptor.cc and update them to initialize the field. 1316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileDescriptor() {} 1318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class DescriptorBuilder; 1319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class Descriptor; 1320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class FieldDescriptor; 1321a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson friend class OneofDescriptor; 1322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class EnumDescriptor; 1323a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson friend class EnumValueDescriptor; 1324a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson friend class MethodDescriptor; 1325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class ServiceDescriptor; 1326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileDescriptor); 1327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 1330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Used to construct descriptors. 1332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 1333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Normally you won't want to build your own descriptors. Message classes 1334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// constructed by the protocol compiler will provide them for you. However, 1335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// if you are implementing Message on your own, or if you are writing a 1336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// program which can operate on totally arbitrary types and needs to load 1337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// them from some sort of database, you might need to. 1338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 1339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Since Descriptors are composed of a whole lot of cross-linked bits of 1340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// data that would be a pain to put together manually, the 1341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DescriptorPool class is provided to make the process easier. It can 1342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// take a FileDescriptorProto (defined in descriptor.proto), validate it, 1343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// and convert it to a set of nicely cross-linked Descriptors. 1344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 1345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DescriptorPool also helps with memory management. Descriptors are 1346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// composed of many objects containing static data and pointers to each 1347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// other. In all likelihood, when it comes time to delete this data, 1348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// you'll want to delete it all at once. In fact, it is not uncommon to 1349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// have a whole pool of descriptors all cross-linked with each other which 1350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// you wish to delete all at once. This class represents such a pool, and 1351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// handles the memory management for you. 1352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 1353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// You can also search for descriptors within a DescriptorPool by name, and 1354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// extensions by number. 1355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT DescriptorPool { 1356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 1357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Create a normal, empty DescriptorPool. 1358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorPool(); 1359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Constructs a DescriptorPool that, when it can't find something among the 1361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // descriptors already in the pool, looks for it in the given 1362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // DescriptorDatabase. 1363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Notes: 1364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // - If a DescriptorPool is constructed this way, its BuildFile*() methods 1365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // must not be called (they will assert-fail). The only way to populate 1366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the pool with descriptors is to call the Find*By*() methods. 1367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // - The Find*By*() methods may block the calling thread if the 1368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // DescriptorDatabase blocks. This in turn means that parsing messages 1369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // may block if they need to look up extensions. 1370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // - The Find*By*() methods will use mutexes for thread-safety, thus making 1371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // them slower even when they don't have to fall back to the database. 1372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // In fact, even the Find*By*() methods of descriptor objects owned by 1373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // this pool will be slower, since they will have to obtain locks too. 1374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // - An ErrorCollector may optionally be given to collect validation errors 1375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // in files loaded from the database. If not given, errors will be printed 1376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to GOOGLE_LOG(ERROR). Remember that files are built on-demand, so this 1377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ErrorCollector may be called from any thread that calls one of the 1378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Find*By*() methods. 1379a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // - The DescriptorDatabase must not be mutated during the lifetime of 1380a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // the DescriptorPool. Even if the client takes care to avoid data races, 1381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // changes to the content of the DescriptorDatabase may not be reflected 1382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // in subsequent lookups in the DescriptorPool. 1383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class ErrorCollector; 1384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville explicit DescriptorPool(DescriptorDatabase* fallback_database, 1385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorCollector* error_collector = NULL); 1386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~DescriptorPool(); 1388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get a pointer to the generated pool. Generated protocol message classes 1390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // which are compiled into the binary will allocate their descriptors in 1391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // this pool. Do not add your own descriptors to this pool. 1392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const DescriptorPool* generated_pool(); 1393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Find a FileDescriptor in the pool by file name. Returns NULL if not 1396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // found. 1397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* FindFileByName(const string& name) const; 1398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Find the FileDescriptor in the pool which defines the given symbol. 1400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // If any of the Find*ByName() methods below would succeed, then this is 1401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // equivalent to calling that method and calling the result's file() method. 1402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Otherwise this returns NULL. 1403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* FindFileContainingSymbol( 1404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& symbol_name) const; 1405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Looking up descriptors ------------------------------------------ 1407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These find descriptors by fully-qualified name. These will find both 1408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // top-level descriptors and nested descriptors. They return NULL if not 1409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // found. 1410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* FindMessageTypeByName(const string& name) const; 1412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* FindFieldByName(const string& name) const; 1413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* FindExtensionByName(const string& name) const; 1414a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofDescriptor* FindOneofByName(const string& name) const; 1415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumDescriptor* FindEnumTypeByName(const string& name) const; 1416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor* FindEnumValueByName(const string& name) const; 1417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor* FindServiceByName(const string& name) const; 1418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor* FindMethodByName(const string& name) const; 1419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Finds an extension of the given type by number. The extendee must be 1421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // a member of this DescriptorPool or one of its underlays. 1422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* FindExtensionByNumber(const Descriptor* extendee, 1423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int number) const; 1424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Finds extensions of extendee. The extensions will be appended to 1426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // out in an undefined order. Only extensions defined directly in 1427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // this DescriptorPool or one of its underlays are guaranteed to be 1428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // found: extensions defined in the fallback database might not be found 1429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // depending on the database implementation. 1430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void FindAllExtensions(const Descriptor* extendee, 1431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson std::vector<const FieldDescriptor*>* out) const; 1432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Building descriptors -------------------------------------------- 1434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // When converting a FileDescriptorProto to a FileDescriptor, various 1436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // errors might be detected in the input. The caller may handle these 1437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // programmatically by implementing an ErrorCollector. 1438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class LIBPROTOBUF_EXPORT ErrorCollector { 1439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 1440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline ErrorCollector() {} 1441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual ~ErrorCollector(); 1442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These constants specify what exact part of the construct is broken. 1444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This is useful e.g. for mapping the error back to an exact location 1445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // in a .proto file. 1446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum ErrorLocation { 1447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville NAME, // the symbol name, or the package name for files 1448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville NUMBER, // field or extension range number 1449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE, // field type 1450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXTENDEE, // field extendee 1451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DEFAULT_VALUE, // field default value 1452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville INPUT_TYPE, // method input type 1453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville OUTPUT_TYPE, // method output type 1454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville OPTION_NAME, // name in assignment 1455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville OPTION_VALUE, // value in option assignment 1456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville OTHER // some other problem 1457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 1458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Reports an error in the FileDescriptorProto. Use this function if the 1460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // problem occurred should interrupt building the FileDescriptorProto. 1461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void AddError( 1462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& filename, // File name in which the error occurred. 1463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& element_name, // Full name of the erroneous element. 1464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Message* descriptor, // Descriptor of the erroneous element. 1465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorLocation location, // One of the location constants, above. 1466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string& message // Human-readable error message. 1467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ) = 0; 1468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1469a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Reports a warning in the FileDescriptorProto. Use this function if the 1470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // problem occurred should NOT interrupt building the FileDescriptorProto. 1471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson virtual void AddWarning( 14724a0078628003c824f839fa22ae0ce9f133c8aa98Austin Schuh const string& /*filename*/, // File name in which the error occurred. 14734a0078628003c824f839fa22ae0ce9f133c8aa98Austin Schuh const string& /*element_name*/, // Full name of the erroneous element. 14744a0078628003c824f839fa22ae0ce9f133c8aa98Austin Schuh const Message* /*descriptor*/, // Descriptor of the erroneous element. 14754a0078628003c824f839fa22ae0ce9f133c8aa98Austin Schuh ErrorLocation /*location*/, // One of the location constants, above. 14764a0078628003c824f839fa22ae0ce9f133c8aa98Austin Schuh const string& /*message*/ // Human-readable error message. 1477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ) {} 1478a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 1480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector); 1481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 1482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Convert the FileDescriptorProto to real descriptors and place them in 1484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // this DescriptorPool. All dependencies of the file must already be in 1485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the pool. Returns the resulting FileDescriptor, or NULL if there were 1486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // problems with the input (e.g. the message was invalid, or dependencies 1487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // were missing). Details about the errors are written to GOOGLE_LOG(ERROR). 1488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* BuildFile(const FileDescriptorProto& proto); 1489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Same as BuildFile() except errors are sent to the given ErrorCollector. 1491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* BuildFileCollectingErrors( 1492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptorProto& proto, 1493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorCollector* error_collector); 1494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // By default, it is an error if a FileDescriptorProto contains references 1496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // to types or other files that are not found in the DescriptorPool (or its 1497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // backing DescriptorDatabase, if any). If you call 1498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // AllowUnknownDependencies(), however, then unknown types and files 1499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // will be replaced by placeholder descriptors (which can be identified by 1500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // the is_placeholder() method). This can allow you to 1501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // perform some useful operations with a .proto file even if you do not 1502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // have access to other .proto files on which it depends. However, some 1503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // heuristics must be used to fill in the gaps in information, and these 1504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // can lead to descriptors which are inaccurate. For example, the 1505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // DescriptorPool may be forced to guess whether an unknown type is a message 1506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // or an enum, as well as what package it resides in. Furthermore, 1507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // placeholder types will not be discoverable via FindMessageTypeByName() 1508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // and similar methods, which could confuse some descriptor-based algorithms. 1509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Generally, the results of this option should be handled with extreme care. 1510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void AllowUnknownDependencies() { allow_unknown_ = true; } 1511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // By default, weak imports are allowed to be missing, in which case we will 1513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // use a placeholder for the dependency and convert the field to be an Empty 1514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // message field. If you call EnforceWeakDependencies(true), however, the 1515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // DescriptorPool will report a import not found error. 1516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void EnforceWeakDependencies(bool enforce) { enforce_weak_ = enforce; } 1517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Internal stuff -------------------------------------------------- 1519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These methods MUST NOT be called from outside the proto2 library. 1520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These methods may contain hidden pitfalls and may be removed in a 1521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // future library version. 1522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Create a DescriptorPool which is overlaid on top of some other pool. 1524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // If you search for a descriptor in the overlay and it is not found, the 1525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // underlay will be searched as a backup. If the underlay has its own 1526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // underlay, that will be searched next, and so on. This also means that 1527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // files built in the overlay will be cross-linked with the underlay's 1528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // descriptors if necessary. The underlay remains property of the caller; 1529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // it must remain valid for the lifetime of the newly-constructed pool. 1530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 1531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Example: Say you want to parse a .proto file at runtime in order to use 1532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // its type with a DynamicMessage. Say this .proto file has dependencies, 1533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // but you know that all the dependencies will be things that are already 1534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // compiled into the binary. For ease of use, you'd like to load the types 1535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // right out of generated_pool() rather than have to parse redundant copies 1536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of all these .protos and runtime. But, you don't want to add the parsed 1537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // types directly into generated_pool(): this is not allowed, and would be 1538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // bad design anyway. So, instead, you could use generated_pool() as an 1539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // underlay for a new DescriptorPool in which you add only the new file. 1540d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // 1541d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // WARNING: Use of underlays can lead to many subtle gotchas. Instead, 1542d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // try to formulate what you want to do in terms of DescriptorDatabases. 1543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville explicit DescriptorPool(const DescriptorPool* underlay); 1544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Called by generated classes at init time to add their descriptors to 1546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // generated_pool. Do NOT call this in your own code! filename must be a 1547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // permanent string (e.g. a string literal). 1548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void InternalAddGeneratedFile( 1549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const void* encoded_file_descriptor, int size); 1550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // For internal use only: Gets a non-const pointer to the generated pool. 1553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This is called at static-initialization time only, so thread-safety is 1554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // not a concern. If both an underlay and a fallback database are present, 1555a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // the underlay takes precedence. 1556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static DescriptorPool* internal_generated_pool(); 1557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // For internal use only: Changes the behavior of BuildFile() such that it 1559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // allows the file to make reference to message types declared in other files 1560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // which it did not officially declare as dependencies. 1561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void InternalDontEnforceDependencies(); 1562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // For internal use only. 1564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void internal_set_underlay(const DescriptorPool* underlay) { 1565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville underlay_ = underlay; 1566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // For internal (unit test) use only: Returns true if a FileDescriptor has 1569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // been constructed for the given file, false otherwise. Useful for testing 1570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // lazy descriptor initialization behavior. 1571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool InternalIsFileLoaded(const string& filename) const; 1572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1574a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Add a file to unused_import_track_files_. DescriptorBuilder will log 1575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // warnings for those files if there is any unused import. 1576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void AddUnusedImportTrackFile(const string& file_name); 1577a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson void ClearUnusedImportTrackFiles(); 1578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 1580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class Descriptor; 1581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class FieldDescriptor; 1582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class EnumDescriptor; 1583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class ServiceDescriptor; 1584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class FileDescriptor; 1585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville friend class DescriptorBuilder; 1586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer friend class FileDescriptorTables; 1587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Return true if the given name is a sub-symbol of any non-package 1589a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // descriptor that already exists in the descriptor pool. (The full 1590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // definition of such types is already known.) 1591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool IsSubSymbolOfBuiltType(const string& name) const; 1592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Tries to find something in the fallback database and link in the 1594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // corresponding proto file. Returns true if successful, in which case 1595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the caller should search for the thing again. These are declared 1596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // const because they are called by (semantically) const methods. 1597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool TryFindFileInFallbackDatabase(const string& name) const; 1598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool TryFindSymbolInFallbackDatabase(const string& name) const; 1599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool TryFindExtensionInFallbackDatabase(const Descriptor* containing_type, 1600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int field_number) const; 1601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like BuildFile() but called internally when the file has been loaded from 1603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fallback_database_. Declared const because it is called by (semantically) 1604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // const methods. 1605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptor* BuildFileFromDatabase( 1606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FileDescriptorProto& proto) const; 1607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // If fallback_database_ is NULL, this is NULL. Otherwise, this is a mutex 1609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // which must be locked while accessing tables_. 1610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Mutex* mutex_; 1611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // See constructor. 1613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DescriptorDatabase* fallback_database_; 1614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ErrorCollector* default_error_collector_; 1615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const DescriptorPool* underlay_; 1616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This class contains a lot of hash maps with complicated types that 1618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // we'd like to keep out of the header. 1619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class Tables; 1620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer google::protobuf::scoped_ptr<Tables> tables_; 1621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool enforce_dependencies_; 1623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bool allow_unknown_; 1624a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson bool enforce_weak_; 1625a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson std::set<string> unused_import_track_files_; 1626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPool); 1628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// inline methods ==================================================== 1631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// These macros makes this repetitive code more readable. 1633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define PROTOBUF_DEFINE_ACCESSOR(CLASS, FIELD, TYPE) \ 1634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline TYPE CLASS::FIELD() const { return FIELD##_; } 1635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Strings fields are stored as pointers but returned as const references. 1637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define PROTOBUF_DEFINE_STRING_ACCESSOR(CLASS, FIELD) \ 1638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline const string& CLASS::FIELD() const { return *FIELD##_; } 1639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Arrays take an index parameter, obviously. 1641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define PROTOBUF_DEFINE_ARRAY_ACCESSOR(CLASS, FIELD, TYPE) \ 1642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline TYPE CLASS::FIELD(int index) const { return FIELD##s_ + index; } 1643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define PROTOBUF_DEFINE_OPTIONS_ACCESSOR(CLASS, TYPE) \ 1645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville inline const TYPE& CLASS::options() const { return *options_; } 1646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, name) 1648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, full_name) 1649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, file, const FileDescriptor*) 1650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, containing_type, const Descriptor*) 1651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, field_count, int) 1653a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(Descriptor, oneof_decl_count, int) 1654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, nested_type_count, int) 1655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, enum_type_count, int) 1656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, field, const FieldDescriptor*) 1658a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, oneof_decl, const OneofDescriptor*) 1659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, nested_type, const Descriptor*) 1660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, enum_type, const EnumDescriptor*) 1661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_range_count, int) 1663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_count, int) 1664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension_range, 1665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor::ExtensionRange*) 1666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension, 1667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor*) 1668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_ACCESSOR(Descriptor, reserved_range_count, int) 1670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, reserved_range, 1671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Descriptor::ReservedRange*) 1672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_ACCESSOR(Descriptor, reserved_name_count, int) 1673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_OPTIONS_ACCESSOR(Descriptor, MessageOptions) 1675a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(Descriptor, is_placeholder, bool) 1676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, name) 1678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, full_name) 1679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, json_name) 1680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, lowercase_name) 1681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, camelcase_name) 1682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, file, const FileDescriptor*) 1683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, number, int) 1684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, is_extension, bool) 1685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, type, FieldDescriptor::Type) 1686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, label, FieldDescriptor::Label) 1687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_type, const Descriptor*) 1688a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_oneof, 1689a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofDescriptor*) 1690a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, index_in_oneof, int) 1691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, extension_scope, const Descriptor*) 1692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, message_type, const Descriptor*) 1693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, enum_type, const EnumDescriptor*) 1694a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_OPTIONS_ACCESSOR(FieldDescriptor, FieldOptions) 1695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, has_default_value, bool) 1696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int32 , int32 ) 1697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int64 , int64 ) 1698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint32, uint32) 1699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint64, uint64) 1700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_float , float ) 1701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_double, double) 1702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_bool , bool ) 1703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_enum, 1704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor*) 1705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, default_value_string) 1706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1707a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_STRING_ACCESSOR(OneofDescriptor, name) 1708a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_STRING_ACCESSOR(OneofDescriptor, full_name) 1709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(OneofDescriptor, containing_type, const Descriptor*) 1710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(OneofDescriptor, field_count, int) 1711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, name) 1713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, full_name) 1714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, file, const FileDescriptor*) 1715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, containing_type, const Descriptor*) 1716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, value_count, int) 1717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(EnumDescriptor, value, 1718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const EnumValueDescriptor*) 1719b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumDescriptor, EnumOptions) 1720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, is_placeholder, bool) 1721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, name) 1723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, full_name) 1724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, number, int) 1725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, type, const EnumDescriptor*) 1726a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumValueDescriptor, EnumValueOptions) 1727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, name) 1729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, full_name) 1730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, file, const FileDescriptor*) 1731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, method_count, int) 1732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(ServiceDescriptor, method, 1733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const MethodDescriptor*) 1734b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_OPTIONS_ACCESSOR(ServiceDescriptor, ServiceOptions) 1735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, name) 1737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, full_name) 1738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, service, const ServiceDescriptor*) 1739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, input_type, const Descriptor*) 1740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, output_type, const Descriptor*) 1741b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_OPTIONS_ACCESSOR(MethodDescriptor, MethodOptions) 1742b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, client_streaming, bool) 1743b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, server_streaming, bool) 1744b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, name) 1746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, package) 1747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FileDescriptor, pool, const DescriptorPool*) 1748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FileDescriptor, dependency_count, int) 1749a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, public_dependency_count, int) 1750a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, weak_dependency_count, int) 1751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FileDescriptor, message_type_count, int) 1752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FileDescriptor, enum_type_count, int) 1753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FileDescriptor, service_count, int) 1754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ACCESSOR(FileDescriptor, extension_count, int) 1755b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerPROTOBUF_DEFINE_OPTIONS_ACCESSOR(FileDescriptor, FileOptions) 1756a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, is_placeholder, bool) 1757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, message_type, const Descriptor*) 1759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, enum_type, const EnumDescriptor*) 1760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, service, 1761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const ServiceDescriptor*) 1762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, extension, 1763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor*) 1764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef PROTOBUF_DEFINE_ACCESSOR 1766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef PROTOBUF_DEFINE_STRING_ACCESSOR 1767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef PROTOBUF_DEFINE_ARRAY_ACCESSOR 1768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A few accessors differ from the macros... 1770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1771a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline bool Descriptor::IsExtensionNumber(int number) const { 1772a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return FindExtensionRangeContainingNumber(number) != NULL; 1773a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1774a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline bool Descriptor::IsReservedNumber(int number) const { 1776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return FindReservedRangeContainingNumber(number) != NULL; 1777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1778b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1779b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline bool Descriptor::IsReservedName(const string& name) const { 1780b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < reserved_name_count(); i++) { 1781b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (name == reserved_name(i)) { 1782b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return true; 1783b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1784b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 1785b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return false; 1786b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1787b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1788b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Can't use PROTOBUF_DEFINE_ARRAY_ACCESSOR because reserved_names_ is actually 1789b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// an array of pointers rather than the usual array of objects. 1790b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline const string& Descriptor::reserved_name(int index) const { 1791b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return *reserved_names_[index]; 1792b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1793b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool FieldDescriptor::is_required() const { 1795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return label() == LABEL_REQUIRED; 1796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool FieldDescriptor::is_optional() const { 1799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return label() == LABEL_OPTIONAL; 1800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool FieldDescriptor::is_repeated() const { 1803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return label() == LABEL_REPEATED; 1804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1806d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool FieldDescriptor::is_packable() const { 1807d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return is_repeated() && IsTypePackable(type()); 1808d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 1809d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 1810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// To save space, index() is computed by looking at the descriptor's position 1811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the parent's array of children. 1812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int FieldDescriptor::index() const { 1813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (!is_extension_) { 1814afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson return static_cast<int>(this - containing_type_->fields_); 1815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else if (extension_scope_ != NULL) { 1816afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson return static_cast<int>(this - extension_scope_->extensions_); 1817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1818afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson return static_cast<int>(this - file_->extensions_); 1819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int Descriptor::index() const { 1823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (containing_type_ == NULL) { 1824afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson return static_cast<int>(this - file_->message_types_); 1825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1826afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson return static_cast<int>(this - containing_type_->nested_types_); 1827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1830a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline int OneofDescriptor::index() const { 1831afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson return static_cast<int>(this - containing_type_->oneof_decls_); 1832a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1833a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int EnumDescriptor::index() const { 1835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (containing_type_ == NULL) { 1836afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson return static_cast<int>(this - file_->enum_types_); 1837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 1838afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson return static_cast<int>(this - containing_type_->enum_types_); 1839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int EnumValueDescriptor::index() const { 1843afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson return static_cast<int>(this - type_->values_); 1844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int ServiceDescriptor::index() const { 1847afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson return static_cast<int>(this - file_->services_); 1848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int MethodDescriptor::index() const { 1851afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson return static_cast<int>(this - service_->methods_); 1852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1854a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const char* FieldDescriptor::type_name() const { 1855a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return kTypeToName[type_]; 1856a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1857a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline FieldDescriptor::CppType FieldDescriptor::cpp_type() const { 1859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return kTypeToCppTypeMap[type_]; 1860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1862a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const char* FieldDescriptor::cpp_type_name() const { 1863a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return kCppTypeToName[kTypeToCppTypeMap[type_]]; 1864a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1865a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline FieldDescriptor::CppType FieldDescriptor::TypeToCppType(Type type) { 1867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return kTypeToCppTypeMap[type]; 1868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1870a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const char* FieldDescriptor::TypeName(Type type) { 1871a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return kTypeToName[type]; 1872a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1873a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1874a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const char* FieldDescriptor::CppTypeName(CppType cpp_type) { 1875a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return kCppTypeToName[cpp_type]; 1876a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1877a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1878d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool FieldDescriptor::IsTypePackable(Type field_type) { 1879d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return (field_type != FieldDescriptor::TYPE_STRING && 1880d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field_type != FieldDescriptor::TYPE_GROUP && 1881d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field_type != FieldDescriptor::TYPE_MESSAGE && 1882d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field_type != FieldDescriptor::TYPE_BYTES); 1883d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 1884d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 1885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const FileDescriptor* FileDescriptor::dependency(int index) const { 1886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return dependencies_[index]; 1887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1889a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const FileDescriptor* FileDescriptor::public_dependency( 1890a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int index) const { 1891a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return dependencies_[public_dependencies_[index]]; 1892a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1893a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1894a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const FileDescriptor* FileDescriptor::weak_dependency( 1895a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int index) const { 1896a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return dependencies_[weak_dependencies_[index]]; 1897a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1898a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1899b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline FileDescriptor::Syntax FileDescriptor::syntax() const { 1900b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return syntax_; 1901b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 1902b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 1903a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Can't use PROTOBUF_DEFINE_ARRAY_ACCESSOR because fields_ is actually an array 1904a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// of pointers rather than the usual array of objects. 1905a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline const FieldDescriptor* OneofDescriptor::field(int index) const { 1906a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return fields_[index]; 1907a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 1908a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 1909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 1910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 1912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // GOOGLE_PROTOBUF_DESCRIPTOR_H__ 1913