15a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Protocol Buffers - Google's data interchange format
25a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Copyright 2008 Google Inc.  All rights reserved.
35a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// https://developers.google.com/protocol-buffers/
45a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
55a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Redistribution and use in source and binary forms, with or without
65a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// modification, are permitted provided that the following conditions are
75a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// met:
85a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
95a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Redistributions of source code must retain the above copyright
105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// notice, this list of conditions and the following disclaimer.
115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Redistributions in binary form must reproduce the above
125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// copyright notice, this list of conditions and the following disclaimer
135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// in the documentation and/or other materials provided with the
145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// distribution.
155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Neither the name of Google Inc. nor the names of its
165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// contributors may be used to endorse or promote products derived from
175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// this software without specific prior written permission.
185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Author: kenton@google.com (Kenton Varda)
325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//  Based on original Protocol Buffers design by
335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//  Sanjay Ghemawat, Jeff Dean, and others.
345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This file contains classes which describe a type of protocol message.
365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// You can use a message's descriptor to learn at runtime what fields
375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// it contains and what the types of those fields are.  The Message
385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// interface also allows you to dynamically access and modify individual
395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// fields by passing the FieldDescriptor of the field you are interested
405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// in.
415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Most users will not care about descriptors, because they will write
435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// code specific to certain protocol types and will simply use the classes
445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// generated by the protocol compiler directly.  Advanced users who want
455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// to operate on arbitrary types (not known at compile time) may want to
465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// read descriptors in order to learn about the contents of a message.
475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// A very small number of users will want to construct their own
485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Descriptors, either because they are implementing Message manually or
495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// because they are writing something like the protocol compiler.
505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// For an example of how you might use descriptors, see the code example
525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// at the top of message.h.
535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#ifndef GOOGLE_PROTOBUF_DESCRIPTOR_H__
555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define GOOGLE_PROTOBUF_DESCRIPTOR_H__
565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <memory>
585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#ifndef _SHARED_PTR_H
595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/stubs/shared_ptr.h>
605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif
615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <set>
625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <string>
635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <vector>
645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/stubs/common.h>
655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/stubs/scoped_ptr.h>
665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// TYPE_BOOL is defined in the MacOS's ConditionalMacros.h.
685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#ifdef TYPE_BOOL
695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#undef TYPE_BOOL
705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif  // TYPE_BOOL
715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace google {
735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace protobuf {
745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Defined in this file.
765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass Descriptor;
775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass FieldDescriptor;
785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass OneofDescriptor;
795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass EnumDescriptor;
805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass EnumValueDescriptor;
815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass ServiceDescriptor;
825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass MethodDescriptor;
835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass FileDescriptor;
845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass DescriptorDatabase;
855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass DescriptorPool;
865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Defined in descriptor.proto
885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass DescriptorProto;
895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass FieldDescriptorProto;
905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass OneofDescriptorProto;
915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass EnumDescriptorProto;
925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass EnumValueDescriptorProto;
935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass ServiceDescriptorProto;
945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass MethodDescriptorProto;
955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass FileDescriptorProto;
965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass MessageOptions;
975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass FieldOptions;
985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass EnumOptions;
995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass EnumValueOptions;
1005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass ServiceOptions;
1015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass MethodOptions;
1025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass FileOptions;
1035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass UninterpretedOption;
1045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass SourceCodeInfo;
1055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Defined in message.h
1075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass Message;
1085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Defined in descriptor.cc
1105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass DescriptorBuilder;
1115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass FileDescriptorTables;
1125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Defined in unknown_field_set.h.
1145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass UnknownField;
1155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Defined in generated_message_reflection.h.
1175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace internal {
1185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass GeneratedMessageReflection;
1195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace internal
1205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Defined in command_line_interface.cc
1225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace compiler {
1235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass CommandLineInterface;
1245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace compiler
1255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace descriptor_unittest {
1275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass DescriptorTest;
1285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace descriptor_unittest
1295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Defined in printer.h
1315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace io {
1325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass Printer;
1335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace io
1345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// NB, all indices are zero-based.
1365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotstruct SourceLocation {
1375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int start_line;
1385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int end_line;
1395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int start_column;
1405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int end_column;
1415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Doc comments found at the source location.
1435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See the comments in SourceCodeInfo.Location (descriptor.proto) for details.
1445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string leading_comments;
1455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string trailing_comments;
1465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  vector<string> leading_detached_comments;
1475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
1485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Options when generating machine-parsable output from a descriptor with
1505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// DebugString().
1515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotstruct DebugStringOptions {
1525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // include original user comments as recorded in SourceLocation entries. N.B.
1535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // that this must be |false| by default: several other pieces of code (for
1545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // example, the C++ code generation for fields in the proto compiler) rely on
1555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // DebugString() output being unobstructed by user comments.
1565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool include_comments;
1575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // If true, elide the braced body in the debug string.
1585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool elide_group_body;
1595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool elide_oneof_body;
1605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  DebugStringOptions()
1625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      : include_comments(false),
1635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        elide_group_body(false),
1645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        elide_oneof_body(false) {}
1655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
1665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Describes a type of protocol message, or a particular group within a
1685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// message.  To obtain the Descriptor for a given message object, call
1695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Message::GetDescriptor().  Generated message classes also have a
1705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// static method called descriptor() which returns the type's descriptor.
1715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Use DescriptorPool to construct your own descriptors.
1725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT Descriptor {
1735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
1745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The name of the message type, not including its scope.
1755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& name() const;
1765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The fully-qualified name of the message type, scope delimited by
1785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // periods.  For example, message type "Foo" which is declared in package
1795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // "bar" has full name "bar.Foo".  If a type "Baz" is nested within
1805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Foo, Baz's full_name is "bar.Foo.Baz".  To get only the part that
1815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // comes after the last '.', use name().
1825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& full_name() const;
1835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Index of this descriptor within the file or containing type's message
1855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // type array.
1865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int index() const;
1875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The .proto file in which this message type was defined.  Never NULL.
1895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* file() const;
1905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // If this Descriptor describes a nested type, this returns the type
1925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // in which it is nested.  Otherwise, returns NULL.
1935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* containing_type() const;
1945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get options for this message type.  These are specified in the .proto file
1965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // by placing lines like "option foo = 1234;" in the message definition.
1975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Allowed options are defined by MessageOptions in
1985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // google/protobuf/descriptor.proto, and any available extensions of that
1995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // message.
2005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const MessageOptions& options() const;
2015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Write the contents of this Descriptor into the given DescriptorProto.
2035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The target DescriptorProto must be clear before calling this; if it
2045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // isn't, the result may be garbage.
2055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyTo(DescriptorProto* proto) const;
2065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Write the contents of this decriptor in a human-readable form. Output
2085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // will be suitable for re-parsing.
2095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugString() const;
2105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Similar to DebugString(), but additionally takes options (e.g.,
2125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // include original user comments in output).
2135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugStringWithOptions(const DebugStringOptions& options) const;
2145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns true if this is a placeholder for an unknown type. This will
2165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // only be the case if this descriptor comes from a DescriptorPool
2175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // with AllowUnknownDependencies() set.
2185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_placeholder() const;
2195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Field stuff -----------------------------------------------------
2215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of fields in this message type.
2235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int field_count() const;
2245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets a field by index, where 0 <= index < field_count().
2255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
2265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* field(int index) const;
2275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Looks up a field by declared tag number.  Returns NULL if no such field
2295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // exists.
2305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* FindFieldByNumber(int number) const;
2315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Looks up a field by name.  Returns NULL if no such field exists.
2325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* FindFieldByName(const string& name) const;
2335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Looks up a field by lowercased name (as returned by lowercase_name()).
2355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // This lookup may be ambiguous if multiple field names differ only by case,
2365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // in which case the field returned is chosen arbitrarily from the matches.
2375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* FindFieldByLowercaseName(
2385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const string& lowercase_name) const;
2395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Looks up a field by camel-case name (as returned by camelcase_name()).
2415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // This lookup may be ambiguous if multiple field names differ in a way that
2425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // leads them to have identical camel-case names, in which case the field
2435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // returned is chosen arbitrarily from the matches.
2445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* FindFieldByCamelcaseName(
2455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const string& camelcase_name) const;
2465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of oneofs in this message type.
2485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int oneof_decl_count() const;
2495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get a oneof by index, where 0 <= index < oneof_decl_count().
2505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
2515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const OneofDescriptor* oneof_decl(int index) const;
2525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Looks up a oneof by name.  Returns NULL if no such oneof exists.
2545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const OneofDescriptor* FindOneofByName(const string& name) const;
2555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Nested type stuff -----------------------------------------------
2575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of nested types in this message type.
2595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int nested_type_count() const;
2605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets a nested type by index, where 0 <= index < nested_type_count().
2615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
2625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* nested_type(int index) const;
2635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Looks up a nested type by name.  Returns NULL if no such nested type
2655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // exists.
2665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* FindNestedTypeByName(const string& name) const;
2675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Enum stuff ------------------------------------------------------
2695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of enum types in this message type.
2715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int enum_type_count() const;
2725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets an enum type by index, where 0 <= index < enum_type_count().
2735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
2745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumDescriptor* enum_type(int index) const;
2755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Looks up an enum type by name.  Returns NULL if no such enum type exists.
2775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumDescriptor* FindEnumTypeByName(const string& name) const;
2785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Looks up an enum value by name, among all enum types in this message.
2805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns NULL if no such value exists.
2815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumValueDescriptor* FindEnumValueByName(const string& name) const;
2825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Extensions ------------------------------------------------------
2845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // A range of field numbers which are designated for third-party
2865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extensions.
2875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  struct ExtensionRange {
2885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int start;  // inclusive
2895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int end;    // exclusive
2905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
2915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of extension ranges in this message type.
2935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int extension_range_count() const;
2945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets an extension range by index, where 0 <= index <
2955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extension_range_count(). These are returned in the order they were defined
2965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // in the .proto file.
2975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const ExtensionRange* extension_range(int index) const;
2985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns true if the number is in one of the extension ranges.
3005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool IsExtensionNumber(int number) const;
3015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns NULL if no extension range contains the given number.
3035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const ExtensionRange* FindExtensionRangeContainingNumber(int number) const;
3045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of extensions -- extending *other* messages -- that were
3065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // defined nested within this message type's scope.
3075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int extension_count() const;
3085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get an extension by index, where 0 <= index < extension_count().
3095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
3105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* extension(int index) const;
3115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Looks up a named extension (which extends some *other* message type)
3135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // defined within this message type's scope.
3145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* FindExtensionByName(const string& name) const;
3155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Similar to FindFieldByLowercaseName(), but finds extensions defined within
3175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // this message type's scope.
3185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const;
3195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Similar to FindFieldByCamelcaseName(), but finds extensions defined within
3215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // this message type's scope.
3225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const;
3235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Reserved fields -------------------------------------------------
3255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // A range of reserved field numbers.
3275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  struct ReservedRange {
3285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int start;  // inclusive
3295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int end;    // exclusive
3305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
3315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of reserved ranges in this message type.
3335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int reserved_range_count() const;
3345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets an reserved range by index, where 0 <= index <
3355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // reserved_range_count(). These are returned in the order they were defined
3365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // in the .proto file.
3375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const ReservedRange* reserved_range(int index) const;
3385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns true if the number is in one of the reserved ranges.
3405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool IsReservedNumber(int number) const;
3415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns NULL if no reserved range contains the given number.
3435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const ReservedRange* FindReservedRangeContainingNumber(int number) const;
3445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of reserved field names in this message type.
3465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int reserved_name_count() const;
3475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets a reserved name by index, where 0 <= index < reserved_name_count().
3495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& reserved_name(int index) const;
3505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns true if the field name is reserved.
3525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool IsReservedName(const string& name) const;
3535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Source Location ---------------------------------------------------
3555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Updates |*out_location| to the source location of the complete
3575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extent of this message declaration.  Returns false and leaves
3585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // |*out_location| unchanged iff location information was not available.
3595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool GetSourceLocation(SourceLocation* out_location) const;
3605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
3625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef MessageOptions OptionsType;
3635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Allows tests to test CopyTo(proto, true).
3655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class ::google::protobuf::descriptor_unittest::DescriptorTest;
3665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Allows access to GetLocationPath for annotations.
3685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class ::google::protobuf::io::Printer;
3695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Fill the json_name field of FieldDescriptorProto.
3715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyJsonNameTo(DescriptorProto* proto) const;
3725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Internal version of DebugString; controls the level of indenting for
3745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // correct depth. Takes |options| to control debug-string options, and
3755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // |include_opening_clause| to indicate whether the "message ... " part of the
3765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // clause has already been generated (this varies depending on context).
3775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void DebugString(int depth, string *contents,
3785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                   const DebugStringOptions& options,
3795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                   bool include_opening_clause) const;
3805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Walks up the descriptor tree to generate the source location path
3825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // to this descriptor from the file root.
3835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void GetLocationPath(std::vector<int>* output) const;
3845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* name_;
3865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* full_name_;
3875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* file_;
3885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* containing_type_;
3895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const MessageOptions* options_;
3905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // True if this is a placeholder for an unknown type.
3925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_placeholder_;
3935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // True if this is a placeholder and the type name wasn't fully-qualified.
3945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_unqualified_placeholder_;
3955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int field_count_;
3975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  FieldDescriptor* fields_;
3985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int oneof_decl_count_;
3995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  OneofDescriptor* oneof_decls_;
4005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int nested_type_count_;
4015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  Descriptor* nested_types_;
4025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int enum_type_count_;
4035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  EnumDescriptor* enum_types_;
4045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int extension_range_count_;
4055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  ExtensionRange* extension_ranges_;
4065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int extension_count_;
4075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  FieldDescriptor* extensions_;
4085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int reserved_range_count_;
4095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  ReservedRange* reserved_ranges_;
4105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int reserved_name_count_;
4115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string** reserved_names_;
4125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // IMPORTANT:  If you add a new field, make sure to search for all instances
4135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // of Allocate<Descriptor>() and AllocateArray<Descriptor>() in descriptor.cc
4145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // and update them to initialize the field.
4155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Must be constructed using DescriptorPool.
4175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  Descriptor() {}
4185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class DescriptorBuilder;
4195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class EnumDescriptor;
4205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class FieldDescriptor;
4215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class OneofDescriptor;
4225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class MethodDescriptor;
4235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class FileDescriptor;
4245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Descriptor);
4255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
4265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Describes a single field of a message.  To get the descriptor for a given
4285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// field, first get the Descriptor for the message in which it is defined,
4295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// then call Descriptor::FindFieldByName().  To get a FieldDescriptor for
4305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// an extension, do one of the following:
4315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// - Get the Descriptor or FileDescriptor for its containing scope, then
4325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   call Descriptor::FindExtensionByName() or
4335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   FileDescriptor::FindExtensionByName().
4345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// - Given a DescriptorPool, call DescriptorPool::FindExtensionByNumber().
4355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// - Given a Reflection for a message object, call
4365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   Reflection::FindKnownExtensionByName() or
4375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   Reflection::FindKnownExtensionByNumber().
4385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Use DescriptorPool to construct your own descriptors.
4395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT FieldDescriptor {
4405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
4415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Identifies a field type.  0 is reserved for errors.  The order is weird
4425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // for historical reasons.  Types 12 and up are new in proto2.
4435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  enum Type {
4445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_DOUBLE         = 1,   // double, exactly eight bytes on the wire.
4455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_FLOAT          = 2,   // float, exactly four bytes on the wire.
4465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_INT64          = 3,   // int64, varint on the wire.  Negative numbers
4475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                               // take 10 bytes.  Use TYPE_SINT64 if negative
4485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                               // values are likely.
4495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_UINT64         = 4,   // uint64, varint on the wire.
4505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_INT32          = 5,   // int32, varint on the wire.  Negative numbers
4515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                               // take 10 bytes.  Use TYPE_SINT32 if negative
4525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                               // values are likely.
4535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_FIXED64        = 6,   // uint64, exactly eight bytes on the wire.
4545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_FIXED32        = 7,   // uint32, exactly four bytes on the wire.
4555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_BOOL           = 8,   // bool, varint on the wire.
4565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_STRING         = 9,   // UTF-8 text.
4575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_GROUP          = 10,  // Tag-delimited message.  Deprecated.
4585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_MESSAGE        = 11,  // Length-delimited message.
4595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_BYTES          = 12,  // Arbitrary byte array.
4615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_UINT32         = 13,  // uint32, varint on the wire
4625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_ENUM           = 14,  // Enum, varint on the wire
4635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_SFIXED32       = 15,  // int32, exactly four bytes on the wire
4645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_SFIXED64       = 16,  // int64, exactly eight bytes on the wire
4655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_SINT32         = 17,  // int32, ZigZag-encoded varint on the wire
4665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    TYPE_SINT64         = 18,  // int64, ZigZag-encoded varint on the wire
4675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    MAX_TYPE            = 18,  // Constant useful for defining lookup tables
4695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                               // indexed by Type.
4705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
4715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Specifies the C++ data type used to represent the field.  There is a
4735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // fixed mapping from Type to CppType where each Type maps to exactly one
4745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // CppType.  0 is reserved for errors.
4755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  enum CppType {
4765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    CPPTYPE_INT32       = 1,     // TYPE_INT32, TYPE_SINT32, TYPE_SFIXED32
4775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    CPPTYPE_INT64       = 2,     // TYPE_INT64, TYPE_SINT64, TYPE_SFIXED64
4785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    CPPTYPE_UINT32      = 3,     // TYPE_UINT32, TYPE_FIXED32
4795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    CPPTYPE_UINT64      = 4,     // TYPE_UINT64, TYPE_FIXED64
4805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    CPPTYPE_DOUBLE      = 5,     // TYPE_DOUBLE
4815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    CPPTYPE_FLOAT       = 6,     // TYPE_FLOAT
4825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    CPPTYPE_BOOL        = 7,     // TYPE_BOOL
4835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    CPPTYPE_ENUM        = 8,     // TYPE_ENUM
4845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    CPPTYPE_STRING      = 9,     // TYPE_STRING, TYPE_BYTES
4855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    CPPTYPE_MESSAGE     = 10,    // TYPE_MESSAGE, TYPE_GROUP
4865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    MAX_CPPTYPE         = 10,    // Constant useful for defining lookup tables
4885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                 // indexed by CppType.
4895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
4905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Identifies whether the field is optional, required, or repeated.  0 is
4925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // reserved for errors.
4935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  enum Label {
4945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    LABEL_OPTIONAL      = 1,    // optional
4955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    LABEL_REQUIRED      = 2,    // required
4965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    LABEL_REPEATED      = 3,    // repeated
4975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    MAX_LABEL           = 3,    // Constant useful for defining lookup tables
4995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                // indexed by Label.
5005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
5015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Valid field numbers are positive integers up to kMaxNumber.
5035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const int kMaxNumber = (1 << 29) - 1;
5045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // First field number reserved for the protocol buffer library implementation.
5065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Users may not declare fields that use reserved numbers.
5075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const int kFirstReservedNumber = 19000;
5085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Last field number reserved for the protocol buffer library implementation.
5095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Users may not declare fields that use reserved numbers.
5105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const int kLastReservedNumber  = 19999;
5115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& name() const;        // Name of this field within the message.
5135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& full_name() const;   // Fully-qualified name of the field.
5145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& json_name() const;   // JSON name of this field.
5155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* file() const;// File in which this field was defined.
5165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_extension() const;         // Is this an extension field?
5175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int number() const;                // Declared tag number.
5185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Same as name() except converted to lower-case.  This (and especially the
5205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // FindFieldByLowercaseName() method) can be useful when parsing formats
5215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // which prefer to use lowercase naming style.  (Although, technically
5225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // field names should be lowercased anyway according to the protobuf style
5235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // guide, so this only makes a difference when dealing with old .proto files
5245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // which do not follow the guide.)
5255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& lowercase_name() const;
5265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Same as name() except converted to camel-case.  In this conversion, any
5285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // time an underscore appears in the name, it is removed and the next
5295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // letter is capitalized.  Furthermore, the first letter of the name is
5305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // lower-cased.  Examples:
5315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   FooBar -> fooBar
5325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   foo_bar -> fooBar
5335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   fooBar -> fooBar
5345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // This (and especially the FindFieldByCamelcaseName() method) can be useful
5355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // when parsing formats which prefer to use camel-case naming style.
5365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& camelcase_name() const;
5375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  Type type() const;                  // Declared type of this field.
5395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const char* type_name() const;      // Name of the declared type.
5405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  CppType cpp_type() const;           // C++ type of this field.
5415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const char* cpp_type_name() const;  // Name of the C++ type.
5425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  Label label() const;                // optional/required/repeated
5435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_required() const;      // shorthand for label() == LABEL_REQUIRED
5455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_optional() const;      // shorthand for label() == LABEL_OPTIONAL
5465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_repeated() const;      // shorthand for label() == LABEL_REPEATED
5475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_packable() const;      // shorthand for is_repeated() &&
5485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                 //               IsTypePackable(type())
5495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_packed() const;        // shorthand for is_packable() &&
5505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                 //               options().packed()
5515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_map() const;           // shorthand for type() == TYPE_MESSAGE &&
5525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                 // message_type()->options().map_entry()
5535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Index of this field within the message's field array, or the file or
5555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extension scope's extensions array.
5565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int index() const;
5575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Does this field have an explicitly-declared default value?
5595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool has_default_value() const;
5605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get the field default value if cpp_type() == CPPTYPE_INT32.  If no
5625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // explicit default was defined, the default is 0.
5635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int32 default_value_int32() const;
5645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get the field default value if cpp_type() == CPPTYPE_INT64.  If no
5655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // explicit default was defined, the default is 0.
5665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int64 default_value_int64() const;
5675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get the field default value if cpp_type() == CPPTYPE_UINT32.  If no
5685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // explicit default was defined, the default is 0.
5695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  uint32 default_value_uint32() const;
5705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get the field default value if cpp_type() == CPPTYPE_UINT64.  If no
5715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // explicit default was defined, the default is 0.
5725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  uint64 default_value_uint64() const;
5735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get the field default value if cpp_type() == CPPTYPE_FLOAT.  If no
5745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // explicit default was defined, the default is 0.0.
5755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  float default_value_float() const;
5765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get the field default value if cpp_type() == CPPTYPE_DOUBLE.  If no
5775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // explicit default was defined, the default is 0.0.
5785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  double default_value_double() const;
5795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get the field default value if cpp_type() == CPPTYPE_BOOL.  If no
5805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // explicit default was defined, the default is false.
5815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool default_value_bool() const;
5825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get the field default value if cpp_type() == CPPTYPE_ENUM.  If no
5835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // explicit default was defined, the default is the first value defined
5845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // in the enum type (all enum types are required to have at least one value).
5855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // This never returns NULL.
5865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumValueDescriptor* default_value_enum() const;
5875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get the field default value if cpp_type() == CPPTYPE_STRING.  If no
5885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // explicit default was defined, the default is the empty string.
5895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& default_value_string() const;
5905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The Descriptor for the message of which this is a field.  For extensions,
5925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // this is the extended type.  Never NULL.
5935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* containing_type() const;
5945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // If the field is a member of a oneof, this is the one, otherwise this is
5965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // NULL.
5975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const OneofDescriptor* containing_oneof() const;
5985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // If the field is a member of a oneof, returns the index in that oneof.
6005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int index_in_oneof() const;
6015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // An extension may be declared within the scope of another message.  If this
6035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // field is an extension (is_extension() is true), then extension_scope()
6045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // returns that message, or NULL if the extension was declared at global
6055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // scope.  If this is not an extension, extension_scope() is undefined (may
6065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // assert-fail).
6075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* extension_scope() const;
6085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // If type is TYPE_MESSAGE or TYPE_GROUP, returns a descriptor for the
6105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // message or the group type.  Otherwise, returns null.
6115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* message_type() const;
6125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // If type is TYPE_ENUM, returns a descriptor for the enum.  Otherwise,
6135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // returns null.
6145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumDescriptor* enum_type() const;
6155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get the FieldOptions for this field.  This includes things listed in
6175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // square brackets after the field definition.  E.g., the field:
6185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   optional string text = 1 [ctype=CORD];
6195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // has the "ctype" option set.  Allowed options are defined by FieldOptions
6205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // in google/protobuf/descriptor.proto, and any available extensions of that
6215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // message.
6225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldOptions& options() const;
6235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::CopyTo().
6255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyTo(FieldDescriptorProto* proto) const;
6265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugString().
6285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugString() const;
6295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugStringWithOptions().
6315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugStringWithOptions(const DebugStringOptions& options) const;
6325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Helper method to get the CppType for a particular Type.
6345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static CppType TypeToCppType(Type type);
6355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Helper method to get the name of a Type.
6375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const char* TypeName(Type type);
6385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Helper method to get the name of a CppType.
6405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const char* CppTypeName(CppType cpp_type);
6415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Return true iff [packed = true] is valid for fields of this type.
6435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static inline bool IsTypePackable(Type field_type);
6445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Source Location ---------------------------------------------------
6465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Updates |*out_location| to the source location of the complete
6485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extent of this field declaration.  Returns false and leaves
6495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // |*out_location| unchanged iff location information was not available.
6505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool GetSourceLocation(SourceLocation* out_location) const;
6515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
6535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef FieldOptions OptionsType;
6545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Allows access to GetLocationPath for annotations.
6565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class ::google::protobuf::io::Printer;
6575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Fill the json_name field of FieldDescriptorProto.
6595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyJsonNameTo(FieldDescriptorProto* proto) const;
6605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugString().
6625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  enum PrintLabelFlag { PRINT_LABEL, OMIT_LABEL };
6635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void DebugString(int depth, PrintLabelFlag print_label_flag,
6645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                   string* contents, const DebugStringOptions& options) const;
6655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // formats the default value appropriately and returns it as a string.
6675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Must have a default value to call this. If quote_string_type is true, then
6685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // types of CPPTYPE_STRING whill be surrounded by quotes and CEscaped.
6695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DefaultValueAsString(bool quote_string_type) const;
6705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Helper function that returns the field type name for DebugString.
6725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string FieldTypeNameDebugString() const;
6735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Walks up the descriptor tree to generate the source location path
6755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // to this descriptor from the file root.
6765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void GetLocationPath(std::vector<int>* output) const;
6775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* name_;
6795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* full_name_;
6805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* lowercase_name_;
6815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* camelcase_name_;
6825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Whether the user has specified the json_name field option in the .proto
6835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // file.
6845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool has_json_name_;
6855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // If has_json_name_ is true, it's the value specified by the user.
6865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Otherwise, it has the same value as lowercase_name_.
6875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* json_name_;
6885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* file_;
6895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int number_;
6905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  Type type_;
6915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  Label label_;
6925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_extension_;
6935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int index_in_oneof_;
6945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* containing_type_;
6955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const OneofDescriptor* containing_oneof_;
6965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* extension_scope_;
6975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* message_type_;
6985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumDescriptor* enum_type_;
6995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldOptions* options_;
7005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // IMPORTANT:  If you add a new field, make sure to search for all instances
7015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // of Allocate<FieldDescriptor>() and AllocateArray<FieldDescriptor>() in
7025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // descriptor.cc and update them to initialize the field.
7035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool has_default_value_;
7055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  union {
7065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int32  default_value_int32_;
7075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int64  default_value_int64_;
7085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    uint32 default_value_uint32_;
7095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    uint64 default_value_uint64_;
7105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    float  default_value_float_;
7115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    double default_value_double_;
7125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    bool   default_value_bool_;
7135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    const EnumValueDescriptor* default_value_enum_;
7155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    const string* default_value_string_;
7165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
7175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const CppType kTypeToCppTypeMap[MAX_TYPE + 1];
7195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const char * const kTypeToName[MAX_TYPE + 1];
7215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const char * const kCppTypeToName[MAX_CPPTYPE + 1];
7235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const char * const kLabelToName[MAX_LABEL + 1];
7255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Must be constructed using DescriptorPool.
7275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  FieldDescriptor() {}
7285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class DescriptorBuilder;
7295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class FileDescriptor;
7305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class Descriptor;
7315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class OneofDescriptor;
7325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldDescriptor);
7335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
7345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Describes a oneof defined in a message type.
7365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT OneofDescriptor {
7375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
7385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& name() const;       // Name of this oneof.
7395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& full_name() const;  // Fully-qualified name of the oneof.
7405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Index of this oneof within the message's oneof array.
7425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int index() const;
7435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The Descriptor for the message containing this oneof.
7455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* containing_type() const;
7465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of (non-extension) fields which are members of this oneof.
7485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int field_count() const;
7495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get a member of this oneof, in the order in which they were declared in the
7505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // .proto file.  Does not include extensions.
7515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* field(int index) const;
7525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::CopyTo().
7545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyTo(OneofDescriptorProto* proto) const;
7555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugString().
7575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugString() const;
7585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugStringWithOptions().
7605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugStringWithOptions(const DebugStringOptions& options) const;
7615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Source Location ---------------------------------------------------
7635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Updates |*out_location| to the source location of the complete
7655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extent of this oneof declaration.  Returns false and leaves
7665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // |*out_location| unchanged iff location information was not available.
7675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool GetSourceLocation(SourceLocation* out_location) const;
7685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
7705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Allows access to GetLocationPath for annotations.
7715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class ::google::protobuf::io::Printer;
7725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugString().
7745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void DebugString(int depth, string* contents,
7755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                   const DebugStringOptions& options) const;
7765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Walks up the descriptor tree to generate the source location path
7785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // to this descriptor from the file root.
7795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void GetLocationPath(std::vector<int>* output) const;
7805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* name_;
7825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* full_name_;
7835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* containing_type_;
7845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_extendable_;
7855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int field_count_;
7865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor** fields_;
7875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // IMPORTANT:  If you add a new field, make sure to search for all instances
7885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // of Allocate<OneofDescriptor>() and AllocateArray<OneofDescriptor>()
7895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // in descriptor.cc and update them to initialize the field.
7905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Must be constructed using DescriptorPool.
7925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  OneofDescriptor() {}
7935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class DescriptorBuilder;
7945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class Descriptor;
7955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OneofDescriptor);
7965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
7975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
7985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Describes an enum type defined in a .proto file.  To get the EnumDescriptor
7995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// for a generated enum type, call TypeName_descriptor().  Use DescriptorPool
8005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// to construct your own descriptors.
8015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT EnumDescriptor {
8025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
8035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The name of this enum type in the containing scope.
8045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& name() const;
8055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The fully-qualified name of the enum type, scope delimited by periods.
8075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& full_name() const;
8085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Index of this enum within the file or containing message's enum array.
8105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int index() const;
8115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The .proto file in which this enum type was defined.  Never NULL.
8135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* file() const;
8145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of values for this EnumDescriptor.  Guaranteed to be greater
8165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // than zero.
8175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int value_count() const;
8185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets a value by index, where 0 <= index < value_count().
8195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
8205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumValueDescriptor* value(int index) const;
8215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Looks up a value by name.  Returns NULL if no such value exists.
8235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumValueDescriptor* FindValueByName(const string& name) const;
8245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Looks up a value by number.  Returns NULL if no such value exists.  If
8255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // multiple values have this number, the first one defined is returned.
8265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumValueDescriptor* FindValueByNumber(int number) const;
8275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // If this enum type is nested in a message type, this is that message type.
8295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Otherwise, NULL.
8305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* containing_type() const;
8315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get options for this enum type.  These are specified in the .proto file by
8335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // placing lines like "option foo = 1234;" in the enum definition.  Allowed
8345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // options are defined by EnumOptions in google/protobuf/descriptor.proto,
8355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // and any available extensions of that message.
8365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumOptions& options() const;
8375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::CopyTo().
8395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyTo(EnumDescriptorProto* proto) const;
8405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugString().
8425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugString() const;
8435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugStringWithOptions().
8455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugStringWithOptions(const DebugStringOptions& options) const;
8465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns true if this is a placeholder for an unknown enum. This will
8495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // only be the case if this descriptor comes from a DescriptorPool
8505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // with AllowUnknownDependencies() set.
8515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_placeholder() const;
8525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Source Location ---------------------------------------------------
8545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Updates |*out_location| to the source location of the complete
8565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extent of this enum declaration.  Returns false and leaves
8575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // |*out_location| unchanged iff location information was not available.
8585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool GetSourceLocation(SourceLocation* out_location) const;
8595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
8615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef EnumOptions OptionsType;
8625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Allows access to GetLocationPath for annotations.
8645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class ::google::protobuf::io::Printer;
8655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Looks up a value by number.  If the value does not exist, dynamically
8675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // creates a new EnumValueDescriptor for that value, assuming that it was
8685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // unknown. If a new descriptor is created, this is done in a thread-safe way,
8695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // and future calls will return the same value descriptor pointer.
8705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //
8715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // This is private but is used by GeneratedMessageReflection (which is
8725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // friended below) to return a valid EnumValueDescriptor from GetEnum() when
8735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // this feature is enabled.
8745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumValueDescriptor*
8755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      FindValueByNumberCreatingIfUnknown(int number) const;
8765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugString().
8795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void DebugString(int depth, string *contents,
8805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                   const DebugStringOptions& options) const;
8815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Walks up the descriptor tree to generate the source location path
8835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // to this descriptor from the file root.
8845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void GetLocationPath(std::vector<int>* output) const;
8855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* name_;
8875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* full_name_;
8885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* file_;
8895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* containing_type_;
8905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumOptions* options_;
8915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // True if this is a placeholder for an unknown type.
8935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_placeholder_;
8945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // True if this is a placeholder and the type name wasn't fully-qualified.
8955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_unqualified_placeholder_;
8965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
8975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int value_count_;
8985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  EnumValueDescriptor* values_;
8995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // IMPORTANT:  If you add a new field, make sure to search for all instances
9005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // of Allocate<EnumDescriptor>() and AllocateArray<EnumDescriptor>() in
9015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // descriptor.cc and update them to initialize the field.
9025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Must be constructed using DescriptorPool.
9045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  EnumDescriptor() {}
9055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class DescriptorBuilder;
9065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class Descriptor;
9075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class FieldDescriptor;
9085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class EnumValueDescriptor;
9095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class FileDescriptor;
9105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class internal::GeneratedMessageReflection;
9115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumDescriptor);
9125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
9135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Describes an individual enum constant of a particular type.  To get the
9155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// EnumValueDescriptor for a given enum value, first get the EnumDescriptor
9165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// for its type, then use EnumDescriptor::FindValueByName() or
9175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// EnumDescriptor::FindValueByNumber().  Use DescriptorPool to construct
9185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// your own descriptors.
9195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT EnumValueDescriptor {
9205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
9215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& name() const;  // Name of this enum constant.
9225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int index() const;           // Index within the enums's Descriptor.
9235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int number() const;          // Numeric value of this enum constant.
9245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The full_name of an enum value is a sibling symbol of the enum type.
9265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // e.g. the full name of FieldDescriptorProto::TYPE_INT32 is actually
9275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // "google.protobuf.FieldDescriptorProto.TYPE_INT32", NOT
9285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // "google.protobuf.FieldDescriptorProto.Type.TYPE_INT32".  This is to conform
9295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // with C++ scoping rules for enums.
9305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& full_name() const;
9315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The type of this value.  Never NULL.
9335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumDescriptor* type() const;
9345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get options for this enum value.  These are specified in the .proto file
9365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // by adding text like "[foo = 1234]" after an enum value definition.
9375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Allowed options are defined by EnumValueOptions in
9385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // google/protobuf/descriptor.proto, and any available extensions of that
9395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // message.
9405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumValueOptions& options() const;
9415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::CopyTo().
9435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyTo(EnumValueDescriptorProto* proto) const;
9445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugString().
9465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugString() const;
9475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugStringWithOptions().
9495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugStringWithOptions(const DebugStringOptions& options) const;
9505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Source Location ---------------------------------------------------
9535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Updates |*out_location| to the source location of the complete
9555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extent of this enum value declaration.  Returns false and leaves
9565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // |*out_location| unchanged iff location information was not available.
9575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool GetSourceLocation(SourceLocation* out_location) const;
9585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
9605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef EnumValueOptions OptionsType;
9615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Allows access to GetLocationPath for annotations.
9635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class ::google::protobuf::io::Printer;
9645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugString().
9665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void DebugString(int depth, string *contents,
9675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                   const DebugStringOptions& options) const;
9685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Walks up the descriptor tree to generate the source location path
9705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // to this descriptor from the file root.
9715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void GetLocationPath(std::vector<int>* output) const;
9725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* name_;
9745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* full_name_;
9755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int number_;
9765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumDescriptor* type_;
9775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumValueOptions* options_;
9785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // IMPORTANT:  If you add a new field, make sure to search for all instances
9795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // of Allocate<EnumValueDescriptor>() and AllocateArray<EnumValueDescriptor>()
9805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // in descriptor.cc and update them to initialize the field.
9815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Must be constructed using DescriptorPool.
9835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  EnumValueDescriptor() {}
9845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class DescriptorBuilder;
9855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class EnumDescriptor;
9865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class FileDescriptorTables;
9875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumValueDescriptor);
9885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
9895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
9905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Describes an RPC service.  To get the ServiceDescriptor for a service,
9915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// call Service::GetDescriptor().  Generated service classes also have a
9925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// static method called descriptor() which returns the type's
9935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ServiceDescriptor.  Use DescriptorPool to construct your own descriptors.
9945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT ServiceDescriptor {
9955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
9965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The name of the service, not including its containing scope.
9975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& name() const;
9985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The fully-qualified name of the service, scope delimited by periods.
9995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& full_name() const;
10005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Index of this service within the file's services array.
10015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int index() const;
10025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The .proto file in which this service was defined.  Never NULL.
10045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* file() const;
10055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get options for this service type.  These are specified in the .proto file
10075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // by placing lines like "option foo = 1234;" in the service definition.
10085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Allowed options are defined by ServiceOptions in
10095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // google/protobuf/descriptor.proto, and any available extensions of that
10105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // message.
10115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const ServiceOptions& options() const;
10125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of methods this service defines.
10145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int method_count() const;
10155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets a MethodDescriptor by index, where 0 <= index < method_count().
10165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
10175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const MethodDescriptor* method(int index) const;
10185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Look up a MethodDescriptor by name.
10205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const MethodDescriptor* FindMethodByName(const string& name) const;
10215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::CopyTo().
10225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyTo(ServiceDescriptorProto* proto) const;
10235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugString().
10255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugString() const;
10265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugStringWithOptions().
10285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugStringWithOptions(const DebugStringOptions& options) const;
10295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Source Location ---------------------------------------------------
10325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Updates |*out_location| to the source location of the complete
10345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extent of this service declaration.  Returns false and leaves
10355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // |*out_location| unchanged iff location information was not available.
10365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool GetSourceLocation(SourceLocation* out_location) const;
10375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
10395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef ServiceOptions OptionsType;
10405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Allows access to GetLocationPath for annotations.
10425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class ::google::protobuf::io::Printer;
10435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugString().
10455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void DebugString(string *contents, const DebugStringOptions& options) const;
10465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Walks up the descriptor tree to generate the source location path
10485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // to this descriptor from the file root.
10495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void GetLocationPath(std::vector<int>* output) const;
10505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* name_;
10525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* full_name_;
10535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* file_;
10545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const ServiceOptions* options_;
10555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int method_count_;
10565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MethodDescriptor* methods_;
10575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // IMPORTANT:  If you add a new field, make sure to search for all instances
10585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // of Allocate<ServiceDescriptor>() and AllocateArray<ServiceDescriptor>() in
10595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // descriptor.cc and update them to initialize the field.
10605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Must be constructed using DescriptorPool.
10625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  ServiceDescriptor() {}
10635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class DescriptorBuilder;
10645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class FileDescriptor;
10655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class MethodDescriptor;
10665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceDescriptor);
10675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
10685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Describes an individual service method.  To obtain a MethodDescriptor given
10705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// a service, first get its ServiceDescriptor, then call
10715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ServiceDescriptor::FindMethodByName().  Use DescriptorPool to construct your
10725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// own descriptors.
10735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT MethodDescriptor {
10745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
10755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Name of this method, not including containing scope.
10765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& name() const;
10775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The fully-qualified name of the method, scope delimited by periods.
10785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& full_name() const;
10795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Index within the service's Descriptor.
10805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int index() const;
10815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets the service to which this method belongs.  Never NULL.
10835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const ServiceDescriptor* service() const;
10845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets the type of protocol message which this method accepts as input.
10865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* input_type() const;
10875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets the type of protocol message which this message produces as output.
10885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* output_type() const;
10895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets whether the client streams multiple requests.
10915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool client_streaming() const;
10925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets whether the server streams multiple responses.
10935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool server_streaming() const;
10945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
10955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get options for this method.  These are specified in the .proto file by
10965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // placing lines like "option foo = 1234;" in curly-braces after a method
10975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // declaration.  Allowed options are defined by MethodOptions in
10985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // google/protobuf/descriptor.proto, and any available extensions of that
10995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // message.
11005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const MethodOptions& options() const;
11015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::CopyTo().
11035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyTo(MethodDescriptorProto* proto) const;
11045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugString().
11065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugString() const;
11075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugStringWithOptions().
11095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugStringWithOptions(const DebugStringOptions& options) const;
11105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Source Location ---------------------------------------------------
11135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Updates |*out_location| to the source location of the complete
11155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extent of this method declaration.  Returns false and leaves
11165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // |*out_location| unchanged iff location information was not available.
11175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool GetSourceLocation(SourceLocation* out_location) const;
11185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
11205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef MethodOptions OptionsType;
11215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Allows access to GetLocationPath for annotations.
11235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class ::google::protobuf::io::Printer;
11245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugString().
11265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void DebugString(int depth, string *contents,
11275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                   const DebugStringOptions& options) const;
11285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Walks up the descriptor tree to generate the source location path
11305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // to this descriptor from the file root.
11315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void GetLocationPath(std::vector<int>* output) const;
11325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* name_;
11345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* full_name_;
11355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const ServiceDescriptor* service_;
11365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* input_type_;
11375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* output_type_;
11385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const MethodOptions* options_;
11395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool client_streaming_;
11405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool server_streaming_;
11415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // IMPORTANT:  If you add a new field, make sure to search for all instances
11425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // of Allocate<MethodDescriptor>() and AllocateArray<MethodDescriptor>() in
11435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // descriptor.cc and update them to initialize the field.
11445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Must be constructed using DescriptorPool.
11465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MethodDescriptor() {}
11475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class DescriptorBuilder;
11485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class ServiceDescriptor;
11495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MethodDescriptor);
11505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
11515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Describes a whole .proto file.  To get the FileDescriptor for a compiled-in
11545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// file, get the descriptor for something defined in that file and call
11555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// descriptor->file().  Use DescriptorPool to construct your own descriptors.
11565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT FileDescriptor {
11575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
11585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The filename, relative to the source tree.
11595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // e.g. "google/protobuf/descriptor.proto"
11605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& name() const;
11615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The package, e.g. "google.protobuf.compiler".
11635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string& package() const;
11645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The DescriptorPool in which this FileDescriptor and all its contents were
11665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // allocated.  Never NULL.
11675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const DescriptorPool* pool() const;
11685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of files imported by this one.
11705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int dependency_count() const;
11715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets an imported file by index, where 0 <= index < dependency_count().
11725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
11735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* dependency(int index) const;
11745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of files public imported by this one.
11765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The public dependency list is a subset of the dependency list.
11775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int public_dependency_count() const;
11785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets a public imported file by index, where 0 <= index <
11795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // public_dependency_count().
11805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
11815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* public_dependency(int index) const;
11825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The number of files that are imported for weak fields.
11845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // The weak dependency list is a subset of the dependency list.
11855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int weak_dependency_count() const;
11865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets a weak imported file by index, where 0 <= index <
11875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // weak_dependency_count().
11885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
11895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* weak_dependency(int index) const;
11905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Number of top-level message types defined in this file.  (This does not
11925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // include nested types.)
11935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int message_type_count() const;
11945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets a top-level message type, where 0 <= index < message_type_count().
11955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
11965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* message_type(int index) const;
11975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
11985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Number of top-level enum types defined in this file.  (This does not
11995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // include nested types.)
12005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int enum_type_count() const;
12015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets a top-level enum type, where 0 <= index < enum_type_count().
12025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
12035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumDescriptor* enum_type(int index) const;
12045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
12055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Number of services defined in this file.
12065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int service_count() const;
12075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets a service, where 0 <= index < service_count().
12085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
12095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const ServiceDescriptor* service(int index) const;
12105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
12115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Number of extensions defined at file scope.  (This does not include
12125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extensions nested within message types.)
12135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int extension_count() const;
12145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Gets an extension's descriptor, where 0 <= index < extension_count().
12155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These are returned in the order they were defined in the .proto file.
12165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* extension(int index) const;
12175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
12185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get options for this file.  These are specified in the .proto file by
12195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // placing lines like "option foo = 1234;" at the top level, outside of any
12205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // other definitions.  Allowed options are defined by FileOptions in
12215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // google/protobuf/descriptor.proto, and any available extensions of that
12225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // message.
12235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileOptions& options() const;
12245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
12255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Syntax of this file.
12265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  enum Syntax {
12275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    SYNTAX_UNKNOWN = 0,
12285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    SYNTAX_PROTO2  = 2,
12295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    SYNTAX_PROTO3  = 3,
12305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
12315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  Syntax syntax() const;
12325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const char* SyntaxName(Syntax syntax);
12335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
12345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Find a top-level message type by name.  Returns NULL if not found.
12355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* FindMessageTypeByName(const string& name) const;
12365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Find a top-level enum type by name.  Returns NULL if not found.
12375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumDescriptor* FindEnumTypeByName(const string& name) const;
12385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Find an enum value defined in any top-level enum by name.  Returns NULL if
12395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // not found.
12405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumValueDescriptor* FindEnumValueByName(const string& name) const;
12415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Find a service definition by name.  Returns NULL if not found.
12425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const ServiceDescriptor* FindServiceByName(const string& name) const;
12435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Find a top-level extension definition by name.  Returns NULL if not found.
12445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* FindExtensionByName(const string& name) const;
12455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Similar to FindExtensionByName(), but searches by lowercased-name.  See
12465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Descriptor::FindFieldByLowercaseName().
12475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const;
12485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Similar to FindExtensionByName(), but searches by camelcased-name.  See
12495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Descriptor::FindFieldByCamelcaseName().
12505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const;
12515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
12525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::CopyTo().
12535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Notes:
12545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // - This method does NOT copy source code information since it is relatively
12555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   large and rarely needed.  See CopySourceCodeInfoTo() below.
12565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyTo(FileDescriptorProto* proto) const;
12575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Write the source code information of this FileDescriptor into the given
12585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // FileDescriptorProto.  See CopyTo() above.
12595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopySourceCodeInfoTo(FileDescriptorProto* proto) const;
12605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Fill the json_name field of FieldDescriptorProto for all fields. Can only
12615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // be called after CopyTo().
12625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyJsonNameTo(FileDescriptorProto* proto) const;
12635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
12645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugString().
12655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugString() const;
12665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
12675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See Descriptor::DebugStringWithOptions().
12685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string DebugStringWithOptions(const DebugStringOptions& options) const;
12695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
12705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns true if this is a placeholder for an unknown file. This will
12715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // only be the case if this descriptor comes from a DescriptorPool
12725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // with AllowUnknownDependencies() set.
12735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_placeholder() const;
12745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
12755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Updates |*out_location| to the source location of the complete extent of
12765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // this file declaration (namely, the empty path).
12775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool GetSourceLocation(SourceLocation* out_location) const;
12785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
12795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Updates |*out_location| to the source location of the complete
12805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // extent of the declaration or declaration-part denoted by |path|.
12815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Returns false and leaves |*out_location| unchanged iff location
12825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // information was not available.  (See SourceCodeInfo for
12835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // description of path encoding.)
12845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool GetSourceLocation(const std::vector<int>& path,
12855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         SourceLocation* out_location) const;
12865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
12875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
12885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef FileOptions OptionsType;
12895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
12905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* name_;
12915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const string* package_;
12925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const DescriptorPool* pool_;
12935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int dependency_count_;
12945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor** dependencies_;
12955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int public_dependency_count_;
12965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int* public_dependencies_;
12975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int weak_dependency_count_;
12985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int* weak_dependencies_;
12995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int message_type_count_;
13005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  Descriptor* message_types_;
13015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int enum_type_count_;
13025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  EnumDescriptor* enum_types_;
13035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int service_count_;
13045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  ServiceDescriptor* services_;
13055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int extension_count_;
13065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  Syntax syntax_;
13075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool is_placeholder_;
13085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  FieldDescriptor* extensions_;
13095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileOptions* options_;
13105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
13115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptorTables* tables_;
13125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const SourceCodeInfo* source_code_info_;
13135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // IMPORTANT:  If you add a new field, make sure to search for all instances
13145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // of Allocate<FileDescriptor>() and AllocateArray<FileDescriptor>() in
13155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // descriptor.cc and update them to initialize the field.
13165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
13175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  FileDescriptor() {}
13185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class DescriptorBuilder;
13195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class Descriptor;
13205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class FieldDescriptor;
13215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class OneofDescriptor;
13225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class EnumDescriptor;
13235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class EnumValueDescriptor;
13245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class MethodDescriptor;
13255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class ServiceDescriptor;
13265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileDescriptor);
13275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
13285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
13295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ===================================================================
13305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
13315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Used to construct descriptors.
13325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
13335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Normally you won't want to build your own descriptors.  Message classes
13345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// constructed by the protocol compiler will provide them for you.  However,
13355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// if you are implementing Message on your own, or if you are writing a
13365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// program which can operate on totally arbitrary types and needs to load
13375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// them from some sort of database, you might need to.
13385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
13395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Since Descriptors are composed of a whole lot of cross-linked bits of
13405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// data that would be a pain to put together manually, the
13415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// DescriptorPool class is provided to make the process easier.  It can
13425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// take a FileDescriptorProto (defined in descriptor.proto), validate it,
13435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// and convert it to a set of nicely cross-linked Descriptors.
13445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
13455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// DescriptorPool also helps with memory management.  Descriptors are
13465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// composed of many objects containing static data and pointers to each
13475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// other.  In all likelihood, when it comes time to delete this data,
13485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// you'll want to delete it all at once.  In fact, it is not uncommon to
13495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// have a whole pool of descriptors all cross-linked with each other which
13505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// you wish to delete all at once.  This class represents such a pool, and
13515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// handles the memory management for you.
13525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
13535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// You can also search for descriptors within a DescriptorPool by name, and
13545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// extensions by number.
13555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT DescriptorPool {
13565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
13575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Create a normal, empty DescriptorPool.
13585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  DescriptorPool();
13595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
13605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Constructs a DescriptorPool that, when it can't find something among the
13615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // descriptors already in the pool, looks for it in the given
13625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // DescriptorDatabase.
13635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Notes:
13645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // - If a DescriptorPool is constructed this way, its BuildFile*() methods
13655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   must not be called (they will assert-fail).  The only way to populate
13665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   the pool with descriptors is to call the Find*By*() methods.
13675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // - The Find*By*() methods may block the calling thread if the
13685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   DescriptorDatabase blocks.  This in turn means that parsing messages
13695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   may block if they need to look up extensions.
13705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // - The Find*By*() methods will use mutexes for thread-safety, thus making
13715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   them slower even when they don't have to fall back to the database.
13725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   In fact, even the Find*By*() methods of descriptor objects owned by
13735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   this pool will be slower, since they will have to obtain locks too.
13745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // - An ErrorCollector may optionally be given to collect validation errors
13755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   in files loaded from the database.  If not given, errors will be printed
13765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   to GOOGLE_LOG(ERROR).  Remember that files are built on-demand, so this
13775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   ErrorCollector may be called from any thread that calls one of the
13785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   Find*By*() methods.
13795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // - The DescriptorDatabase must not be mutated during the lifetime of
13805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   the DescriptorPool. Even if the client takes care to avoid data races,
13815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   changes to the content of the DescriptorDatabase may not be reflected
13825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   in subsequent lookups in the DescriptorPool.
13835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class ErrorCollector;
13845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  explicit DescriptorPool(DescriptorDatabase* fallback_database,
13855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                          ErrorCollector* error_collector = NULL);
13865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
13875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  ~DescriptorPool();
13885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
13895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Get a pointer to the generated pool.  Generated protocol message classes
13905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // which are compiled into the binary will allocate their descriptors in
13915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // this pool.  Do not add your own descriptors to this pool.
13925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const DescriptorPool* generated_pool();
13935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
13945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
13955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Find a FileDescriptor in the pool by file name.  Returns NULL if not
13965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // found.
13975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* FindFileByName(const string& name) const;
13985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
13995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Find the FileDescriptor in the pool which defines the given symbol.
14005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // If any of the Find*ByName() methods below would succeed, then this is
14015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // equivalent to calling that method and calling the result's file() method.
14025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Otherwise this returns NULL.
14035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* FindFileContainingSymbol(
14045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const string& symbol_name) const;
14055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
14065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Looking up descriptors ------------------------------------------
14075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These find descriptors by fully-qualified name.  These will find both
14085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // top-level descriptors and nested descriptors.  They return NULL if not
14095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // found.
14105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
14115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Descriptor* FindMessageTypeByName(const string& name) const;
14125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* FindFieldByName(const string& name) const;
14135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* FindExtensionByName(const string& name) const;
14145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const OneofDescriptor* FindOneofByName(const string& name) const;
14155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumDescriptor* FindEnumTypeByName(const string& name) const;
14165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const EnumValueDescriptor* FindEnumValueByName(const string& name) const;
14175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const ServiceDescriptor* FindServiceByName(const string& name) const;
14185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const MethodDescriptor* FindMethodByName(const string& name) const;
14195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
14205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Finds an extension of the given type by number.  The extendee must be
14215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // a member of this DescriptorPool or one of its underlays.
14225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FieldDescriptor* FindExtensionByNumber(const Descriptor* extendee,
14235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                               int number) const;
14245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
14255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Finds extensions of extendee. The extensions will be appended to
14265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // out in an undefined order. Only extensions defined directly in
14275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // this DescriptorPool or one of its underlays are guaranteed to be
14285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // found: extensions defined in the fallback database might not be found
14295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // depending on the database implementation.
14305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void FindAllExtensions(const Descriptor* extendee,
14315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         std::vector<const FieldDescriptor*>* out) const;
14325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
14335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Building descriptors --------------------------------------------
14345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
14355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // When converting a FileDescriptorProto to a FileDescriptor, various
14365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // errors might be detected in the input.  The caller may handle these
14375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // programmatically by implementing an ErrorCollector.
14385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class LIBPROTOBUF_EXPORT ErrorCollector {
14395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot   public:
14405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    inline ErrorCollector() {}
14415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual ~ErrorCollector();
14425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
14435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // These constants specify what exact part of the construct is broken.
14445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // This is useful e.g. for mapping the error back to an exact location
14455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // in a .proto file.
14465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    enum ErrorLocation {
14475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      NAME,              // the symbol name, or the package name for files
14485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      NUMBER,            // field or extension range number
14495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      TYPE,              // field type
14505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      EXTENDEE,          // field extendee
14515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      DEFAULT_VALUE,     // field default value
14525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      INPUT_TYPE,        // method input type
14535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      OUTPUT_TYPE,       // method output type
14545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      OPTION_NAME,       // name in assignment
14555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      OPTION_VALUE,      // value in option assignment
14565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      OTHER              // some other problem
14575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    };
14585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
14595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Reports an error in the FileDescriptorProto. Use this function if the
14605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // problem occurred should interrupt building the FileDescriptorProto.
14615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual void AddError(
14625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const string& filename,      // File name in which the error occurred.
14635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const string& element_name,  // Full name of the erroneous element.
14645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const Message* descriptor,   // Descriptor of the erroneous element.
14655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      ErrorLocation location,      // One of the location constants, above.
14665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const string& message        // Human-readable error message.
14675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      ) = 0;
14685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
14695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // Reports a warning in the FileDescriptorProto. Use this function if the
14705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // problem occurred should NOT interrupt building the FileDescriptorProto.
14715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    virtual void AddWarning(
14725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const string& /*filename*/,      // File name in which the error occurred.
14735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const string& /*element_name*/,  // Full name of the erroneous element.
14745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const Message* /*descriptor*/,   // Descriptor of the erroneous element.
14755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      ErrorLocation /*location*/,      // One of the location constants, above.
14765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const string& /*message*/        // Human-readable error message.
14775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      ) {}
14785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
14795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot   private:
14805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector);
14815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  };
14825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
14835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Convert the FileDescriptorProto to real descriptors and place them in
14845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // this DescriptorPool.  All dependencies of the file must already be in
14855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // the pool.  Returns the resulting FileDescriptor, or NULL if there were
14865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // problems with the input (e.g. the message was invalid, or dependencies
14875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // were missing).  Details about the errors are written to GOOGLE_LOG(ERROR).
14885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* BuildFile(const FileDescriptorProto& proto);
14895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
14905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Same as BuildFile() except errors are sent to the given ErrorCollector.
14915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* BuildFileCollectingErrors(
14925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    const FileDescriptorProto& proto,
14935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ErrorCollector* error_collector);
14945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
14955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // By default, it is an error if a FileDescriptorProto contains references
14965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // to types or other files that are not found in the DescriptorPool (or its
14975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // backing DescriptorDatabase, if any).  If you call
14985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // AllowUnknownDependencies(), however, then unknown types and files
14995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // will be replaced by placeholder descriptors (which can be identified by
15005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // the is_placeholder() method).  This can allow you to
15015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // perform some useful operations with a .proto file even if you do not
15025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // have access to other .proto files on which it depends.  However, some
15035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // heuristics must be used to fill in the gaps in information, and these
15045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // can lead to descriptors which are inaccurate.  For example, the
15055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // DescriptorPool may be forced to guess whether an unknown type is a message
15065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // or an enum, as well as what package it resides in.  Furthermore,
15075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // placeholder types will not be discoverable via FindMessageTypeByName()
15085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // and similar methods, which could confuse some descriptor-based algorithms.
15095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Generally, the results of this option should be handled with extreme care.
15105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void AllowUnknownDependencies() { allow_unknown_ = true; }
15115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // By default, weak imports are allowed to be missing, in which case we will
15135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // use a placeholder for the dependency and convert the field to be an Empty
15145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // message field. If you call EnforceWeakDependencies(true), however, the
15155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // DescriptorPool will report a import not found error.
15165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void EnforceWeakDependencies(bool enforce) { enforce_weak_ = enforce; }
15175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Internal stuff --------------------------------------------------
15195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These methods MUST NOT be called from outside the proto2 library.
15205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // These methods may contain hidden pitfalls and may be removed in a
15215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // future library version.
15225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Create a DescriptorPool which is overlaid on top of some other pool.
15245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // If you search for a descriptor in the overlay and it is not found, the
15255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // underlay will be searched as a backup.  If the underlay has its own
15265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // underlay, that will be searched next, and so on.  This also means that
15275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // files built in the overlay will be cross-linked with the underlay's
15285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // descriptors if necessary.  The underlay remains property of the caller;
15295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // it must remain valid for the lifetime of the newly-constructed pool.
15305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //
15315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Example:  Say you want to parse a .proto file at runtime in order to use
15325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // its type with a DynamicMessage.  Say this .proto file has dependencies,
15335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // but you know that all the dependencies will be things that are already
15345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // compiled into the binary.  For ease of use, you'd like to load the types
15355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // right out of generated_pool() rather than have to parse redundant copies
15365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // of all these .protos and runtime.  But, you don't want to add the parsed
15375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // types directly into generated_pool(): this is not allowed, and would be
15385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // bad design anyway.  So, instead, you could use generated_pool() as an
15395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // underlay for a new DescriptorPool in which you add only the new file.
15405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //
15415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // WARNING:  Use of underlays can lead to many subtle gotchas.  Instead,
15425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   try to formulate what you want to do in terms of DescriptorDatabases.
15435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  explicit DescriptorPool(const DescriptorPool* underlay);
15445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Called by generated classes at init time to add their descriptors to
15465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // generated_pool.  Do NOT call this in your own code!  filename must be a
15475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // permanent string (e.g. a string literal).
15485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static void InternalAddGeneratedFile(
15495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const void* encoded_file_descriptor, int size);
15505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // For internal use only:  Gets a non-const pointer to the generated pool.
15535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // This is called at static-initialization time only, so thread-safety is
15545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // not a concern.  If both an underlay and a fallback database are present,
15555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // the underlay takes precedence.
15565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static DescriptorPool* internal_generated_pool();
15575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // For internal use only:  Changes the behavior of BuildFile() such that it
15595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // allows the file to make reference to message types declared in other files
15605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // which it did not officially declare as dependencies.
15615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void InternalDontEnforceDependencies();
15625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // For internal use only.
15645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void internal_set_underlay(const DescriptorPool* underlay) {
15655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    underlay_ = underlay;
15665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
15675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // For internal (unit test) use only:  Returns true if a FileDescriptor has
15695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // been constructed for the given file, false otherwise.  Useful for testing
15705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // lazy descriptor initialization behavior.
15715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool InternalIsFileLoaded(const string& filename) const;
15725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Add a file to unused_import_track_files_. DescriptorBuilder will log
15755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // warnings for those files if there is any unused import.
15765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void AddUnusedImportTrackFile(const string& file_name);
15775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void ClearUnusedImportTrackFiles();
15785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
15805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class Descriptor;
15815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class FieldDescriptor;
15825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class EnumDescriptor;
15835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class ServiceDescriptor;
15845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class FileDescriptor;
15855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class DescriptorBuilder;
15865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class FileDescriptorTables;
15875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Return true if the given name is a sub-symbol of any non-package
15895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // descriptor that already exists in the descriptor pool.  (The full
15905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // definition of such types is already known.)
15915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool IsSubSymbolOfBuiltType(const string& name) const;
15925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
15935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Tries to find something in the fallback database and link in the
15945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // corresponding proto file.  Returns true if successful, in which case
15955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // the caller should search for the thing again.  These are declared
15965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // const because they are called by (semantically) const methods.
15975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool TryFindFileInFallbackDatabase(const string& name) const;
15985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool TryFindSymbolInFallbackDatabase(const string& name) const;
15995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool TryFindExtensionInFallbackDatabase(const Descriptor* containing_type,
16005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                          int field_number) const;
16015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Like BuildFile() but called internally when the file has been loaded from
16035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // fallback_database_.  Declared const because it is called by (semantically)
16045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // const methods.
16055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const FileDescriptor* BuildFileFromDatabase(
16065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    const FileDescriptorProto& proto) const;
16075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // If fallback_database_ is NULL, this is NULL.  Otherwise, this is a mutex
16095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // which must be locked while accessing tables_.
16105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  Mutex* mutex_;
16115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See constructor.
16135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  DescriptorDatabase* fallback_database_;
16145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  ErrorCollector* default_error_collector_;
16155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const DescriptorPool* underlay_;
16165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // This class contains a lot of hash maps with complicated types that
16185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // we'd like to keep out of the header.
16195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  class Tables;
16205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  google::protobuf::scoped_ptr<Tables> tables_;
16215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool enforce_dependencies_;
16235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool allow_unknown_;
16245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool enforce_weak_;
16255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  std::set<string> unused_import_track_files_;
16265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPool);
16285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
16295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// inline methods ====================================================
16315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// These macros makes this repetitive code more readable.
16335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define PROTOBUF_DEFINE_ACCESSOR(CLASS, FIELD, TYPE) \
16345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline TYPE CLASS::FIELD() const { return FIELD##_; }
16355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Strings fields are stored as pointers but returned as const references.
16375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define PROTOBUF_DEFINE_STRING_ACCESSOR(CLASS, FIELD) \
16385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline const string& CLASS::FIELD() const { return *FIELD##_; }
16395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Arrays take an index parameter, obviously.
16415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define PROTOBUF_DEFINE_ARRAY_ACCESSOR(CLASS, FIELD, TYPE) \
16425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline TYPE CLASS::FIELD(int index) const { return FIELD##s_ + index; }
16435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define PROTOBUF_DEFINE_OPTIONS_ACCESSOR(CLASS, TYPE) \
16455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  inline const TYPE& CLASS::options() const { return *options_; }
16465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, name)
16485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, full_name)
16495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(Descriptor, file, const FileDescriptor*)
16505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(Descriptor, containing_type, const Descriptor*)
16515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(Descriptor, field_count, int)
16535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(Descriptor, oneof_decl_count, int)
16545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(Descriptor, nested_type_count, int)
16555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(Descriptor, enum_type_count, int)
16565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, field, const FieldDescriptor*)
16585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, oneof_decl, const OneofDescriptor*)
16595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, nested_type, const Descriptor*)
16605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, enum_type, const EnumDescriptor*)
16615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_range_count, int)
16635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_count, int)
16645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension_range,
16655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                               const Descriptor::ExtensionRange*)
16665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension,
16675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                               const FieldDescriptor*)
16685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(Descriptor, reserved_range_count, int)
16705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, reserved_range,
16715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                               const Descriptor::ReservedRange*)
16725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(Descriptor, reserved_name_count, int)
16735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_OPTIONS_ACCESSOR(Descriptor, MessageOptions)
16755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(Descriptor, is_placeholder, bool)
16765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
16775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, name)
16785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, full_name)
16795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, json_name)
16805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, lowercase_name)
16815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, camelcase_name)
16825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, file, const FileDescriptor*)
16835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, number, int)
16845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, is_extension, bool)
16855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, type, FieldDescriptor::Type)
16865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, label, FieldDescriptor::Label)
16875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_type, const Descriptor*)
16885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_oneof,
16895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         const OneofDescriptor*)
16905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, index_in_oneof, int)
16915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, extension_scope, const Descriptor*)
16925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, message_type, const Descriptor*)
16935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, enum_type, const EnumDescriptor*)
16945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_OPTIONS_ACCESSOR(FieldDescriptor, FieldOptions)
16955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, has_default_value, bool)
16965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int32 , int32 )
16975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int64 , int64 )
16985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint32, uint32)
16995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint64, uint64)
17005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_float , float )
17015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_double, double)
17025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_bool  , bool  )
17035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_enum,
17045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                         const EnumValueDescriptor*)
17055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, default_value_string)
17065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(OneofDescriptor, name)
17085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(OneofDescriptor, full_name)
17095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(OneofDescriptor, containing_type, const Descriptor*)
17105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(OneofDescriptor, field_count, int)
17115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, name)
17135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, full_name)
17145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, file, const FileDescriptor*)
17155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, containing_type, const Descriptor*)
17165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, value_count, int)
17175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ARRAY_ACCESSOR(EnumDescriptor, value,
17185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                               const EnumValueDescriptor*)
17195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumDescriptor, EnumOptions)
17205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, is_placeholder, bool)
17215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, name)
17235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, full_name)
17245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, number, int)
17255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, type, const EnumDescriptor*)
17265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumValueDescriptor, EnumValueOptions)
17275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, name)
17295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, full_name)
17305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, file, const FileDescriptor*)
17315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, method_count, int)
17325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ARRAY_ACCESSOR(ServiceDescriptor, method,
17335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                               const MethodDescriptor*)
17345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_OPTIONS_ACCESSOR(ServiceDescriptor, ServiceOptions)
17355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, name)
17375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, full_name)
17385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, service, const ServiceDescriptor*)
17395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, input_type, const Descriptor*)
17405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, output_type, const Descriptor*)
17415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_OPTIONS_ACCESSOR(MethodDescriptor, MethodOptions)
17425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, client_streaming, bool)
17435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, server_streaming, bool)
17445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, name)
17465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, package)
17475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, pool, const DescriptorPool*)
17485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, dependency_count, int)
17495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, public_dependency_count, int)
17505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, weak_dependency_count, int)
17515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, message_type_count, int)
17525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, enum_type_count, int)
17535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, service_count, int)
17545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, extension_count, int)
17555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_OPTIONS_ACCESSOR(FileDescriptor, FileOptions)
17565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, is_placeholder, bool)
17575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, message_type, const Descriptor*)
17595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, enum_type, const EnumDescriptor*)
17605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, service,
17615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                               const ServiceDescriptor*)
17625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotPROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, extension,
17635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                               const FieldDescriptor*)
17645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#undef PROTOBUF_DEFINE_ACCESSOR
17665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#undef PROTOBUF_DEFINE_STRING_ACCESSOR
17675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#undef PROTOBUF_DEFINE_ARRAY_ACCESSOR
17685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// A few accessors differ from the macros...
17705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool Descriptor::IsExtensionNumber(int number) const {
17725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return FindExtensionRangeContainingNumber(number) != NULL;
17735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
17745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool Descriptor::IsReservedNumber(int number) const {
17765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return FindReservedRangeContainingNumber(number) != NULL;
17775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
17785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool Descriptor::IsReservedName(const string& name) const {
17805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  for (int i = 0; i < reserved_name_count(); i++) {
17815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    if (name == reserved_name(i)) {
17825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      return true;
17835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
17845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
17855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return false;
17865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
17875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Can't use PROTOBUF_DEFINE_ARRAY_ACCESSOR because reserved_names_ is actually
17895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// an array of pointers rather than the usual array of objects.
17905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const string& Descriptor::reserved_name(int index) const {
17915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return *reserved_names_[index];
17925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
17935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool FieldDescriptor::is_required() const {
17955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return label() == LABEL_REQUIRED;
17965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
17975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
17985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool FieldDescriptor::is_optional() const {
17995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return label() == LABEL_OPTIONAL;
18005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool FieldDescriptor::is_repeated() const {
18035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return label() == LABEL_REPEATED;
18045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool FieldDescriptor::is_packable() const {
18075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return is_repeated() && IsTypePackable(type());
18085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// To save space, index() is computed by looking at the descriptor's position
18115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// in the parent's array of children.
18125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int FieldDescriptor::index() const {
18135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  if (!is_extension_) {
18145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<int>(this - containing_type_->fields_);
18155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  } else if (extension_scope_ != NULL) {
18165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<int>(this - extension_scope_->extensions_);
18175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  } else {
18185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<int>(this - file_->extensions_);
18195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
18205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int Descriptor::index() const {
18235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  if (containing_type_ == NULL) {
18245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<int>(this - file_->message_types_);
18255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  } else {
18265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<int>(this - containing_type_->nested_types_);
18275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
18285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int OneofDescriptor::index() const {
18315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return static_cast<int>(this - containing_type_->oneof_decls_);
18325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int EnumDescriptor::index() const {
18355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  if (containing_type_ == NULL) {
18365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<int>(this - file_->enum_types_);
18375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  } else {
18385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<int>(this - containing_type_->enum_types_);
18395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
18405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int EnumValueDescriptor::index() const {
18435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return static_cast<int>(this - type_->values_);
18445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int ServiceDescriptor::index() const {
18475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return static_cast<int>(this - file_->services_);
18485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int MethodDescriptor::index() const {
18515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return static_cast<int>(this - service_->methods_);
18525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const char* FieldDescriptor::type_name() const {
18555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return kTypeToName[type_];
18565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline FieldDescriptor::CppType FieldDescriptor::cpp_type() const {
18595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return kTypeToCppTypeMap[type_];
18605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const char* FieldDescriptor::cpp_type_name() const {
18635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return kCppTypeToName[kTypeToCppTypeMap[type_]];
18645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline FieldDescriptor::CppType FieldDescriptor::TypeToCppType(Type type) {
18675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return kTypeToCppTypeMap[type];
18685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const char* FieldDescriptor::TypeName(Type type) {
18715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return kTypeToName[type];
18725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const char* FieldDescriptor::CppTypeName(CppType cpp_type) {
18755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return kCppTypeToName[cpp_type];
18765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool FieldDescriptor::IsTypePackable(Type field_type) {
18795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return (field_type != FieldDescriptor::TYPE_STRING &&
18805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot          field_type != FieldDescriptor::TYPE_GROUP &&
18815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot          field_type != FieldDescriptor::TYPE_MESSAGE &&
18825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot          field_type != FieldDescriptor::TYPE_BYTES);
18835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const FileDescriptor* FileDescriptor::dependency(int index) const {
18865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return dependencies_[index];
18875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const FileDescriptor* FileDescriptor::public_dependency(
18905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int index) const {
18915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return dependencies_[public_dependencies_[index]];
18925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const FileDescriptor* FileDescriptor::weak_dependency(
18955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int index) const {
18965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return dependencies_[weak_dependencies_[index]];
18975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
18985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
18995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline FileDescriptor::Syntax FileDescriptor::syntax() const {
19005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return syntax_;
19015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
19025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
19035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Can't use PROTOBUF_DEFINE_ARRAY_ACCESSOR because fields_ is actually an array
19045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// of pointers rather than the usual array of objects.
19055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const FieldDescriptor* OneofDescriptor::field(int index) const {
19065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return fields_[index];
19075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
19085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
19095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace protobuf
19105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
19115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace google
19125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif  // GOOGLE_PROTOBUF_DESCRIPTOR_H__
1913