1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Based on original Protocol Buffers design by
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <algorithm>
36a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <set>
37a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/descriptor.pb.h>
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/generated_message_reflection.h>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.h>
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/repeated_field.h>
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/extension_set.h>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/generated_message_util.h>
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h>
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
45a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define GOOGLE_PROTOBUF_HAS_ONEOF
46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint StringSpaceUsedExcludingSelf(const string& str) {
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const void* start = &str;
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const void* end = &str + 1;
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
55a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (start <= str.data() && str.data() < end) {
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // The string's data is stored inside the string object itself.
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return 0;
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return str.capacity();
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool ParseNamedEnum(const EnumDescriptor* descriptor,
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    const string& name,
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    int* value) {
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueDescriptor* d = descriptor->FindValueByName(name);
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (d == NULL) return false;
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  *value = d->number();
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst string& NameOfEnum(const EnumDescriptor* descriptor, int value) {
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueDescriptor* d = descriptor->FindValueByNumber(value);
74a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return (d == NULL ? GetEmptyString() : d->name());
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Helpers for reporting usage errors (e.g. trying to use GetInt32() on
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// a string field).
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid ReportReflectionUsageError(
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Descriptor* descriptor, const FieldDescriptor* field,
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const char* method, const char* description) {
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(FATAL)
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    << "Protocol Buffer reflection usage error:\n"
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "  Method      : google::protobuf::Reflection::" << method << "\n"
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "  Message type: " << descriptor->full_name() << "\n"
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "  Field       : " << field->full_name() << "\n"
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "  Problem     : " << description;
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst char* cpptype_names_[FieldDescriptor::MAX_CPPTYPE + 1] = {
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  "INVALID_CPPTYPE",
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  "CPPTYPE_INT32",
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  "CPPTYPE_INT64",
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  "CPPTYPE_UINT32",
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  "CPPTYPE_UINT64",
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  "CPPTYPE_DOUBLE",
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  "CPPTYPE_FLOAT",
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  "CPPTYPE_BOOL",
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  "CPPTYPE_ENUM",
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  "CPPTYPE_STRING",
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  "CPPTYPE_MESSAGE"
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic void ReportReflectionUsageTypeError(
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Descriptor* descriptor, const FieldDescriptor* field,
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const char* method,
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor::CppType expected_type) {
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(FATAL)
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    << "Protocol Buffer reflection usage error:\n"
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "  Method      : google::protobuf::Reflection::" << method << "\n"
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "  Message type: " << descriptor->full_name() << "\n"
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "  Field       : " << field->full_name() << "\n"
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "  Problem     : Field is not the right type for this message:\n"
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "    Expected  : " << cpptype_names_[expected_type] << "\n"
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "    Field type: " << cpptype_names_[field->cpp_type()];
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic void ReportReflectionUsageEnumTypeError(
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Descriptor* descriptor, const FieldDescriptor* field,
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const char* method, const EnumValueDescriptor* value) {
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(FATAL)
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    << "Protocol Buffer reflection usage error:\n"
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "  Method      : google::protobuf::Reflection::" << method << "\n"
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "  Message type: " << descriptor->full_name() << "\n"
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "  Field       : " << field->full_name() << "\n"
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "  Problem     : Enum value did not match field type:\n"
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "    Expected  : " << field->enum_type()->full_name() << "\n"
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "    Actual    : " << value->full_name();
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK(CONDITION, METHOD, ERROR_DESCRIPTION)                      \
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!(CONDITION))                                                            \
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ReportReflectionUsageError(descriptor_, field, #METHOD, ERROR_DESCRIPTION)
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_EQ(A, B, METHOD, ERROR_DESCRIPTION)                        \
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK((A) == (B), METHOD, ERROR_DESCRIPTION)
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_NE(A, B, METHOD, ERROR_DESCRIPTION)                        \
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK((A) != (B), METHOD, ERROR_DESCRIPTION)
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_TYPE(METHOD, CPPTYPE)                                      \
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->cpp_type() != FieldDescriptor::CPPTYPE_##CPPTYPE)                 \
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ReportReflectionUsageTypeError(descriptor_, field, #METHOD,                \
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                   FieldDescriptor::CPPTYPE_##CPPTYPE)
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_ENUM_VALUE(METHOD)                                         \
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (value->type() != field->enum_type())                                     \
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ReportReflectionUsageEnumTypeError(descriptor_, field, #METHOD, value)
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_MESSAGE_TYPE(METHOD)                                       \
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_EQ(field->containing_type(), descriptor_,                        \
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 METHOD, "Field does not match message type.");
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_SINGULAR(METHOD)                                           \
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_NE(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD,      \
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 "Field is repeated; the method requires a singular field.")
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_REPEATED(METHOD)                                           \
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_EQ(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD,      \
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 "Field is singular; the method requires a repeated field.")
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define USAGE_CHECK_ALL(METHOD, LABEL, CPPTYPE)                       \
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    USAGE_CHECK_MESSAGE_TYPE(METHOD);                                 \
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    USAGE_CHECK_##LABEL(METHOD);                                      \
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    USAGE_CHECK_TYPE(METHOD, CPPTYPE)
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratedMessageReflection::GeneratedMessageReflection(
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Descriptor* descriptor,
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message* default_instance,
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const int offsets[],
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int has_bits_offset,
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int unknown_fields_offset,
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int extensions_offset,
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const DescriptorPool* descriptor_pool,
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MessageFactory* factory,
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int object_size)
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  : descriptor_       (descriptor),
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    default_instance_ (default_instance),
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    offsets_          (offsets),
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    has_bits_offset_  (has_bits_offset),
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unknown_fields_offset_(unknown_fields_offset),
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extensions_offset_(extensions_offset),
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    object_size_      (object_size),
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    descriptor_pool_  ((descriptor_pool == NULL) ?
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         DescriptorPool::generated_pool() :
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         descriptor_pool),
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    message_factory_  (factory) {
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGeneratedMessageReflection::GeneratedMessageReflection(
195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const Descriptor* descriptor,
196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const Message* default_instance,
197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const int offsets[],
198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    int has_bits_offset,
199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    int unknown_fields_offset,
200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    int extensions_offset,
201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const void* default_oneof_instance,
202a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    int oneof_case_offset,
203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const DescriptorPool* descriptor_pool,
204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    MessageFactory* factory,
205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    int object_size)
206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  : descriptor_       (descriptor),
207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    default_instance_ (default_instance),
208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    default_oneof_instance_ (default_oneof_instance),
209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    offsets_          (offsets),
210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    has_bits_offset_  (has_bits_offset),
211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    oneof_case_offset_(oneof_case_offset),
212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    unknown_fields_offset_(unknown_fields_offset),
213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    extensions_offset_(extensions_offset),
214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    object_size_      (object_size),
215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    descriptor_pool_  ((descriptor_pool == NULL) ?
216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                         DescriptorPool::generated_pool() :
217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                         descriptor_pool),
218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    message_factory_  (factory) {
219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratedMessageReflection::~GeneratedMessageReflection() {}
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst UnknownFieldSet& GeneratedMessageReflection::GetUnknownFields(
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message) const {
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const void* ptr = reinterpret_cast<const uint8*>(&message) +
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    unknown_fields_offset_;
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return *reinterpret_cast<const UnknownFieldSet*>(ptr);
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleUnknownFieldSet* GeneratedMessageReflection::MutableUnknownFields(
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message) const {
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void* ptr = reinterpret_cast<uint8*>(message) + unknown_fields_offset_;
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return reinterpret_cast<UnknownFieldSet*>(ptr);
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint GeneratedMessageReflection::SpaceUsed(const Message& message) const {
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // object_size_ already includes the in-memory representation of each field
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // in the message, so we only need to account for additional memory used by
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // the fields.
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int total_size = object_size_;
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  total_size += GetUnknownFields(message).SpaceUsedExcludingSelf();
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (extensions_offset_ != -1) {
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    total_size += GetExtensionSet(message).SpaceUsedExcludingSelf();
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->field_count(); i++) {
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field = descriptor_->field(i);
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (field->is_repeated()) {
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      switch (field->cpp_type()) {
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_##UPPERCASE :                           \
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          total_size += GetRaw<RepeatedField<LOWERCASE> >(message, field)     \
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                          .SpaceUsedExcludingSelf();                          \
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( INT32,  int32);
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( INT64,  int64);
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(UINT32, uint32);
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(UINT64, uint64);
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(DOUBLE, double);
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE( FLOAT,  float);
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  BOOL,   bool);
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        HANDLE_TYPE(  ENUM,    int);
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_STRING:
269d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          switch (field->options().ctype()) {
270d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            default:  // TODO(kenton):  Support other string reps.
271d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            case FieldOptions::STRING:
272d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              total_size += GetRaw<RepeatedPtrField<string> >(message, field)
273d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                              .SpaceUsedExcludingSelf();
274d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              break;
275d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          }
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_MESSAGE:
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // We don't know which subclass of RepeatedPtrFieldBase the type is,
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // so we use RepeatedPtrFieldBase directly.
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          total_size +=
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              GetRaw<RepeatedPtrFieldBase>(message, field)
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                .SpaceUsedExcludingSelf<GenericTypeHandler<Message> >();
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      if (field->containing_oneof() && !HasOneofField(message, field)) {
288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        continue;
289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      }
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      switch (field->cpp_type()) {
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_INT32 :
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_INT64 :
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_UINT32:
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_UINT64:
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_DOUBLE:
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_FLOAT :
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_BOOL  :
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_ENUM  :
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // Field is inline, so we've already counted it.
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_STRING: {
303d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          switch (field->options().ctype()) {
304d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            default:  // TODO(kenton):  Support other string reps.
305d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            case FieldOptions::STRING: {
306d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              const string* ptr = GetField<const string*>(message, field);
307d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
308d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              // Initially, the string points to the default value stored in
309d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              // the prototype. Only count the string if it has been changed
310d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              // from the default value.
311d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              const string* default_ptr = DefaultRaw<const string*>(field);
312d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
313d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              if (ptr != default_ptr) {
314d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                // string fields are represented by just a pointer, so also
315d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                // include sizeof(string) as well.
316d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                total_size += sizeof(*ptr) + StringSpaceUsedExcludingSelf(*ptr);
317d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              }
318d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              break;
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            }
320d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          }
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_MESSAGE:
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          if (&message == default_instance_) {
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            // For singular fields, the prototype just stores a pointer to the
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            // external type's prototype, so there is no extra memory usage.
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          } else {
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            const Message* sub_message = GetRaw<const Message*>(message, field);
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            if (sub_message != NULL) {
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              total_size += sub_message->SpaceUsed();
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            }
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          }
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return total_size;
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid GeneratedMessageReflection::SwapField(
343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message1,
344a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message2,
345a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const FieldDescriptor* field) const {
346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (field->is_repeated()) {
347a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    switch (field->cpp_type()) {
348a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define SWAP_ARRAYS(CPPTYPE, TYPE)                                      \
349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        MutableRaw<RepeatedField<TYPE> >(message1, field)->Swap(        \
351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            MutableRaw<RepeatedField<TYPE> >(message2, field));         \
352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_ARRAYS(INT32 , int32 );
355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_ARRAYS(INT64 , int64 );
356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_ARRAYS(UINT32, uint32);
357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_ARRAYS(UINT64, uint64);
358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_ARRAYS(FLOAT , float );
359a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_ARRAYS(DOUBLE, double);
360a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_ARRAYS(BOOL  , bool  );
361a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_ARRAYS(ENUM  , int   );
362a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#undef SWAP_ARRAYS
363a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
364a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_STRING:
365a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_MESSAGE:
366a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        MutableRaw<RepeatedPtrFieldBase>(message1, field)->Swap(
367a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            MutableRaw<RepeatedPtrFieldBase>(message2, field));
368a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
369a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
370a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      default:
371a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type();
372a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
373a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
374a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    switch (field->cpp_type()) {
375a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define SWAP_VALUES(CPPTYPE, TYPE)                                      \
376a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
377a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        std::swap(*MutableRaw<TYPE>(message1, field),                   \
378a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                  *MutableRaw<TYPE>(message2, field));                  \
379a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
380a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_VALUES(INT32 , int32 );
382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_VALUES(INT64 , int64 );
383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_VALUES(UINT32, uint32);
384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_VALUES(UINT64, uint64);
385a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_VALUES(FLOAT , float );
386a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_VALUES(DOUBLE, double);
387a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_VALUES(BOOL  , bool  );
388a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SWAP_VALUES(ENUM  , int   );
389a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#undef SWAP_VALUES
390a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_MESSAGE:
391a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        std::swap(*MutableRaw<Message*>(message1, field),
392a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                  *MutableRaw<Message*>(message2, field));
393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_STRING:
396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        switch (field->options().ctype()) {
397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          default:  // TODO(kenton):  Support other string reps.
398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          case FieldOptions::STRING:
399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            std::swap(*MutableRaw<string*>(message1, field),
400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      *MutableRaw<string*>(message2, field));
401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            break;
402a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        }
403a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      default:
406a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type();
407a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
408a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
409a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
410a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
411a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid GeneratedMessageReflection::SwapOneofField(
412a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message1,
413a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message2,
414a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const OneofDescriptor* oneof_descriptor) const {
415a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  uint32 oneof_case1 = GetOneofCase(*message1, oneof_descriptor);
416a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  uint32 oneof_case2 = GetOneofCase(*message2, oneof_descriptor);
417a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
418a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int32 temp_int32;
419a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int64 temp_int64;
420a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  uint32 temp_uint32;
421a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  uint64 temp_uint64;
422a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  float temp_float;
423a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  double temp_double;
424a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool temp_bool;
425a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int temp_int;
426a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  Message* temp_message;
427a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  string temp_string;
428a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
429a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Stores message1's oneof field to a temp variable.
430a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const FieldDescriptor* field1;
431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (oneof_case1 > 0) {
432a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    field1 = descriptor_->FindFieldByNumber(oneof_case1);
433a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    //oneof_descriptor->field(oneof_case1);
434a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    switch (field1->cpp_type()) {
435a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define GET_TEMP_VALUE(CPPTYPE, TYPE)                                   \
436a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
437a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        temp_##TYPE = GetField<TYPE>(*message1, field1);                \
438a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
439a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
440a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GET_TEMP_VALUE(INT32 , int32 );
441a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GET_TEMP_VALUE(INT64 , int64 );
442a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GET_TEMP_VALUE(UINT32, uint32);
443a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GET_TEMP_VALUE(UINT64, uint64);
444a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GET_TEMP_VALUE(FLOAT , float );
445a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GET_TEMP_VALUE(DOUBLE, double);
446a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GET_TEMP_VALUE(BOOL  , bool  );
447a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GET_TEMP_VALUE(ENUM  , int   );
448a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#undef GET_TEMP_VALUE
449a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_MESSAGE:
450a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        temp_message = ReleaseMessage(message1, field1);
451a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
452a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
453a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_STRING:
454a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        temp_string = GetString(*message1, field1);
455a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
456a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
457a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      default:
458a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type();
459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
460a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
461a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
462a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Sets message1's oneof field from the message2's oneof field.
463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (oneof_case2 > 0) {
464a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const FieldDescriptor* field2 =
465a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        descriptor_->FindFieldByNumber(oneof_case2);
466a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    switch (field2->cpp_type()) {
467a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define SET_ONEOF_VALUE1(CPPTYPE, TYPE)                                 \
468a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
469a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        SetField<TYPE>(message1, field2, GetField<TYPE>(*message2, field2)); \
470a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE1(INT32 , int32 );
473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE1(INT64 , int64 );
474a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE1(UINT32, uint32);
475a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE1(UINT64, uint64);
476a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE1(FLOAT , float );
477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE1(DOUBLE, double);
478a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE1(BOOL  , bool  );
479a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE1(ENUM  , int   );
480a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#undef SET_ONEOF_VALUE1
481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_MESSAGE:
482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        SetAllocatedMessage(message1,
483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                            ReleaseMessage(message2, field2),
484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                            field2);
485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_STRING:
488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        SetString(message1, field2, GetString(*message2, field2));
489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      default:
492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        GOOGLE_LOG(FATAL) << "Unimplemented type: " << field2->cpp_type();
493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ClearOneof(message1, oneof_descriptor);
496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Sets message2's oneof field from the temp variable.
499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (oneof_case1 > 0) {
500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    switch (field1->cpp_type()) {
501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define SET_ONEOF_VALUE2(CPPTYPE, TYPE)                                 \
502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        SetField<TYPE>(message2, field1, temp_##TYPE);                  \
504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE2(INT32 , int32 );
507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE2(INT64 , int64 );
508a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE2(UINT32, uint32);
509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE2(UINT64, uint64);
510a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE2(FLOAT , float );
511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE2(DOUBLE, double);
512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE2(BOOL  , bool  );
513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SET_ONEOF_VALUE2(ENUM  , int   );
514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#undef SET_ONEOF_VALUE2
515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_MESSAGE:
516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        SetAllocatedMessage(message2, temp_message, field1);
517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
518a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_STRING:
520a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        SetString(message2, field1, temp_string);
521a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
522a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
523a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      default:
524a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type();
525a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
526a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
527a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ClearOneof(message2, oneof_descriptor);
528a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
529a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
530a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::Swap(
532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message1,
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message2) const {
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (message1 == message2) return;
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // TODO(kenton):  Other Reflection methods should probably check this too.
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK_EQ(message1->GetReflection(), this)
538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    << "First argument to Swap() (of type \""
539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    << message1->GetDescriptor()->full_name()
540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    << "\") is not compatible with this reflection object (which is for type \""
541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    << descriptor_->full_name()
542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    << "\").  Note that the exact same class is required; not just the same "
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "descriptor.";
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_CHECK_EQ(message2->GetReflection(), this)
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    << "Second argument to Swap() (of type \""
546a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    << message2->GetDescriptor()->full_name()
547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    << "\") is not compatible with this reflection object (which is for type \""
548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    << descriptor_->full_name()
549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    << "\").  Note that the exact same class is required; not just the same "
550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville       "descriptor.";
551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32* has_bits1 = MutableHasBits(message1);
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32* has_bits2 = MutableHasBits(message2);
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int has_bits_size = (descriptor_->field_count() + 31) / 32;
555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < has_bits_size; i++) {
557d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    std::swap(has_bits1[i], has_bits2[i]);
558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->field_count(); i++) {
561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field = descriptor_->field(i);
562a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if (!field->containing_oneof()) {
563a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SwapField(message1, message2, field);
564a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
565a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
567a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
568a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    SwapOneofField(message1, message2, descriptor_->oneof_decl(i));
569a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
571a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (extensions_offset_ != -1) {
572a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    MutableExtensionSet(message1)->Swap(MutableExtensionSet(message2));
573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  MutableUnknownFields(message1)->Swap(MutableUnknownFields(message2));
576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid GeneratedMessageReflection::SwapFields(
579a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message1,
580a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message2,
581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const vector<const FieldDescriptor*>& fields) const {
582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (message1 == message2) return;
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // TODO(kenton):  Other Reflection methods should probably check this too.
585a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  GOOGLE_CHECK_EQ(message1->GetReflection(), this)
586a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    << "First argument to SwapFields() (of type \""
587a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    << message1->GetDescriptor()->full_name()
588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    << "\") is not compatible with this reflection object (which is for type \""
589a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    << descriptor_->full_name()
590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    << "\").  Note that the exact same class is required; not just the same "
591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson       "descriptor.";
592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  GOOGLE_CHECK_EQ(message2->GetReflection(), this)
593a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    << "Second argument to SwapFields() (of type \""
594a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    << message2->GetDescriptor()->full_name()
595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    << "\") is not compatible with this reflection object (which is for type \""
596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    << descriptor_->full_name()
597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    << "\").  Note that the exact same class is required; not just the same "
598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson       "descriptor.";
599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  std::set<int> swapped_oneof;
601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
602a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  for (int i = 0; i < fields.size(); i++) {
603a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const FieldDescriptor* field = fields[i];
604a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if (field->is_extension()) {
605a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      MutableExtensionSet(message1)->SwapExtension(
606a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          MutableExtensionSet(message2),
607a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          field->number());
608a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    } else {
609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      if (field->containing_oneof()) {
610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        int oneof_index = field->containing_oneof()->index();
611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        // Only swap the oneof field once.
612a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        if (swapped_oneof.find(oneof_index) != swapped_oneof.end()) {
613a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          continue;
614a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        }
615a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        swapped_oneof.insert(oneof_index);
616a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        SwapOneofField(message1, message2, field->containing_oneof());
617a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      } else {
618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        // Swap has bit.
619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        SwapBit(message1, message2, field);
620a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        // Swap field.
621a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        SwapField(message1, message2, field);
622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool GeneratedMessageReflection::HasField(const Message& message,
630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                          const FieldDescriptor* field) const {
631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_MESSAGE_TYPE(HasField);
632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_SINGULAR(HasField);
633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return GetExtensionSet(message).Has(field->number());
636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
637a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if (field->containing_oneof()) {
638a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      return HasOneofField(message, field);
639a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    } else {
640a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      return HasBit(message, field);
641a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint GeneratedMessageReflection::FieldSize(const Message& message,
646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                          const FieldDescriptor* field) const {
647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_MESSAGE_TYPE(FieldSize);
648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_REPEATED(FieldSize);
649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return GetExtensionSet(message).ExtensionSize(field->number());
652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    switch (field->cpp_type()) {
654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        return GetRaw<RepeatedField<LOWERCASE> >(message, field).size()
657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( INT32,  int32);
659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( INT64,  int64);
660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(UINT32, uint32);
661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(UINT64, uint64);
662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(DOUBLE, double);
663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( FLOAT,  float);
664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  BOOL,   bool);
665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  ENUM,    int);
666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case FieldDescriptor::CPPTYPE_STRING:
669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case FieldDescriptor::CPPTYPE_MESSAGE:
670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        return GetRaw<RepeatedPtrFieldBase>(message, field).size();
671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_LOG(FATAL) << "Can't get here.";
674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return 0;
675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::ClearField(
679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field) const {
680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_MESSAGE_TYPE(ClearField);
681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MutableExtensionSet(message)->ClearExtension(field->number());
684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else if (!field->is_repeated()) {
685a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if (field->containing_oneof()) {
686a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      ClearOneofField(message, field);
687a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      return;
688a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
689a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (HasBit(*message, field)) {
691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ClearBit(message, field);
692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We need to set the field back to its default value.
694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      switch (field->cpp_type()) {
695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define CLEAR_TYPE(CPPTYPE, TYPE)                                            \
696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_##CPPTYPE:                             \
697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          *MutableRaw<TYPE>(message, field) =                                \
698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            field->default_value_##TYPE();                                   \
699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        CLEAR_TYPE(INT32 , int32 );
702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        CLEAR_TYPE(INT64 , int64 );
703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        CLEAR_TYPE(UINT32, uint32);
704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        CLEAR_TYPE(UINT64, uint64);
705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        CLEAR_TYPE(FLOAT , float );
706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        CLEAR_TYPE(DOUBLE, double);
707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        CLEAR_TYPE(BOOL  , bool  );
708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef CLEAR_TYPE
709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_ENUM:
711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          *MutableRaw<int>(message, field) =
712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            field->default_value_enum()->number();
713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_STRING: {
716d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          switch (field->options().ctype()) {
717d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            default:  // TODO(kenton):  Support other string reps.
718d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            case FieldOptions::STRING:
719d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              const string* default_ptr = DefaultRaw<const string*>(field);
720d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              string** value = MutableRaw<string*>(message, field);
721d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              if (*value != default_ptr) {
722d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                if (field->has_default_value()) {
723d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                  (*value)->assign(field->default_value_string());
724d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                } else {
725d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                  (*value)->clear();
726d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                }
727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              }
728d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville              break;
729d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          }
730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        case FieldDescriptor::CPPTYPE_MESSAGE:
734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          (*MutableRaw<Message*>(message, field))->Clear();
735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          break;
736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    switch (field->cpp_type()) {
740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        MutableRaw<RepeatedField<LOWERCASE> >(message, field)->Clear();       \
743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break
744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( INT32,  int32);
746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( INT64,  int64);
747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(UINT32, uint32);
748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(UINT64, uint64);
749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(DOUBLE, double);
750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( FLOAT,  float);
751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  BOOL,   bool);
752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  ENUM,    int);
753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case FieldDescriptor::CPPTYPE_STRING: {
756d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        switch (field->options().ctype()) {
757d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          default:  // TODO(kenton):  Support other string reps.
758d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          case FieldOptions::STRING:
759d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            MutableRaw<RepeatedPtrField<string> >(message, field)->Clear();
760d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            break;
761d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        }
762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case FieldDescriptor::CPPTYPE_MESSAGE: {
766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        // We don't know which subclass of RepeatedPtrFieldBase the type is,
767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        // so we use RepeatedPtrFieldBase directly.
768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        MutableRaw<RepeatedPtrFieldBase>(message, field)
769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            ->Clear<GenericTypeHandler<Message> >();
770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::RemoveLast(
777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message,
778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field) const {
779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_MESSAGE_TYPE(RemoveLast);
780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_REPEATED(RemoveLast);
781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MutableExtensionSet(message)->RemoveLast(field->number());
784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    switch (field->cpp_type()) {
786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        MutableRaw<RepeatedField<LOWERCASE> >(message, field)->RemoveLast();  \
789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break
790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( INT32,  int32);
792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( INT64,  int64);
793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(UINT32, uint32);
794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(UINT64, uint64);
795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(DOUBLE, double);
796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( FLOAT,  float);
797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  BOOL,   bool);
798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  ENUM,    int);
799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case FieldDescriptor::CPPTYPE_STRING:
802d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        switch (field->options().ctype()) {
803d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          default:  // TODO(kenton):  Support other string reps.
804d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          case FieldOptions::STRING:
805d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            MutableRaw<RepeatedPtrField<string> >(message, field)->RemoveLast();
806d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville            break;
807d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        }
808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case FieldDescriptor::CPPTYPE_MESSAGE:
811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        MutableRaw<RepeatedPtrFieldBase>(message, field)
812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            ->RemoveLast<GenericTypeHandler<Message> >();
813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
818a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessage* GeneratedMessageReflection::ReleaseLast(
819a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message,
820a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const FieldDescriptor* field) const {
821a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  USAGE_CHECK_ALL(ReleaseLast, REPEATED, MESSAGE);
822a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
823a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (field->is_extension()) {
824a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return static_cast<Message*>(
825a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        MutableExtensionSet(message)->ReleaseLast(field->number()));
826a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
827a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return MutableRaw<RepeatedPtrFieldBase>(message, field)
828a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        ->ReleaseLast<GenericTypeHandler<Message> >();
829a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
830a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
831a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::SwapElements(
833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message,
834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field,
835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int index1,
836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int index2) const {
837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_MESSAGE_TYPE(Swap);
838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_REPEATED(Swap);
839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MutableExtensionSet(message)->SwapElements(field->number(), index1, index2);
842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    switch (field->cpp_type()) {
844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        MutableRaw<RepeatedField<LOWERCASE> >(message, field)                 \
847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            ->SwapElements(index1, index2);                                   \
848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break
849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( INT32,  int32);
851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( INT64,  int64);
852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(UINT32, uint32);
853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(UINT64, uint64);
854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(DOUBLE, double);
855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE( FLOAT,  float);
856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  BOOL,   bool);
857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      HANDLE_TYPE(  ENUM,    int);
858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef HANDLE_TYPE
859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case FieldDescriptor::CPPTYPE_STRING:
861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      case FieldDescriptor::CPPTYPE_MESSAGE:
862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        MutableRaw<RepeatedPtrFieldBase>(message, field)
863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            ->SwapElements(index1, index2);
864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        break;
865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Comparison functor for sorting FieldDescriptors by field number.
871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestruct FieldNumberSorter {
872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool operator()(const FieldDescriptor* left,
873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                  const FieldDescriptor* right) const {
874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return left->number() < right->number();
875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::ListFields(
880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message,
881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    vector<const FieldDescriptor*>* output) const {
882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->clear();
883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Optimization:  The default instance never has any fields set.
885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (&message == default_instance_) return;
886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < descriptor_->field_count(); i++) {
888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field = descriptor_->field(i);
889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (field->is_repeated()) {
890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (FieldSize(message, field) > 0) {
891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        output->push_back(field);
892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
894a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      if (field->containing_oneof()) {
895a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        if (HasOneofField(message, field)) {
896a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          output->push_back(field);
897a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        }
898a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      } else if (HasBit(message, field)) {
899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        output->push_back(field);
900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (extensions_offset_ != -1) {
905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GetExtensionSet(message).AppendToList(descriptor_, descriptor_pool_,
906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                          output);
907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // ListFields() must sort output by field number.
910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  sort(output->begin(), output->end(), FieldNumberSorter());
911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef DEFINE_PRIMITIVE_ACCESSORS
916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define DEFINE_PRIMITIVE_ACCESSORS(TYPENAME, TYPE, PASSTYPE, CPPTYPE)        \
917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  PASSTYPE GeneratedMessageReflection::Get##TYPENAME(                        \
918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Message& message, const FieldDescriptor* field) const {          \
919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    USAGE_CHECK_ALL(Get##TYPENAME, SINGULAR, CPPTYPE);                       \
920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (field->is_extension()) {                                             \
921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return GetExtensionSet(message).Get##TYPENAME(                         \
922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        field->number(), field->default_value_##PASSTYPE());                 \
923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {                                                                 \
924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return GetField<TYPE>(message, field);                                 \
925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }                                                                        \
926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }                                                                          \
927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                                             \
928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GeneratedMessageReflection::Set##TYPENAME(                            \
929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      Message* message, const FieldDescriptor* field,                        \
930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      PASSTYPE value) const {                                                \
931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    USAGE_CHECK_ALL(Set##TYPENAME, SINGULAR, CPPTYPE);                       \
932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (field->is_extension()) {                                             \
933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return MutableExtensionSet(message)->Set##TYPENAME(                    \
934d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        field->number(), field->type(), value, field);                       \
935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {                                                                 \
936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      SetField<TYPE>(message, field, value);                                 \
937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }                                                                        \
938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }                                                                          \
939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                                             \
940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  PASSTYPE GeneratedMessageReflection::GetRepeated##TYPENAME(                \
941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Message& message,                                                \
942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const FieldDescriptor* field, int index) const {                       \
943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    USAGE_CHECK_ALL(GetRepeated##TYPENAME, REPEATED, CPPTYPE);               \
944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (field->is_extension()) {                                             \
945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return GetExtensionSet(message).GetRepeated##TYPENAME(                 \
946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        field->number(), index);                                             \
947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {                                                                 \
948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return GetRepeatedField<TYPE>(message, field, index);                  \
949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }                                                                        \
950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }                                                                          \
951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                                             \
952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GeneratedMessageReflection::SetRepeated##TYPENAME(                    \
953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      Message* message, const FieldDescriptor* field,                        \
954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      int index, PASSTYPE value) const {                                     \
955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    USAGE_CHECK_ALL(SetRepeated##TYPENAME, REPEATED, CPPTYPE);               \
956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (field->is_extension()) {                                             \
957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      MutableExtensionSet(message)->SetRepeated##TYPENAME(                   \
958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        field->number(), index, value);                                      \
959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {                                                                 \
960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      SetRepeatedField<TYPE>(message, field, index, value);                  \
961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }                                                                        \
962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }                                                                          \
963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                                             \
964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GeneratedMessageReflection::Add##TYPENAME(                            \
965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      Message* message, const FieldDescriptor* field,                        \
966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      PASSTYPE value) const {                                                \
967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    USAGE_CHECK_ALL(Add##TYPENAME, REPEATED, CPPTYPE);                       \
968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (field->is_extension()) {                                             \
969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      MutableExtensionSet(message)->Add##TYPENAME(                           \
970d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        field->number(), field->type(), field->options().packed(), value,    \
971d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        field);                                                              \
972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {                                                                 \
973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      AddField<TYPE>(message, field, value);                                 \
974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }                                                                        \
975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(Int32 , int32 , int32 , INT32 )
978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(Int64 , int64 , int64 , INT64 )
979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(UInt32, uint32, uint32, UINT32)
980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(UInt64, uint64, uint64, UINT64)
981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(Float , float , float , FLOAT )
982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(Double, double, double, DOUBLE)
983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDEFINE_PRIMITIVE_ACCESSORS(Bool  , bool  , bool  , BOOL  )
984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef DEFINE_PRIMITIVE_ACCESSORS
985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring GeneratedMessageReflection::GetString(
989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message, const FieldDescriptor* field) const {
990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(GetString, SINGULAR, STRING);
991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return GetExtensionSet(message).GetString(field->number(),
993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                              field->default_value_string());
994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
995d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    switch (field->options().ctype()) {
996d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      default:  // TODO(kenton):  Support other string reps.
997d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      case FieldOptions::STRING:
998d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        return *GetField<const string*>(message, field);
999d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    }
1000d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1001d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    GOOGLE_LOG(FATAL) << "Can't get here.";
1002a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return GetEmptyString();  // Make compiler happy.
1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst string& GeneratedMessageReflection::GetStringReference(
1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message,
1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field, string* scratch) const {
1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(GetStringReference, SINGULAR, STRING);
1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return GetExtensionSet(message).GetString(field->number(),
1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                              field->default_value_string());
1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1014d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    switch (field->options().ctype()) {
1015d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      default:  // TODO(kenton):  Support other string reps.
1016d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      case FieldOptions::STRING:
1017d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        return *GetField<const string*>(message, field);
1018d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    }
1019d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1020d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    GOOGLE_LOG(FATAL) << "Can't get here.";
1021a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return GetEmptyString();  // Make compiler happy.
1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::SetString(
1027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field,
1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const string& value) const {
1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(SetString, SINGULAR, STRING);
1030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return MutableExtensionSet(message)->SetString(field->number(),
1032d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                                   field->type(), value, field);
1033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1034d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    switch (field->options().ctype()) {
1035d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      default:  // TODO(kenton):  Support other string reps.
1036d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      case FieldOptions::STRING: {
1037a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        if (field->containing_oneof() && !HasOneofField(*message, field)) {
1038a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          ClearOneof(message, field->containing_oneof());
1039a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          *MutableField<string*>(message, field) = new string;
1040a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        }
1041d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        string** ptr = MutableField<string*>(message, field);
1042d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        if (*ptr == DefaultRaw<const string*>(field)) {
1043d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          *ptr = new string(value);
1044d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        } else {
1045d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          (*ptr)->assign(value);
1046d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        }
1047d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        break;
1048d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      }
1049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
1050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring GeneratedMessageReflection::GetRepeatedString(
1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message, const FieldDescriptor* field, int index) const {
1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(GetRepeatedString, REPEATED, STRING);
1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return GetExtensionSet(message).GetRepeatedString(field->number(), index);
1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1060d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    switch (field->options().ctype()) {
1061d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      default:  // TODO(kenton):  Support other string reps.
1062d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      case FieldOptions::STRING:
1063d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        return GetRepeatedPtrField<string>(message, field, index);
1064d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    }
1065d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1066d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    GOOGLE_LOG(FATAL) << "Can't get here.";
1067a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return GetEmptyString();  // Make compiler happy.
1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst string& GeneratedMessageReflection::GetRepeatedStringReference(
1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message, const FieldDescriptor* field,
1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int index, string* scratch) const {
1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(GetRepeatedStringReference, REPEATED, STRING);
1075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return GetExtensionSet(message).GetRepeatedString(field->number(), index);
1077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1078d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    switch (field->options().ctype()) {
1079d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      default:  // TODO(kenton):  Support other string reps.
1080d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      case FieldOptions::STRING:
1081d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        return GetRepeatedPtrField<string>(message, field, index);
1082d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    }
1083d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1084d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    GOOGLE_LOG(FATAL) << "Can't get here.";
1085a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return GetEmptyString();  // Make compiler happy.
1086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::SetRepeatedString(
1091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field,
1092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int index, const string& value) const {
1093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING);
1094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MutableExtensionSet(message)->SetRepeatedString(
1096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      field->number(), index, value);
1097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1098d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    switch (field->options().ctype()) {
1099d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      default:  // TODO(kenton):  Support other string reps.
1100d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      case FieldOptions::STRING:
1101d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        *MutableRepeatedField<string>(message, field, index) = value;
1102d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        break;
1103d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    }
1104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::AddString(
1109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field,
1110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const string& value) const {
1111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(AddString, REPEATED, STRING);
1112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MutableExtensionSet(message)->AddString(field->number(),
1114d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                            field->type(), value, field);
1115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1116d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    switch (field->options().ctype()) {
1117d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      default:  // TODO(kenton):  Support other string reps.
1118d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      case FieldOptions::STRING:
1119d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        *AddField<string>(message, field) = value;
1120d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        break;
1121d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    }
1122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
1127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst EnumValueDescriptor* GeneratedMessageReflection::GetEnum(
1129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message, const FieldDescriptor* field) const {
1130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(GetEnum, SINGULAR, ENUM);
1131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int value;
1133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    value = GetExtensionSet(message).GetEnum(
1135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      field->number(), field->default_value_enum()->number());
1136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    value = GetField<int>(message, field);
1138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueDescriptor* result =
1140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    field->enum_type()->FindValueByNumber(value);
1141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  GOOGLE_CHECK(result != NULL) << "Value " << value << " is not valid for field "
1142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                        << field->full_name() << " of type "
1143a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                        << field->enum_type()->full_name() << ".";
1144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return result;
1145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::SetEnum(
1148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field,
1149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const EnumValueDescriptor* value) const {
1150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(SetEnum, SINGULAR, ENUM);
1151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ENUM_VALUE(SetEnum);
1152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MutableExtensionSet(message)->SetEnum(field->number(), field->type(),
1155d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                          value->number(), field);
1156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    SetField<int>(message, field, value->number());
1158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst EnumValueDescriptor* GeneratedMessageReflection::GetRepeatedEnum(
1162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message, const FieldDescriptor* field, int index) const {
1163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(GetRepeatedEnum, REPEATED, ENUM);
1164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int value;
1166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    value = GetExtensionSet(message).GetRepeatedEnum(field->number(), index);
1168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    value = GetRepeatedField<int>(message, field, index);
1170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueDescriptor* result =
1172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    field->enum_type()->FindValueByNumber(value);
1173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  GOOGLE_CHECK(result != NULL) << "Value " << value << " is not valid for field "
1174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                        << field->full_name() << " of type "
1175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                        << field->enum_type()->full_name() << ".";
1176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return result;
1177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::SetRepeatedEnum(
1180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message,
1181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field, int index,
1182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const EnumValueDescriptor* value) const {
1183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(SetRepeatedEnum, REPEATED, ENUM);
1184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ENUM_VALUE(SetRepeatedEnum);
1185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MutableExtensionSet(message)->SetRepeatedEnum(
1188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      field->number(), index, value->number());
1189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    SetRepeatedField<int>(message, field, index, value->number());
1191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid GeneratedMessageReflection::AddEnum(
1195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field,
1196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const EnumValueDescriptor* value) const {
1197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(AddEnum, REPEATED, ENUM);
1198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ENUM_VALUE(AddEnum);
1199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MutableExtensionSet(message)->AddEnum(field->number(), field->type(),
1202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                          field->options().packed(),
1203d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                          value->number(), field);
1204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    AddField<int>(message, field, value->number());
1206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -------------------------------------------------------------------
1210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst Message& GeneratedMessageReflection::GetMessage(
1212d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    const Message& message, const FieldDescriptor* field,
1213d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    MessageFactory* factory) const {
1214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(GetMessage, SINGULAR, MESSAGE);
1215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (factory == NULL) factory = message_factory_;
1217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return static_cast<const Message&>(
1220d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        GetExtensionSet(message).GetMessage(
1221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          field->number(), field->message_type(), factory));
1222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const Message* result;
1224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    result = GetRaw<const Message*>(message, field);
1225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (result == NULL) {
1226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      result = DefaultRaw<const Message*>(field);
1227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
1228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return *result;
1229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessage* GeneratedMessageReflection::MutableMessage(
1233d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Message* message, const FieldDescriptor* field,
1234d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    MessageFactory* factory) const {
1235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (factory == NULL) factory = message_factory_;
1236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return static_cast<Message*>(
1239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        MutableExtensionSet(message)->MutableMessage(field, factory));
1240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* result;
1242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message** result_holder = MutableRaw<Message*>(message, field);
1243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if (field->containing_oneof()) {
1245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      if (!HasOneofField(*message, field)) {
1246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        ClearOneof(message, field->containing_oneof());
1247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        result_holder = MutableField<Message*>(message, field);
1248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        const Message* default_message = DefaultRaw<const Message*>(field);
1249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        *result_holder = default_message->New();
1250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      }
1251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    } else {
1252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SetBit(message, field);
1253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
1254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if (*result_holder == NULL) {
1256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Message* default_message = DefaultRaw<const Message*>(field);
1257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      *result_holder = default_message->New();
1258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
1259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    result = *result_holder;
1260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return result;
1261a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
1262a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1263a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid GeneratedMessageReflection::SetAllocatedMessage(
1265a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message,
1266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* sub_message,
1267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const FieldDescriptor* field) const {
1268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  USAGE_CHECK_ALL(SetAllocatedMessage, SINGULAR, MESSAGE);
1269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (field->is_extension()) {
1271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    MutableExtensionSet(message)->SetAllocatedMessage(
1272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        field->number(), field->type(), field, sub_message);
1273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
1274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if (field->containing_oneof()) {
1275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      if (sub_message == NULL) {
1276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        ClearOneof(message, field->containing_oneof());
1277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        return;
1278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      }
1279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        ClearOneof(message, field->containing_oneof());
1280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        *MutableRaw<Message*>(message, field) = sub_message;
1281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SetOneofCase(message, field);
1282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      return;
1283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
1284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if (sub_message == NULL) {
1286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      ClearBit(message, field);
1287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    } else {
1288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SetBit(message, field);
1289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
1290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message** sub_message_holder = MutableRaw<Message*>(message, field);
1291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    delete *sub_message_holder;
1292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    *sub_message_holder = sub_message;
1293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
1294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessage* GeneratedMessageReflection::ReleaseMessage(
1297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message,
1298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const FieldDescriptor* field,
1299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    MessageFactory* factory) const {
1300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  USAGE_CHECK_ALL(ReleaseMessage, SINGULAR, MESSAGE);
1301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (factory == NULL) factory = message_factory_;
1303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (field->is_extension()) {
1305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return static_cast<Message*>(
1306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        MutableExtensionSet(message)->ReleaseMessage(field, factory));
1307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
1308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ClearBit(message, field);
1309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if (field->containing_oneof()) {
1310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      if (HasOneofField(*message, field)) {
1311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        *MutableOneofCase(message, field->containing_oneof()) = 0;
1312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      } else {
1313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        return NULL;
1314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      }
1315a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
1316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message** result = MutableRaw<Message*>(message, field);
1317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* ret = *result;
1318a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    *result = NULL;
1319a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return ret;
1320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst Message& GeneratedMessageReflection::GetRepeatedMessage(
1324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message, const FieldDescriptor* field, int index) const {
1325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(GetRepeatedMessage, REPEATED, MESSAGE);
1326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return static_cast<const Message&>(
1329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        GetExtensionSet(message).GetRepeatedMessage(field->number(), index));
1330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return GetRaw<RepeatedPtrFieldBase>(message, field)
1332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        .Get<GenericTypeHandler<Message> >(index);
1333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessage* GeneratedMessageReflection::MutableRepeatedMessage(
1337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field, int index) const {
1338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(MutableRepeatedMessage, REPEATED, MESSAGE);
1339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return static_cast<Message*>(
1342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        MutableExtensionSet(message)->MutableRepeatedMessage(
1343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          field->number(), index));
1344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return MutableRaw<RepeatedPtrFieldBase>(message, field)
1346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ->Mutable<GenericTypeHandler<Message> >(index);
1347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessage* GeneratedMessageReflection::AddMessage(
1351d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Message* message, const FieldDescriptor* field,
1352d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    MessageFactory* factory) const {
1353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  USAGE_CHECK_ALL(AddMessage, REPEATED, MESSAGE);
1354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1355d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (factory == NULL) factory = message_factory_;
1356d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->is_extension()) {
1358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return static_cast<Message*>(
1359d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        MutableExtensionSet(message)->AddMessage(field, factory));
1360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // We can't use AddField<Message>() because RepeatedPtrFieldBase doesn't
1362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // know how to allocate one.
1363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    RepeatedPtrFieldBase* repeated =
1364a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        MutableRaw<RepeatedPtrFieldBase>(message, field);
1365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* result = repeated->AddFromCleared<GenericTypeHandler<Message> >();
1366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (result == NULL) {
1367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // We must allocate a new object.
1368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const Message* prototype;
1369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (repeated->size() == 0) {
1370d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        prototype = factory->GetPrototype(field->message_type());
1371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      } else {
1372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        prototype = &repeated->Get<GenericTypeHandler<Message> >(0);
1373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
1374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      result = prototype->New();
1375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      repeated->AddAllocated<GenericTypeHandler<Message> >(result);
1376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
1377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return result;
1378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid* GeneratedMessageReflection::MutableRawRepeatedField(
1382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message, const FieldDescriptor* field,
1383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    FieldDescriptor::CppType cpptype,
1384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    int ctype, const Descriptor* desc) const {
1385a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  USAGE_CHECK_REPEATED("MutableRawRepeatedField");
1386a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (field->cpp_type() != cpptype)
1387a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ReportReflectionUsageTypeError(descriptor_,
1388a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        field, "MutableRawRepeatedField", cpptype);
1389a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (ctype >= 0)
1390a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    GOOGLE_CHECK_EQ(field->options().ctype(), ctype) << "subtype mismatch";
1391a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (desc != NULL)
1392a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    GOOGLE_CHECK_EQ(field->message_type(), desc) << "wrong submessage type";
1393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (field->is_extension())
1394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return MutableExtensionSet(message)->MutableRawRepeatedField(
1395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        field->number(), field->type(), field->is_packed(), field);
1396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  else
1397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return reinterpret_cast<uint8*>(message) + offsets_[field->index()];
1398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonconst FieldDescriptor* GeneratedMessageReflection::GetOneofFieldDescriptor(
1401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const Message& message,
1402a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const OneofDescriptor* oneof_descriptor) const {
1403a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  uint32 field_number = GetOneofCase(message, oneof_descriptor);
1404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (field_number == 0) {
1405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return NULL;
1406a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
1407a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return descriptor_->FindFieldByNumber(field_number);
1408a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1409a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1410a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// -----------------------------------------------------------------------------
1411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByName(
1413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const string& name) const {
1414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (extensions_offset_ == -1) return NULL;
1415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* result = descriptor_pool_->FindExtensionByName(name);
1417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (result != NULL && result->containing_type() == descriptor_) {
1418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return result;
1419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->options().message_set_wire_format()) {
1422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // MessageSet extensions may be identified by type name.
1423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Descriptor* type = descriptor_pool_->FindMessageTypeByName(name);
1424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (type != NULL) {
1425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // Look for a matching extension in the foreign type's scope.
1426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      for (int i = 0; i < type->extension_count(); i++) {
1427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        const FieldDescriptor* extension = type->extension(i);
1428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if (extension->containing_type() == descriptor_ &&
1429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            extension->type() == FieldDescriptor::TYPE_MESSAGE &&
1430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            extension->is_optional() &&
1431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            extension->message_type() == type) {
1432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // Found it.
1433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          return extension;
1434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
1435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
1436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
1437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return NULL;
1440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByNumber(
1443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int number) const {
1444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (extensions_offset_ == -1) return NULL;
1445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return descriptor_pool_->FindExtensionByNumber(descriptor_, number);
1446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
1449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Some private helpers.
1450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// These simple template accessors obtain pointers (or references) to
1452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the given field.
1453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type>
1454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const Type& GeneratedMessageReflection::GetRaw(
1455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message, const FieldDescriptor* field) const {
1456a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (field->containing_oneof() && !HasOneofField(message, field)) {
1457a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    return DefaultRaw<Type>(field);
1458a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
1459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int index = field->containing_oneof() ?
1460a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      descriptor_->field_count() + field->containing_oneof()->index() :
1461a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      field->index();
1462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const void* ptr = reinterpret_cast<const uint8*>(&message) +
1463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      offsets_[index];
1464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return *reinterpret_cast<const Type*>(ptr);
1465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type>
1468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Type* GeneratedMessageReflection::MutableRaw(
1469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field) const {
1470a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int index = field->containing_oneof() ?
1471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      descriptor_->field_count() + field->containing_oneof()->index() :
1472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      field->index();
1473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void* ptr = reinterpret_cast<uint8*>(message) + offsets_[index];
1474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return reinterpret_cast<Type*>(ptr);
1475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type>
1478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const Type& GeneratedMessageReflection::DefaultRaw(
1479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* field) const {
1480a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const void* ptr = field->containing_oneof() ?
1481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      reinterpret_cast<const uint8*>(default_oneof_instance_) +
1482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      offsets_[field->index()] :
1483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      reinterpret_cast<const uint8*>(default_instance_) +
1484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      offsets_[field->index()];
1485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return *reinterpret_cast<const Type*>(ptr);
1486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const uint32* GeneratedMessageReflection::GetHasBits(
1489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message) const {
1490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const void* ptr = reinterpret_cast<const uint8*>(&message) + has_bits_offset_;
1491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return reinterpret_cast<const uint32*>(ptr);
1492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint32* GeneratedMessageReflection::MutableHasBits(
1494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message) const {
1495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void* ptr = reinterpret_cast<uint8*>(message) + has_bits_offset_;
1496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return reinterpret_cast<uint32*>(ptr);
1497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline uint32 GeneratedMessageReflection::GetOneofCase(
1500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const Message& message,
1501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const OneofDescriptor* oneof_descriptor) const {
1502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const void* ptr = reinterpret_cast<const uint8*>(&message)
1503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      + oneof_case_offset_;
1504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return reinterpret_cast<const uint32*>(ptr)[oneof_descriptor->index()];
1505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline uint32* GeneratedMessageReflection::MutableOneofCase(
1508a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message,
1509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const OneofDescriptor* oneof_descriptor) const {
1510a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void* ptr = reinterpret_cast<uint8*>(message) + oneof_case_offset_;
1511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return &(reinterpret_cast<uint32*>(ptr)[oneof_descriptor->index()]);
1512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const ExtensionSet& GeneratedMessageReflection::GetExtensionSet(
1515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message) const {
1516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_NE(extensions_offset_, -1);
1517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const void* ptr = reinterpret_cast<const uint8*>(&message) +
1518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    extensions_offset_;
1519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return *reinterpret_cast<const ExtensionSet*>(ptr);
1520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline ExtensionSet* GeneratedMessageReflection::MutableExtensionSet(
1522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message) const {
1523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DCHECK_NE(extensions_offset_, -1);
1524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void* ptr = reinterpret_cast<uint8*>(message) + extensions_offset_;
1525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return reinterpret_cast<ExtensionSet*>(ptr);
1526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Simple accessors for manipulating has_bits_.
1529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool GeneratedMessageReflection::HasBit(
1530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message, const FieldDescriptor* field) const {
1531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return GetHasBits(message)[field->index() / 32] &
1532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    (1 << (field->index() % 32));
1533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void GeneratedMessageReflection::SetBit(
1536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field) const {
1537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MutableHasBits(message)[field->index() / 32] |= (1 << (field->index() % 32));
1538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void GeneratedMessageReflection::ClearBit(
1541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field) const {
1542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MutableHasBits(message)[field->index() / 32] &= ~(1 << (field->index() % 32));
1543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1545a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline void GeneratedMessageReflection::SwapBit(
1546a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message1, Message* message2, const FieldDescriptor* field) const {
1547a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool temp_has_bit = HasBit(*message1, field);
1548a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (HasBit(*message2, field)) {
1549a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    SetBit(message1, field);
1550a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
1551a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ClearBit(message1, field);
1552a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
1553a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (temp_has_bit) {
1554a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    SetBit(message2, field);
1555a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
1556a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ClearBit(message2, field);
1557a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
1558a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1559a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1560a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline bool GeneratedMessageReflection::HasOneof(
1561a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const Message& message, const OneofDescriptor* oneof_descriptor) const {
1562a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return (GetOneofCase(message, oneof_descriptor) > 0);
1563a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1564a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1565a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline bool GeneratedMessageReflection::HasOneofField(
1566a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const Message& message, const FieldDescriptor* field) const {
1567a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return (GetOneofCase(message, field->containing_oneof()) == field->number());
1568a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1569a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1570a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline void GeneratedMessageReflection::SetOneofCase(
1571a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message, const FieldDescriptor* field) const {
1572a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  *MutableOneofCase(message, field->containing_oneof()) = field->number();
1573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1574a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline void GeneratedMessageReflection::ClearOneofField(
1576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message, const FieldDescriptor* field) const {
1577a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (HasOneofField(*message, field)) {
1578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ClearOneof(message, field->containing_oneof());
1579a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
1580a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsoninline void GeneratedMessageReflection::ClearOneof(
1583a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    Message* message, const OneofDescriptor* oneof_descriptor) const {
1584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // TODO(jieluo): Consider to cache the unused object instead of deleting
1585a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // it. It will be much faster if an aplication switches a lot from
1586a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // a few oneof fields.  Time/space tradeoff
1587a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  uint32 oneof_case = GetOneofCase(*message, oneof_descriptor);
1588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (oneof_case > 0) {
1589a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const FieldDescriptor* field = descriptor_->FindFieldByNumber(oneof_case);
1590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    switch (field->cpp_type()) {
1591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_STRING: {
1592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        switch (field->options().ctype()) {
1593a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          default:  // TODO(kenton):  Support other string reps.
1594a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          case FieldOptions::STRING:
1595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            delete *MutableRaw<string*>(message, field);
1596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            break;
1597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        }
1598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
1599a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      }
1600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      case FieldDescriptor::CPPTYPE_MESSAGE:
1602a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        delete *MutableRaw<Message*>(message, field);
1603a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
1604a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      default:
1605a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        break;
1606a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
1607a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1608a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    *MutableOneofCase(message, oneof_descriptor) = 0;
1609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
1610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Template implementations of basic accessors.  Inline because each
1613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// template instance is only called from one location.  These are
1614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// used for all types except messages.
1615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type>
1616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const Type& GeneratedMessageReflection::GetField(
1617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message, const FieldDescriptor* field) const {
1618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return GetRaw<Type>(message, field);
1619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type>
1622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void GeneratedMessageReflection::SetField(
1623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field, const Type& value) const {
1624a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (field->containing_oneof() && !HasOneofField(*message, field)) {
1625a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    ClearOneof(message, field->containing_oneof());
1626a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
1627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  *MutableRaw<Type>(message, field) = value;
1628a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  field->containing_oneof() ?
1629a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SetOneofCase(message, field) : SetBit(message, field);
1630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type>
1633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Type* GeneratedMessageReflection::MutableField(
1634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field) const {
1635a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  field->containing_oneof() ?
1636a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SetOneofCase(message, field) : SetBit(message, field);
1637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return MutableRaw<Type>(message, field);
1638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type>
1641d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline const Type& GeneratedMessageReflection::GetRepeatedField(
1642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message, const FieldDescriptor* field, int index) const {
1643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return GetRaw<RepeatedField<Type> >(message, field).Get(index);
1644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type>
1647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline const Type& GeneratedMessageReflection::GetRepeatedPtrField(
1648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Message& message, const FieldDescriptor* field, int index) const {
1649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return GetRaw<RepeatedPtrField<Type> >(message, field).Get(index);
1650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type>
1653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void GeneratedMessageReflection::SetRepeatedField(
1654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field,
1655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int index, Type value) const {
1656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MutableRaw<RepeatedField<Type> >(message, field)->Set(index, value);
1657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type>
1660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Type* GeneratedMessageReflection::MutableRepeatedField(
1661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field, int index) const {
1662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  RepeatedPtrField<Type>* repeated =
1663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MutableRaw<RepeatedPtrField<Type> >(message, field);
1664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return repeated->Mutable(index);
1665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type>
1668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void GeneratedMessageReflection::AddField(
1669d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Message* message, const FieldDescriptor* field, const Type& value) const {
1670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MutableRaw<RepeatedField<Type> >(message, field)->Add(value);
1671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate <typename Type>
1674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline Type* GeneratedMessageReflection::AddField(
1675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Message* message, const FieldDescriptor* field) const {
1676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  RepeatedPtrField<Type>* repeated =
1677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MutableRaw<RepeatedPtrField<Type> >(message, field);
1678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return repeated->Add();
1679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
1682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
1683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
1684