• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc.  All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 //     * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 //     * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 //     * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 
31 // Author: kenton@google.com (Kenton Varda)
32 //  Based on original Protocol Buffers design by
33 //  Sanjay Ghemawat, Jeff Dean, and others.
34 
35 #include <algorithm>
36 #include <set>
37 
38 #include <google/protobuf/stubs/logging.h>
39 #include <google/protobuf/stubs/common.h>
40 #include <google/protobuf/descriptor.pb.h>
41 #include <google/protobuf/descriptor.h>
42 #include <google/protobuf/extension_set.h>
43 #include <google/protobuf/generated_message_reflection.h>
44 #include <google/protobuf/generated_message_util.h>
45 #include <google/protobuf/map_field.h>
46 #include <google/protobuf/repeated_field.h>
47 
48 
49 #define GOOGLE_PROTOBUF_HAS_ONEOF
50 
51 namespace google {
52 namespace protobuf {
53 namespace internal {
54 
55 namespace {
IsMapFieldInApi(const FieldDescriptor * field)56 bool IsMapFieldInApi(const FieldDescriptor* field) {
57   return field->is_map();
58 }
59 }  // anonymous namespace
60 
ParseNamedEnum(const EnumDescriptor * descriptor,const string & name,int * value)61 bool ParseNamedEnum(const EnumDescriptor* descriptor,
62                     const string& name,
63                     int* value) {
64   const EnumValueDescriptor* d = descriptor->FindValueByName(name);
65   if (d == NULL) return false;
66   *value = d->number();
67   return true;
68 }
69 
NameOfEnum(const EnumDescriptor * descriptor,int value)70 const string& NameOfEnum(const EnumDescriptor* descriptor, int value) {
71   const EnumValueDescriptor* d = descriptor->FindValueByNumber(value);
72   return (d == NULL ? GetEmptyString() : d->name());
73 }
74 
75 namespace {
SupportsArenas(const Descriptor * descriptor)76 inline bool SupportsArenas(const Descriptor* descriptor) {
77   return descriptor->file()->options().cc_enable_arenas();
78 }
79 }  // anonymous namespace
80 
81 // ===================================================================
82 // Helpers for reporting usage errors (e.g. trying to use GetInt32() on
83 // a string field).
84 
85 namespace {
86 
ReportReflectionUsageError(const Descriptor * descriptor,const FieldDescriptor * field,const char * method,const char * description)87 void ReportReflectionUsageError(
88     const Descriptor* descriptor, const FieldDescriptor* field,
89     const char* method, const char* description) {
90   GOOGLE_LOG(FATAL)
91     << "Protocol Buffer reflection usage error:\n"
92        "  Method      : google::protobuf::Reflection::" << method << "\n"
93        "  Message type: " << descriptor->full_name() << "\n"
94        "  Field       : " << field->full_name() << "\n"
95        "  Problem     : " << description;
96 }
97 
98 const char* cpptype_names_[FieldDescriptor::MAX_CPPTYPE + 1] = {
99   "INVALID_CPPTYPE",
100   "CPPTYPE_INT32",
101   "CPPTYPE_INT64",
102   "CPPTYPE_UINT32",
103   "CPPTYPE_UINT64",
104   "CPPTYPE_DOUBLE",
105   "CPPTYPE_FLOAT",
106   "CPPTYPE_BOOL",
107   "CPPTYPE_ENUM",
108   "CPPTYPE_STRING",
109   "CPPTYPE_MESSAGE"
110 };
111 
ReportReflectionUsageTypeError(const Descriptor * descriptor,const FieldDescriptor * field,const char * method,FieldDescriptor::CppType expected_type)112 static void ReportReflectionUsageTypeError(
113     const Descriptor* descriptor, const FieldDescriptor* field,
114     const char* method,
115     FieldDescriptor::CppType expected_type) {
116   GOOGLE_LOG(FATAL)
117     << "Protocol Buffer reflection usage error:\n"
118        "  Method      : google::protobuf::Reflection::" << method << "\n"
119        "  Message type: " << descriptor->full_name() << "\n"
120        "  Field       : " << field->full_name() << "\n"
121        "  Problem     : Field is not the right type for this message:\n"
122        "    Expected  : " << cpptype_names_[expected_type] << "\n"
123        "    Field type: " << cpptype_names_[field->cpp_type()];
124 }
125 
ReportReflectionUsageEnumTypeError(const Descriptor * descriptor,const FieldDescriptor * field,const char * method,const EnumValueDescriptor * value)126 static void ReportReflectionUsageEnumTypeError(
127     const Descriptor* descriptor, const FieldDescriptor* field,
128     const char* method, const EnumValueDescriptor* value) {
129   GOOGLE_LOG(FATAL)
130     << "Protocol Buffer reflection usage error:\n"
131        "  Method      : google::protobuf::Reflection::" << method << "\n"
132        "  Message type: " << descriptor->full_name() << "\n"
133        "  Field       : " << field->full_name() << "\n"
134        "  Problem     : Enum value did not match field type:\n"
135        "    Expected  : " << field->enum_type()->full_name() << "\n"
136        "    Actual    : " << value->full_name();
137 }
138 
139 #define USAGE_CHECK(CONDITION, METHOD, ERROR_DESCRIPTION)                      \
140   if (!(CONDITION))                                                            \
141     ReportReflectionUsageError(descriptor_, field, #METHOD, ERROR_DESCRIPTION)
142 #define USAGE_CHECK_EQ(A, B, METHOD, ERROR_DESCRIPTION)                        \
143   USAGE_CHECK((A) == (B), METHOD, ERROR_DESCRIPTION)
144 #define USAGE_CHECK_NE(A, B, METHOD, ERROR_DESCRIPTION)                        \
145   USAGE_CHECK((A) != (B), METHOD, ERROR_DESCRIPTION)
146 
147 #define USAGE_CHECK_TYPE(METHOD, CPPTYPE)                                      \
148   if (field->cpp_type() != FieldDescriptor::CPPTYPE_##CPPTYPE)                 \
149     ReportReflectionUsageTypeError(descriptor_, field, #METHOD,                \
150                                    FieldDescriptor::CPPTYPE_##CPPTYPE)
151 
152 #define USAGE_CHECK_ENUM_VALUE(METHOD)                                         \
153   if (value->type() != field->enum_type())                                     \
154     ReportReflectionUsageEnumTypeError(descriptor_, field, #METHOD, value)
155 
156 #define USAGE_CHECK_MESSAGE_TYPE(METHOD)                                       \
157   USAGE_CHECK_EQ(field->containing_type(), descriptor_,                        \
158                  METHOD, "Field does not match message type.");
159 #define USAGE_CHECK_SINGULAR(METHOD)                                           \
160   USAGE_CHECK_NE(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD,      \
161                  "Field is repeated; the method requires a singular field.")
162 #define USAGE_CHECK_REPEATED(METHOD)                                           \
163   USAGE_CHECK_EQ(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD,      \
164                  "Field is singular; the method requires a repeated field.")
165 
166 #define USAGE_CHECK_ALL(METHOD, LABEL, CPPTYPE)                       \
167     USAGE_CHECK_MESSAGE_TYPE(METHOD);                                 \
168     USAGE_CHECK_##LABEL(METHOD);                                      \
169     USAGE_CHECK_TYPE(METHOD, CPPTYPE)
170 
171 }  // namespace
172 
173 // ===================================================================
174 
GeneratedMessageReflection(const Descriptor * descriptor,const Message * default_instance,const int offsets[],int has_bits_offset,int unknown_fields_offset,int extensions_offset,const DescriptorPool * descriptor_pool,MessageFactory * factory,int object_size,int arena_offset,int is_default_instance_offset)175 GeneratedMessageReflection::GeneratedMessageReflection(
176     const Descriptor* descriptor,
177     const Message* default_instance,
178     const int offsets[],
179     int has_bits_offset,
180     int unknown_fields_offset,
181     int extensions_offset,
182     const DescriptorPool* descriptor_pool,
183     MessageFactory* factory,
184     int object_size,
185     int arena_offset,
186     int is_default_instance_offset)
187   : descriptor_       (descriptor),
188     default_instance_ (default_instance),
189     offsets_          (offsets),
190     has_bits_offset_  (has_bits_offset),
191     unknown_fields_offset_(unknown_fields_offset),
192     extensions_offset_(extensions_offset),
193     arena_offset_     (arena_offset),
194     is_default_instance_offset_(is_default_instance_offset),
195     object_size_      (object_size),
196     descriptor_pool_  ((descriptor_pool == NULL) ?
197                          DescriptorPool::generated_pool() :
198                          descriptor_pool),
199     message_factory_  (factory) {
200 }
201 
GeneratedMessageReflection(const Descriptor * descriptor,const Message * default_instance,const int offsets[],int has_bits_offset,int unknown_fields_offset,int extensions_offset,const void * default_oneof_instance,int oneof_case_offset,const DescriptorPool * descriptor_pool,MessageFactory * factory,int object_size,int arena_offset,int is_default_instance_offset)202 GeneratedMessageReflection::GeneratedMessageReflection(
203     const Descriptor* descriptor,
204     const Message* default_instance,
205     const int offsets[],
206     int has_bits_offset,
207     int unknown_fields_offset,
208     int extensions_offset,
209     const void* default_oneof_instance,
210     int oneof_case_offset,
211     const DescriptorPool* descriptor_pool,
212     MessageFactory* factory,
213     int object_size,
214     int arena_offset,
215     int is_default_instance_offset)
216   : descriptor_       (descriptor),
217     default_instance_ (default_instance),
218     default_oneof_instance_ (default_oneof_instance),
219     offsets_          (offsets),
220     has_bits_offset_  (has_bits_offset),
221     oneof_case_offset_(oneof_case_offset),
222     unknown_fields_offset_(unknown_fields_offset),
223     extensions_offset_(extensions_offset),
224     arena_offset_     (arena_offset),
225     is_default_instance_offset_(is_default_instance_offset),
226     object_size_      (object_size),
227     descriptor_pool_  ((descriptor_pool == NULL) ?
228                          DescriptorPool::generated_pool() :
229                          descriptor_pool),
230     message_factory_  (factory) {
231 }
232 
~GeneratedMessageReflection()233 GeneratedMessageReflection::~GeneratedMessageReflection() {}
234 
235 namespace {
236 UnknownFieldSet* empty_unknown_field_set_ = NULL;
237 GOOGLE_PROTOBUF_DECLARE_ONCE(empty_unknown_field_set_once_);
238 
DeleteEmptyUnknownFieldSet()239 void DeleteEmptyUnknownFieldSet() {
240   delete empty_unknown_field_set_;
241   empty_unknown_field_set_ = NULL;
242 }
243 
InitEmptyUnknownFieldSet()244 void InitEmptyUnknownFieldSet() {
245   empty_unknown_field_set_ = new UnknownFieldSet;
246   internal::OnShutdown(&DeleteEmptyUnknownFieldSet);
247 }
248 
GetEmptyUnknownFieldSet()249 const UnknownFieldSet& GetEmptyUnknownFieldSet() {
250   ::google::protobuf::GoogleOnceInit(&empty_unknown_field_set_once_, &InitEmptyUnknownFieldSet);
251   return *empty_unknown_field_set_;
252 }
253 }  // namespace
254 
GetUnknownFields(const Message & message) const255 const UnknownFieldSet& GeneratedMessageReflection::GetUnknownFields(
256     const Message& message) const {
257   if (descriptor_->file()->syntax() == FileDescriptor::SYNTAX_PROTO3) {
258     return GetEmptyUnknownFieldSet();
259   }
260   if (unknown_fields_offset_ == kUnknownFieldSetInMetadata) {
261     return GetInternalMetadataWithArena(message).unknown_fields();
262   }
263   const void* ptr = reinterpret_cast<const uint8*>(&message) +
264                     unknown_fields_offset_;
265   return *reinterpret_cast<const UnknownFieldSet*>(ptr);
266 }
267 
MutableUnknownFields(Message * message) const268 UnknownFieldSet* GeneratedMessageReflection::MutableUnknownFields(
269     Message* message) const {
270   if (unknown_fields_offset_ == kUnknownFieldSetInMetadata) {
271     return MutableInternalMetadataWithArena(message)->
272         mutable_unknown_fields();
273   }
274   void* ptr = reinterpret_cast<uint8*>(message) + unknown_fields_offset_;
275   return reinterpret_cast<UnknownFieldSet*>(ptr);
276 }
277 
SpaceUsed(const Message & message) const278 int GeneratedMessageReflection::SpaceUsed(const Message& message) const {
279   // object_size_ already includes the in-memory representation of each field
280   // in the message, so we only need to account for additional memory used by
281   // the fields.
282   int total_size = object_size_;
283 
284   total_size += GetUnknownFields(message).SpaceUsedExcludingSelf();
285 
286   if (extensions_offset_ != -1) {
287     total_size += GetExtensionSet(message).SpaceUsedExcludingSelf();
288   }
289 
290   for (int i = 0; i < descriptor_->field_count(); i++) {
291     const FieldDescriptor* field = descriptor_->field(i);
292 
293     if (field->is_repeated()) {
294       switch (field->cpp_type()) {
295 #define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
296         case FieldDescriptor::CPPTYPE_##UPPERCASE :                           \
297           total_size += GetRaw<RepeatedField<LOWERCASE> >(message, field)     \
298                           .SpaceUsedExcludingSelf();                          \
299           break
300 
301         HANDLE_TYPE( INT32,  int32);
302         HANDLE_TYPE( INT64,  int64);
303         HANDLE_TYPE(UINT32, uint32);
304         HANDLE_TYPE(UINT64, uint64);
305         HANDLE_TYPE(DOUBLE, double);
306         HANDLE_TYPE( FLOAT,  float);
307         HANDLE_TYPE(  BOOL,   bool);
308         HANDLE_TYPE(  ENUM,    int);
309 #undef HANDLE_TYPE
310 
311         case FieldDescriptor::CPPTYPE_STRING:
312           switch (field->options().ctype()) {
313             default:  // TODO(kenton):  Support other string reps.
314             case FieldOptions::STRING:
315               total_size += GetRaw<RepeatedPtrField<string> >(message, field)
316                               .SpaceUsedExcludingSelf();
317               break;
318           }
319           break;
320 
321         case FieldDescriptor::CPPTYPE_MESSAGE:
322           if (IsMapFieldInApi(field)) {
323             total_size +=
324                 GetRaw<MapFieldBase>(message, field).SpaceUsedExcludingSelf();
325           } else {
326             // We don't know which subclass of RepeatedPtrFieldBase the type is,
327             // so we use RepeatedPtrFieldBase directly.
328             total_size +=
329                 GetRaw<RepeatedPtrFieldBase>(message, field)
330                   .SpaceUsedExcludingSelf<GenericTypeHandler<Message> >();
331           }
332 
333           break;
334       }
335     } else {
336       if (field->containing_oneof() && !HasOneofField(message, field)) {
337         continue;
338       }
339       switch (field->cpp_type()) {
340         case FieldDescriptor::CPPTYPE_INT32 :
341         case FieldDescriptor::CPPTYPE_INT64 :
342         case FieldDescriptor::CPPTYPE_UINT32:
343         case FieldDescriptor::CPPTYPE_UINT64:
344         case FieldDescriptor::CPPTYPE_DOUBLE:
345         case FieldDescriptor::CPPTYPE_FLOAT :
346         case FieldDescriptor::CPPTYPE_BOOL  :
347         case FieldDescriptor::CPPTYPE_ENUM  :
348           // Field is inline, so we've already counted it.
349           break;
350 
351         case FieldDescriptor::CPPTYPE_STRING: {
352           switch (field->options().ctype()) {
353             default:  // TODO(kenton):  Support other string reps.
354             case FieldOptions::STRING: {
355               // Initially, the string points to the default value stored in
356               // the prototype. Only count the string if it has been changed
357               // from the default value.
358               const string* default_ptr =
359                   &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
360               const string* ptr =
361                   &GetField<ArenaStringPtr>(message, field).Get(default_ptr);
362 
363               if (ptr != default_ptr) {
364                 // string fields are represented by just a pointer, so also
365                 // include sizeof(string) as well.
366                 total_size += sizeof(*ptr) + StringSpaceUsedExcludingSelf(*ptr);
367               }
368               break;
369             }
370           }
371           break;
372         }
373 
374         case FieldDescriptor::CPPTYPE_MESSAGE:
375           if (&message == default_instance_) {
376             // For singular fields, the prototype just stores a pointer to the
377             // external type's prototype, so there is no extra memory usage.
378           } else {
379             const Message* sub_message = GetRaw<const Message*>(message, field);
380             if (sub_message != NULL) {
381               total_size += sub_message->SpaceUsed();
382             }
383           }
384           break;
385       }
386     }
387   }
388 
389   return total_size;
390 }
391 
SwapField(Message * message1,Message * message2,const FieldDescriptor * field) const392 void GeneratedMessageReflection::SwapField(
393     Message* message1,
394     Message* message2,
395     const FieldDescriptor* field) const {
396   if (field->is_repeated()) {
397     switch (field->cpp_type()) {
398 #define SWAP_ARRAYS(CPPTYPE, TYPE)                                      \
399       case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
400         MutableRaw<RepeatedField<TYPE> >(message1, field)->Swap(        \
401             MutableRaw<RepeatedField<TYPE> >(message2, field));         \
402         break;
403 
404       SWAP_ARRAYS(INT32 , int32 );
405       SWAP_ARRAYS(INT64 , int64 );
406       SWAP_ARRAYS(UINT32, uint32);
407       SWAP_ARRAYS(UINT64, uint64);
408       SWAP_ARRAYS(FLOAT , float );
409       SWAP_ARRAYS(DOUBLE, double);
410       SWAP_ARRAYS(BOOL  , bool  );
411       SWAP_ARRAYS(ENUM  , int   );
412 #undef SWAP_ARRAYS
413 
414       case FieldDescriptor::CPPTYPE_STRING:
415         switch (field->options().ctype()) {
416           default:  // TODO(kenton):  Support other string reps.
417           case FieldOptions::STRING:
418             MutableRaw<RepeatedPtrFieldBase>(message1, field)->
419                 Swap<GenericTypeHandler<string> >(
420                     MutableRaw<RepeatedPtrFieldBase>(message2, field));
421             break;
422         }
423         break;
424       case FieldDescriptor::CPPTYPE_MESSAGE:
425         if (IsMapFieldInApi(field)) {
426           MutableRaw<MapFieldBase>(message1, field)->
427             MutableRepeatedField()->
428               Swap<GenericTypeHandler<google::protobuf::Message> >(
429                 MutableRaw<MapFieldBase>(message2, field)->
430                   MutableRepeatedField());
431         } else {
432           MutableRaw<RepeatedPtrFieldBase>(message1, field)->
433             Swap<GenericTypeHandler<google::protobuf::Message> >(
434               MutableRaw<RepeatedPtrFieldBase>(message2, field));
435         }
436         break;
437 
438       default:
439         GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type();
440     }
441   } else {
442     switch (field->cpp_type()) {
443 #define SWAP_VALUES(CPPTYPE, TYPE)                                      \
444       case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
445         std::swap(*MutableRaw<TYPE>(message1, field),                   \
446                   *MutableRaw<TYPE>(message2, field));                  \
447         break;
448 
449       SWAP_VALUES(INT32 , int32 );
450       SWAP_VALUES(INT64 , int64 );
451       SWAP_VALUES(UINT32, uint32);
452       SWAP_VALUES(UINT64, uint64);
453       SWAP_VALUES(FLOAT , float );
454       SWAP_VALUES(DOUBLE, double);
455       SWAP_VALUES(BOOL  , bool  );
456       SWAP_VALUES(ENUM  , int   );
457 #undef SWAP_VALUES
458       case FieldDescriptor::CPPTYPE_MESSAGE:
459         if (GetArena(message1) == GetArena(message2)) {
460           std::swap(*MutableRaw<Message*>(message1, field),
461                     *MutableRaw<Message*>(message2, field));
462         } else {
463           Message** sub_msg1 = MutableRaw<Message*>(message1, field);
464           Message** sub_msg2 = MutableRaw<Message*>(message2, field);
465           if (*sub_msg1 == NULL && *sub_msg2 == NULL) break;
466           if (*sub_msg1 && *sub_msg2) {
467             (*sub_msg1)->GetReflection()->Swap(*sub_msg1, *sub_msg2);
468             break;
469           }
470           if (*sub_msg1 == NULL) {
471             *sub_msg1 = (*sub_msg2)->New(message1->GetArena());
472             (*sub_msg1)->CopyFrom(**sub_msg2);
473             ClearField(message2, field);
474           } else {
475             *sub_msg2 = (*sub_msg1)->New(message2->GetArena());
476             (*sub_msg2)->CopyFrom(**sub_msg1);
477             ClearField(message1, field);
478           }
479         }
480         break;
481 
482       case FieldDescriptor::CPPTYPE_STRING:
483         switch (field->options().ctype()) {
484           default:  // TODO(kenton):  Support other string reps.
485           case FieldOptions::STRING:
486             {
487               Arena* arena1 = GetArena(message1);
488               Arena* arena2 = GetArena(message2);
489               ArenaStringPtr* string1 =
490                   MutableRaw<ArenaStringPtr>(message1, field);
491               ArenaStringPtr* string2 =
492                   MutableRaw<ArenaStringPtr>(message2, field);
493               if (arena1 == arena2) {
494                 string1->Swap(string2);
495               } else {
496                 const string* default_ptr =
497                     &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
498                 const string temp = string1->Get(default_ptr);
499                 string1->Set(default_ptr, string2->Get(default_ptr), arena1);
500                 string2->Set(default_ptr, temp, arena2);
501               }
502             }
503             break;
504         }
505         break;
506 
507       default:
508         GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type();
509     }
510   }
511 }
512 
SwapOneofField(Message * message1,Message * message2,const OneofDescriptor * oneof_descriptor) const513 void GeneratedMessageReflection::SwapOneofField(
514     Message* message1,
515     Message* message2,
516     const OneofDescriptor* oneof_descriptor) const {
517   uint32 oneof_case1 = GetOneofCase(*message1, oneof_descriptor);
518   uint32 oneof_case2 = GetOneofCase(*message2, oneof_descriptor);
519 
520   int32 temp_int32;
521   int64 temp_int64;
522   uint32 temp_uint32;
523   uint64 temp_uint64;
524   float temp_float;
525   double temp_double;
526   bool temp_bool;
527   int temp_int;
528   Message* temp_message = NULL;
529   string temp_string;
530 
531   // Stores message1's oneof field to a temp variable.
532   const FieldDescriptor* field1 = NULL;
533   if (oneof_case1 > 0) {
534     field1 = descriptor_->FindFieldByNumber(oneof_case1);
535     //oneof_descriptor->field(oneof_case1);
536     switch (field1->cpp_type()) {
537 #define GET_TEMP_VALUE(CPPTYPE, TYPE)                                   \
538       case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
539         temp_##TYPE = GetField<TYPE>(*message1, field1);                \
540         break;
541 
542       GET_TEMP_VALUE(INT32 , int32 );
543       GET_TEMP_VALUE(INT64 , int64 );
544       GET_TEMP_VALUE(UINT32, uint32);
545       GET_TEMP_VALUE(UINT64, uint64);
546       GET_TEMP_VALUE(FLOAT , float );
547       GET_TEMP_VALUE(DOUBLE, double);
548       GET_TEMP_VALUE(BOOL  , bool  );
549       GET_TEMP_VALUE(ENUM  , int   );
550 #undef GET_TEMP_VALUE
551       case FieldDescriptor::CPPTYPE_MESSAGE:
552         temp_message = ReleaseMessage(message1, field1);
553         break;
554 
555       case FieldDescriptor::CPPTYPE_STRING:
556         temp_string = GetString(*message1, field1);
557         break;
558 
559       default:
560         GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type();
561     }
562   }
563 
564   // Sets message1's oneof field from the message2's oneof field.
565   if (oneof_case2 > 0) {
566     const FieldDescriptor* field2 =
567         descriptor_->FindFieldByNumber(oneof_case2);
568     switch (field2->cpp_type()) {
569 #define SET_ONEOF_VALUE1(CPPTYPE, TYPE)                                 \
570       case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
571         SetField<TYPE>(message1, field2, GetField<TYPE>(*message2, field2)); \
572         break;
573 
574       SET_ONEOF_VALUE1(INT32 , int32 );
575       SET_ONEOF_VALUE1(INT64 , int64 );
576       SET_ONEOF_VALUE1(UINT32, uint32);
577       SET_ONEOF_VALUE1(UINT64, uint64);
578       SET_ONEOF_VALUE1(FLOAT , float );
579       SET_ONEOF_VALUE1(DOUBLE, double);
580       SET_ONEOF_VALUE1(BOOL  , bool  );
581       SET_ONEOF_VALUE1(ENUM  , int   );
582 #undef SET_ONEOF_VALUE1
583       case FieldDescriptor::CPPTYPE_MESSAGE:
584         SetAllocatedMessage(message1,
585                             ReleaseMessage(message2, field2),
586                             field2);
587         break;
588 
589       case FieldDescriptor::CPPTYPE_STRING:
590         SetString(message1, field2, GetString(*message2, field2));
591         break;
592 
593       default:
594         GOOGLE_LOG(FATAL) << "Unimplemented type: " << field2->cpp_type();
595     }
596   } else {
597     ClearOneof(message1, oneof_descriptor);
598   }
599 
600   // Sets message2's oneof field from the temp variable.
601   if (oneof_case1 > 0) {
602     switch (field1->cpp_type()) {
603 #define SET_ONEOF_VALUE2(CPPTYPE, TYPE)                                 \
604       case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
605         SetField<TYPE>(message2, field1, temp_##TYPE);                  \
606         break;
607 
608       SET_ONEOF_VALUE2(INT32 , int32 );
609       SET_ONEOF_VALUE2(INT64 , int64 );
610       SET_ONEOF_VALUE2(UINT32, uint32);
611       SET_ONEOF_VALUE2(UINT64, uint64);
612       SET_ONEOF_VALUE2(FLOAT , float );
613       SET_ONEOF_VALUE2(DOUBLE, double);
614       SET_ONEOF_VALUE2(BOOL  , bool  );
615       SET_ONEOF_VALUE2(ENUM  , int   );
616 #undef SET_ONEOF_VALUE2
617       case FieldDescriptor::CPPTYPE_MESSAGE:
618         SetAllocatedMessage(message2, temp_message, field1);
619         break;
620 
621       case FieldDescriptor::CPPTYPE_STRING:
622         SetString(message2, field1, temp_string);
623         break;
624 
625       default:
626         GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type();
627     }
628   } else {
629     ClearOneof(message2, oneof_descriptor);
630   }
631 }
632 
Swap(Message * message1,Message * message2) const633 void GeneratedMessageReflection::Swap(
634     Message* message1,
635     Message* message2) const {
636   if (message1 == message2) return;
637 
638   // TODO(kenton):  Other Reflection methods should probably check this too.
639   GOOGLE_CHECK_EQ(message1->GetReflection(), this)
640     << "First argument to Swap() (of type \""
641     << message1->GetDescriptor()->full_name()
642     << "\") is not compatible with this reflection object (which is for type \""
643     << descriptor_->full_name()
644     << "\").  Note that the exact same class is required; not just the same "
645        "descriptor.";
646   GOOGLE_CHECK_EQ(message2->GetReflection(), this)
647     << "Second argument to Swap() (of type \""
648     << message2->GetDescriptor()->full_name()
649     << "\") is not compatible with this reflection object (which is for type \""
650     << descriptor_->full_name()
651     << "\").  Note that the exact same class is required; not just the same "
652        "descriptor.";
653 
654   // Check that both messages are in the same arena (or both on the heap). We
655   // need to copy all data if not, due to ownership semantics.
656   if (GetArena(message1) != GetArena(message2)) {
657     // Slow copy path.
658     // Use our arena as temp space, if available.
659     Message* temp = message1->New(GetArena(message1));
660     temp->MergeFrom(*message1);
661     message1->CopyFrom(*message2);
662     message2->CopyFrom(*temp);
663     if (GetArena(message1) == NULL) {
664       delete temp;
665     }
666     return;
667   }
668 
669   if (has_bits_offset_ != -1) {
670     uint32* has_bits1 = MutableHasBits(message1);
671     uint32* has_bits2 = MutableHasBits(message2);
672     int has_bits_size = (descriptor_->field_count() + 31) / 32;
673 
674     for (int i = 0; i < has_bits_size; i++) {
675       std::swap(has_bits1[i], has_bits2[i]);
676     }
677   }
678 
679   for (int i = 0; i < descriptor_->field_count(); i++) {
680     const FieldDescriptor* field = descriptor_->field(i);
681     if (!field->containing_oneof()) {
682       SwapField(message1, message2, field);
683     }
684   }
685 
686   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
687     SwapOneofField(message1, message2, descriptor_->oneof_decl(i));
688   }
689 
690   if (extensions_offset_ != -1) {
691     MutableExtensionSet(message1)->Swap(MutableExtensionSet(message2));
692   }
693 
694   MutableUnknownFields(message1)->Swap(MutableUnknownFields(message2));
695 }
696 
SwapFields(Message * message1,Message * message2,const vector<const FieldDescriptor * > & fields) const697 void GeneratedMessageReflection::SwapFields(
698     Message* message1,
699     Message* message2,
700     const vector<const FieldDescriptor*>& fields) const {
701   if (message1 == message2) return;
702 
703   // TODO(kenton):  Other Reflection methods should probably check this too.
704   GOOGLE_CHECK_EQ(message1->GetReflection(), this)
705     << "First argument to SwapFields() (of type \""
706     << message1->GetDescriptor()->full_name()
707     << "\") is not compatible with this reflection object (which is for type \""
708     << descriptor_->full_name()
709     << "\").  Note that the exact same class is required; not just the same "
710        "descriptor.";
711   GOOGLE_CHECK_EQ(message2->GetReflection(), this)
712     << "Second argument to SwapFields() (of type \""
713     << message2->GetDescriptor()->full_name()
714     << "\") is not compatible with this reflection object (which is for type \""
715     << descriptor_->full_name()
716     << "\").  Note that the exact same class is required; not just the same "
717        "descriptor.";
718 
719   std::set<int> swapped_oneof;
720 
721   for (int i = 0; i < fields.size(); i++) {
722     const FieldDescriptor* field = fields[i];
723     if (field->is_extension()) {
724       MutableExtensionSet(message1)->SwapExtension(
725           MutableExtensionSet(message2),
726           field->number());
727     } else {
728       if (field->containing_oneof()) {
729         int oneof_index = field->containing_oneof()->index();
730         // Only swap the oneof field once.
731         if (swapped_oneof.find(oneof_index) != swapped_oneof.end()) {
732           continue;
733         }
734         swapped_oneof.insert(oneof_index);
735         SwapOneofField(message1, message2, field->containing_oneof());
736       } else {
737         // Swap has bit.
738         SwapBit(message1, message2, field);
739         // Swap field.
740         SwapField(message1, message2, field);
741       }
742     }
743   }
744 }
745 
746 // -------------------------------------------------------------------
747 
HasField(const Message & message,const FieldDescriptor * field) const748 bool GeneratedMessageReflection::HasField(const Message& message,
749                                           const FieldDescriptor* field) const {
750   USAGE_CHECK_MESSAGE_TYPE(HasField);
751   USAGE_CHECK_SINGULAR(HasField);
752 
753   if (field->is_extension()) {
754     return GetExtensionSet(message).Has(field->number());
755   } else {
756     if (field->containing_oneof()) {
757       return HasOneofField(message, field);
758     } else {
759       return HasBit(message, field);
760     }
761   }
762 }
763 
FieldSize(const Message & message,const FieldDescriptor * field) const764 int GeneratedMessageReflection::FieldSize(const Message& message,
765                                           const FieldDescriptor* field) const {
766   USAGE_CHECK_MESSAGE_TYPE(FieldSize);
767   USAGE_CHECK_REPEATED(FieldSize);
768 
769   if (field->is_extension()) {
770     return GetExtensionSet(message).ExtensionSize(field->number());
771   } else {
772     switch (field->cpp_type()) {
773 #define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
774       case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
775         return GetRaw<RepeatedField<LOWERCASE> >(message, field).size()
776 
777       HANDLE_TYPE( INT32,  int32);
778       HANDLE_TYPE( INT64,  int64);
779       HANDLE_TYPE(UINT32, uint32);
780       HANDLE_TYPE(UINT64, uint64);
781       HANDLE_TYPE(DOUBLE, double);
782       HANDLE_TYPE( FLOAT,  float);
783       HANDLE_TYPE(  BOOL,   bool);
784       HANDLE_TYPE(  ENUM,    int);
785 #undef HANDLE_TYPE
786 
787       case FieldDescriptor::CPPTYPE_STRING:
788       case FieldDescriptor::CPPTYPE_MESSAGE:
789         if (IsMapFieldInApi(field)) {
790           return GetRaw<MapFieldBase>(message, field).GetRepeatedField().size();
791         } else {
792           return GetRaw<RepeatedPtrFieldBase>(message, field).size();
793         }
794     }
795 
796     GOOGLE_LOG(FATAL) << "Can't get here.";
797     return 0;
798   }
799 }
800 
ClearField(Message * message,const FieldDescriptor * field) const801 void GeneratedMessageReflection::ClearField(
802     Message* message, const FieldDescriptor* field) const {
803   USAGE_CHECK_MESSAGE_TYPE(ClearField);
804 
805   if (field->is_extension()) {
806     MutableExtensionSet(message)->ClearExtension(field->number());
807   } else if (!field->is_repeated()) {
808     if (field->containing_oneof()) {
809       ClearOneofField(message, field);
810       return;
811     }
812 
813     if (HasBit(*message, field)) {
814       ClearBit(message, field);
815 
816       // We need to set the field back to its default value.
817       switch (field->cpp_type()) {
818 #define CLEAR_TYPE(CPPTYPE, TYPE)                                            \
819         case FieldDescriptor::CPPTYPE_##CPPTYPE:                             \
820           *MutableRaw<TYPE>(message, field) =                                \
821             field->default_value_##TYPE();                                   \
822           break;
823 
824         CLEAR_TYPE(INT32 , int32 );
825         CLEAR_TYPE(INT64 , int64 );
826         CLEAR_TYPE(UINT32, uint32);
827         CLEAR_TYPE(UINT64, uint64);
828         CLEAR_TYPE(FLOAT , float );
829         CLEAR_TYPE(DOUBLE, double);
830         CLEAR_TYPE(BOOL  , bool  );
831 #undef CLEAR_TYPE
832 
833         case FieldDescriptor::CPPTYPE_ENUM:
834           *MutableRaw<int>(message, field) =
835             field->default_value_enum()->number();
836           break;
837 
838         case FieldDescriptor::CPPTYPE_STRING: {
839           switch (field->options().ctype()) {
840             default:  // TODO(kenton):  Support other string reps.
841             case FieldOptions::STRING: {
842               const string* default_ptr =
843                   &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
844               MutableRaw<ArenaStringPtr>(message, field)->Destroy(default_ptr,
845                   GetArena(message));
846               break;
847             }
848           }
849           break;
850         }
851 
852         case FieldDescriptor::CPPTYPE_MESSAGE:
853           if (has_bits_offset_ == -1) {
854             // Proto3 does not have has-bits and we need to set a message field
855             // to NULL in order to indicate its un-presence.
856             if (GetArena(message) == NULL) {
857               delete *MutableRaw<Message*>(message, field);
858             }
859             *MutableRaw<Message*>(message, field) = NULL;
860           } else {
861             (*MutableRaw<Message*>(message, field))->Clear();
862           }
863           break;
864       }
865     }
866   } else {
867     switch (field->cpp_type()) {
868 #define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
869       case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
870         MutableRaw<RepeatedField<LOWERCASE> >(message, field)->Clear();       \
871         break
872 
873       HANDLE_TYPE( INT32,  int32);
874       HANDLE_TYPE( INT64,  int64);
875       HANDLE_TYPE(UINT32, uint32);
876       HANDLE_TYPE(UINT64, uint64);
877       HANDLE_TYPE(DOUBLE, double);
878       HANDLE_TYPE( FLOAT,  float);
879       HANDLE_TYPE(  BOOL,   bool);
880       HANDLE_TYPE(  ENUM,    int);
881 #undef HANDLE_TYPE
882 
883       case FieldDescriptor::CPPTYPE_STRING: {
884         switch (field->options().ctype()) {
885           default:  // TODO(kenton):  Support other string reps.
886           case FieldOptions::STRING:
887             MutableRaw<RepeatedPtrField<string> >(message, field)->Clear();
888             break;
889         }
890         break;
891       }
892 
893       case FieldDescriptor::CPPTYPE_MESSAGE: {
894         if (IsMapFieldInApi(field)) {
895           MutableRaw<MapFieldBase>(message, field)
896               ->MutableRepeatedField()
897               ->Clear<GenericTypeHandler<Message> >();
898         } else {
899           // We don't know which subclass of RepeatedPtrFieldBase the type is,
900           // so we use RepeatedPtrFieldBase directly.
901           MutableRaw<RepeatedPtrFieldBase>(message, field)
902               ->Clear<GenericTypeHandler<Message> >();
903         }
904         break;
905       }
906     }
907   }
908 }
909 
RemoveLast(Message * message,const FieldDescriptor * field) const910 void GeneratedMessageReflection::RemoveLast(
911     Message* message,
912     const FieldDescriptor* field) const {
913   USAGE_CHECK_MESSAGE_TYPE(RemoveLast);
914   USAGE_CHECK_REPEATED(RemoveLast);
915 
916   if (field->is_extension()) {
917     MutableExtensionSet(message)->RemoveLast(field->number());
918   } else {
919     switch (field->cpp_type()) {
920 #define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
921       case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
922         MutableRaw<RepeatedField<LOWERCASE> >(message, field)->RemoveLast();  \
923         break
924 
925       HANDLE_TYPE( INT32,  int32);
926       HANDLE_TYPE( INT64,  int64);
927       HANDLE_TYPE(UINT32, uint32);
928       HANDLE_TYPE(UINT64, uint64);
929       HANDLE_TYPE(DOUBLE, double);
930       HANDLE_TYPE( FLOAT,  float);
931       HANDLE_TYPE(  BOOL,   bool);
932       HANDLE_TYPE(  ENUM,    int);
933 #undef HANDLE_TYPE
934 
935       case FieldDescriptor::CPPTYPE_STRING:
936         switch (field->options().ctype()) {
937           default:  // TODO(kenton):  Support other string reps.
938           case FieldOptions::STRING:
939             MutableRaw<RepeatedPtrField<string> >(message, field)->RemoveLast();
940             break;
941         }
942         break;
943 
944       case FieldDescriptor::CPPTYPE_MESSAGE:
945         if (IsMapFieldInApi(field)) {
946           MutableRaw<MapFieldBase>(message, field)
947               ->MutableRepeatedField()
948               ->RemoveLast<GenericTypeHandler<Message> >();
949         } else {
950           MutableRaw<RepeatedPtrFieldBase>(message, field)
951             ->RemoveLast<GenericTypeHandler<Message> >();
952         }
953         break;
954     }
955   }
956 }
957 
ReleaseLast(Message * message,const FieldDescriptor * field) const958 Message* GeneratedMessageReflection::ReleaseLast(
959     Message* message,
960     const FieldDescriptor* field) const {
961   USAGE_CHECK_ALL(ReleaseLast, REPEATED, MESSAGE);
962 
963   if (field->is_extension()) {
964     return static_cast<Message*>(
965         MutableExtensionSet(message)->ReleaseLast(field->number()));
966   } else {
967     if (IsMapFieldInApi(field)) {
968       return MutableRaw<MapFieldBase>(message, field)
969           ->MutableRepeatedField()
970           ->ReleaseLast<GenericTypeHandler<Message> >();
971     } else {
972       return MutableRaw<RepeatedPtrFieldBase>(message, field)
973         ->ReleaseLast<GenericTypeHandler<Message> >();
974     }
975   }
976 }
977 
SwapElements(Message * message,const FieldDescriptor * field,int index1,int index2) const978 void GeneratedMessageReflection::SwapElements(
979     Message* message,
980     const FieldDescriptor* field,
981     int index1,
982     int index2) const {
983   USAGE_CHECK_MESSAGE_TYPE(Swap);
984   USAGE_CHECK_REPEATED(Swap);
985 
986   if (field->is_extension()) {
987     MutableExtensionSet(message)->SwapElements(field->number(), index1, index2);
988   } else {
989     switch (field->cpp_type()) {
990 #define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
991       case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
992         MutableRaw<RepeatedField<LOWERCASE> >(message, field)                 \
993             ->SwapElements(index1, index2);                                   \
994         break
995 
996       HANDLE_TYPE( INT32,  int32);
997       HANDLE_TYPE( INT64,  int64);
998       HANDLE_TYPE(UINT32, uint32);
999       HANDLE_TYPE(UINT64, uint64);
1000       HANDLE_TYPE(DOUBLE, double);
1001       HANDLE_TYPE( FLOAT,  float);
1002       HANDLE_TYPE(  BOOL,   bool);
1003       HANDLE_TYPE(  ENUM,    int);
1004 #undef HANDLE_TYPE
1005 
1006       case FieldDescriptor::CPPTYPE_STRING:
1007       case FieldDescriptor::CPPTYPE_MESSAGE:
1008         if (IsMapFieldInApi(field)) {
1009           MutableRaw<MapFieldBase>(message, field)
1010               ->MutableRepeatedField()
1011               ->SwapElements(index1, index2);
1012         } else {
1013           MutableRaw<RepeatedPtrFieldBase>(message, field)
1014             ->SwapElements(index1, index2);
1015         }
1016         break;
1017     }
1018   }
1019 }
1020 
1021 namespace {
1022 // Comparison functor for sorting FieldDescriptors by field number.
1023 struct FieldNumberSorter {
operator ()google::protobuf::internal::__anonc315bea40511::FieldNumberSorter1024   bool operator()(const FieldDescriptor* left,
1025                   const FieldDescriptor* right) const {
1026     return left->number() < right->number();
1027   }
1028 };
1029 }  // namespace
1030 
ListFields(const Message & message,vector<const FieldDescriptor * > * output) const1031 void GeneratedMessageReflection::ListFields(
1032     const Message& message,
1033     vector<const FieldDescriptor*>* output) const {
1034   output->clear();
1035 
1036   // Optimization:  The default instance never has any fields set.
1037   if (&message == default_instance_) return;
1038 
1039   output->reserve(descriptor_->field_count());
1040   for (int i = 0; i < descriptor_->field_count(); i++) {
1041     const FieldDescriptor* field = descriptor_->field(i);
1042     if (field->is_repeated()) {
1043       if (FieldSize(message, field) > 0) {
1044         output->push_back(field);
1045       }
1046     } else {
1047       if (field->containing_oneof()) {
1048         if (HasOneofField(message, field)) {
1049           output->push_back(field);
1050         }
1051       } else if (HasBit(message, field)) {
1052         output->push_back(field);
1053       }
1054     }
1055   }
1056 
1057   if (extensions_offset_ != -1) {
1058     GetExtensionSet(message).AppendToList(descriptor_, descriptor_pool_,
1059                                           output);
1060   }
1061 
1062   // ListFields() must sort output by field number.
1063   std::sort(output->begin(), output->end(), FieldNumberSorter());
1064 }
1065 
1066 // -------------------------------------------------------------------
1067 
1068 #undef DEFINE_PRIMITIVE_ACCESSORS
1069 #define DEFINE_PRIMITIVE_ACCESSORS(TYPENAME, TYPE, PASSTYPE, CPPTYPE)        \
1070   PASSTYPE GeneratedMessageReflection::Get##TYPENAME(                        \
1071       const Message& message, const FieldDescriptor* field) const {          \
1072     USAGE_CHECK_ALL(Get##TYPENAME, SINGULAR, CPPTYPE);                       \
1073     if (field->is_extension()) {                                             \
1074       return GetExtensionSet(message).Get##TYPENAME(                         \
1075         field->number(), field->default_value_##PASSTYPE());                 \
1076     } else {                                                                 \
1077       return GetField<TYPE>(message, field);                                 \
1078     }                                                                        \
1079   }                                                                          \
1080                                                                              \
1081   void GeneratedMessageReflection::Set##TYPENAME(                            \
1082       Message* message, const FieldDescriptor* field,                        \
1083       PASSTYPE value) const {                                                \
1084     USAGE_CHECK_ALL(Set##TYPENAME, SINGULAR, CPPTYPE);                       \
1085     if (field->is_extension()) {                                             \
1086       return MutableExtensionSet(message)->Set##TYPENAME(                    \
1087         field->number(), field->type(), value, field);                       \
1088     } else {                                                                 \
1089       SetField<TYPE>(message, field, value);                                 \
1090     }                                                                        \
1091   }                                                                          \
1092                                                                              \
1093   PASSTYPE GeneratedMessageReflection::GetRepeated##TYPENAME(                \
1094       const Message& message,                                                \
1095       const FieldDescriptor* field, int index) const {                       \
1096     USAGE_CHECK_ALL(GetRepeated##TYPENAME, REPEATED, CPPTYPE);               \
1097     if (field->is_extension()) {                                             \
1098       return GetExtensionSet(message).GetRepeated##TYPENAME(                 \
1099         field->number(), index);                                             \
1100     } else {                                                                 \
1101       return GetRepeatedField<TYPE>(message, field, index);                  \
1102     }                                                                        \
1103   }                                                                          \
1104                                                                              \
1105   void GeneratedMessageReflection::SetRepeated##TYPENAME(                    \
1106       Message* message, const FieldDescriptor* field,                        \
1107       int index, PASSTYPE value) const {                                     \
1108     USAGE_CHECK_ALL(SetRepeated##TYPENAME, REPEATED, CPPTYPE);               \
1109     if (field->is_extension()) {                                             \
1110       MutableExtensionSet(message)->SetRepeated##TYPENAME(                   \
1111         field->number(), index, value);                                      \
1112     } else {                                                                 \
1113       SetRepeatedField<TYPE>(message, field, index, value);                  \
1114     }                                                                        \
1115   }                                                                          \
1116                                                                              \
1117   void GeneratedMessageReflection::Add##TYPENAME(                            \
1118       Message* message, const FieldDescriptor* field,                        \
1119       PASSTYPE value) const {                                                \
1120     USAGE_CHECK_ALL(Add##TYPENAME, REPEATED, CPPTYPE);                       \
1121     if (field->is_extension()) {                                             \
1122       MutableExtensionSet(message)->Add##TYPENAME(                           \
1123         field->number(), field->type(), field->options().packed(), value,    \
1124         field);                                                              \
1125     } else {                                                                 \
1126       AddField<TYPE>(message, field, value);                                 \
1127     }                                                                        \
1128   }
1129 
DEFINE_PRIMITIVE_ACCESSORS(Int32,int32,int32,INT32)1130 DEFINE_PRIMITIVE_ACCESSORS(Int32 , int32 , int32 , INT32 )
1131 DEFINE_PRIMITIVE_ACCESSORS(Int64 , int64 , int64 , INT64 )
1132 DEFINE_PRIMITIVE_ACCESSORS(UInt32, uint32, uint32, UINT32)
1133 DEFINE_PRIMITIVE_ACCESSORS(UInt64, uint64, uint64, UINT64)
1134 DEFINE_PRIMITIVE_ACCESSORS(Float , float , float , FLOAT )
1135 DEFINE_PRIMITIVE_ACCESSORS(Double, double, double, DOUBLE)
1136 DEFINE_PRIMITIVE_ACCESSORS(Bool  , bool  , bool  , BOOL  )
1137 #undef DEFINE_PRIMITIVE_ACCESSORS
1138 
1139 // -------------------------------------------------------------------
1140 
1141 string GeneratedMessageReflection::GetString(
1142     const Message& message, const FieldDescriptor* field) const {
1143   USAGE_CHECK_ALL(GetString, SINGULAR, STRING);
1144   if (field->is_extension()) {
1145     return GetExtensionSet(message).GetString(field->number(),
1146                                               field->default_value_string());
1147   } else {
1148     switch (field->options().ctype()) {
1149       default:  // TODO(kenton):  Support other string reps.
1150       case FieldOptions::STRING: {
1151         const string* default_ptr =
1152             &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
1153         return GetField<ArenaStringPtr>(message, field).Get(default_ptr);
1154       }
1155     }
1156 
1157     GOOGLE_LOG(FATAL) << "Can't get here.";
1158     return GetEmptyString();  // Make compiler happy.
1159   }
1160 }
1161 
GetStringReference(const Message & message,const FieldDescriptor * field,string * scratch) const1162 const string& GeneratedMessageReflection::GetStringReference(
1163     const Message& message,
1164     const FieldDescriptor* field, string* scratch) const {
1165   USAGE_CHECK_ALL(GetStringReference, SINGULAR, STRING);
1166   if (field->is_extension()) {
1167     return GetExtensionSet(message).GetString(field->number(),
1168                                               field->default_value_string());
1169   } else {
1170     switch (field->options().ctype()) {
1171       default:  // TODO(kenton):  Support other string reps.
1172       case FieldOptions::STRING: {
1173         const string* default_ptr =
1174             &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
1175         return GetField<ArenaStringPtr>(message, field).Get(default_ptr);
1176       }
1177     }
1178 
1179     GOOGLE_LOG(FATAL) << "Can't get here.";
1180     return GetEmptyString();  // Make compiler happy.
1181   }
1182 }
1183 
1184 
SetString(Message * message,const FieldDescriptor * field,const string & value) const1185 void GeneratedMessageReflection::SetString(
1186     Message* message, const FieldDescriptor* field,
1187     const string& value) const {
1188   USAGE_CHECK_ALL(SetString, SINGULAR, STRING);
1189   if (field->is_extension()) {
1190     return MutableExtensionSet(message)->SetString(field->number(),
1191                                                    field->type(), value, field);
1192   } else {
1193     switch (field->options().ctype()) {
1194       default:  // TODO(kenton):  Support other string reps.
1195       case FieldOptions::STRING: {
1196         const string* default_ptr =
1197             &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
1198         if (field->containing_oneof() && !HasOneofField(*message, field)) {
1199           ClearOneof(message, field->containing_oneof());
1200           MutableField<ArenaStringPtr>(message, field)->UnsafeSetDefault(
1201               default_ptr);
1202         }
1203         MutableField<ArenaStringPtr>(message, field)->Set(default_ptr,
1204             value, GetArena(message));
1205         break;
1206       }
1207     }
1208   }
1209 }
1210 
1211 
GetRepeatedString(const Message & message,const FieldDescriptor * field,int index) const1212 string GeneratedMessageReflection::GetRepeatedString(
1213     const Message& message, const FieldDescriptor* field, int index) const {
1214   USAGE_CHECK_ALL(GetRepeatedString, REPEATED, STRING);
1215   if (field->is_extension()) {
1216     return GetExtensionSet(message).GetRepeatedString(field->number(), index);
1217   } else {
1218     switch (field->options().ctype()) {
1219       default:  // TODO(kenton):  Support other string reps.
1220       case FieldOptions::STRING:
1221         return GetRepeatedPtrField<string>(message, field, index);
1222     }
1223 
1224     GOOGLE_LOG(FATAL) << "Can't get here.";
1225     return GetEmptyString();  // Make compiler happy.
1226   }
1227 }
1228 
GetRepeatedStringReference(const Message & message,const FieldDescriptor * field,int index,string * scratch) const1229 const string& GeneratedMessageReflection::GetRepeatedStringReference(
1230     const Message& message, const FieldDescriptor* field,
1231     int index, string* scratch) const {
1232   USAGE_CHECK_ALL(GetRepeatedStringReference, REPEATED, STRING);
1233   if (field->is_extension()) {
1234     return GetExtensionSet(message).GetRepeatedString(field->number(), index);
1235   } else {
1236     switch (field->options().ctype()) {
1237       default:  // TODO(kenton):  Support other string reps.
1238       case FieldOptions::STRING:
1239         return GetRepeatedPtrField<string>(message, field, index);
1240     }
1241 
1242     GOOGLE_LOG(FATAL) << "Can't get here.";
1243     return GetEmptyString();  // Make compiler happy.
1244   }
1245 }
1246 
1247 
SetRepeatedString(Message * message,const FieldDescriptor * field,int index,const string & value) const1248 void GeneratedMessageReflection::SetRepeatedString(
1249     Message* message, const FieldDescriptor* field,
1250     int index, const string& value) const {
1251   USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING);
1252   if (field->is_extension()) {
1253     MutableExtensionSet(message)->SetRepeatedString(
1254       field->number(), index, value);
1255   } else {
1256     switch (field->options().ctype()) {
1257       default:  // TODO(kenton):  Support other string reps.
1258       case FieldOptions::STRING:
1259         *MutableRepeatedField<string>(message, field, index) = value;
1260         break;
1261     }
1262   }
1263 }
1264 
1265 
AddString(Message * message,const FieldDescriptor * field,const string & value) const1266 void GeneratedMessageReflection::AddString(
1267     Message* message, const FieldDescriptor* field,
1268     const string& value) const {
1269   USAGE_CHECK_ALL(AddString, REPEATED, STRING);
1270   if (field->is_extension()) {
1271     MutableExtensionSet(message)->AddString(field->number(),
1272                                             field->type(), value, field);
1273   } else {
1274     switch (field->options().ctype()) {
1275       default:  // TODO(kenton):  Support other string reps.
1276       case FieldOptions::STRING:
1277         *AddField<string>(message, field) = value;
1278         break;
1279     }
1280   }
1281 }
1282 
1283 
1284 // -------------------------------------------------------------------
1285 
CreateUnknownEnumValues(const FileDescriptor * file)1286 inline bool CreateUnknownEnumValues(const FileDescriptor* file) {
1287   return file->syntax() == FileDescriptor::SYNTAX_PROTO3;
1288 }
1289 
GetEnum(const Message & message,const FieldDescriptor * field) const1290 const EnumValueDescriptor* GeneratedMessageReflection::GetEnum(
1291     const Message& message, const FieldDescriptor* field) const {
1292   // Usage checked by GetEnumValue.
1293   int value = GetEnumValue(message, field);
1294   return field->enum_type()->FindValueByNumberCreatingIfUnknown(value);
1295 }
1296 
GetEnumValue(const Message & message,const FieldDescriptor * field) const1297 int GeneratedMessageReflection::GetEnumValue(
1298     const Message& message, const FieldDescriptor* field) const {
1299   USAGE_CHECK_ALL(GetEnumValue, SINGULAR, ENUM);
1300 
1301   int32 value;
1302   if (field->is_extension()) {
1303     value = GetExtensionSet(message).GetEnum(
1304       field->number(), field->default_value_enum()->number());
1305   } else {
1306     value = GetField<int>(message, field);
1307   }
1308   return value;
1309 }
1310 
SetEnum(Message * message,const FieldDescriptor * field,const EnumValueDescriptor * value) const1311 void GeneratedMessageReflection::SetEnum(
1312     Message* message, const FieldDescriptor* field,
1313     const EnumValueDescriptor* value) const {
1314   // Usage checked by SetEnumValue.
1315   USAGE_CHECK_ENUM_VALUE(SetEnum);
1316   SetEnumValueInternal(message, field, value->number());
1317 }
1318 
SetEnumValue(Message * message,const FieldDescriptor * field,int value) const1319 void GeneratedMessageReflection::SetEnumValue(
1320     Message* message, const FieldDescriptor* field,
1321     int value) const {
1322   USAGE_CHECK_ALL(SetEnumValue, SINGULAR, ENUM);
1323   if (!CreateUnknownEnumValues(descriptor_->file())) {
1324     // Check that the value is valid if we don't support direct storage of
1325     // unknown enum values.
1326     const EnumValueDescriptor* value_desc =
1327         field->enum_type()->FindValueByNumber(value);
1328     if (value_desc == NULL) {
1329       GOOGLE_LOG(DFATAL) << "SetEnumValue accepts only valid integer values: value "
1330                   << value << " unexpected for field " << field->full_name();
1331       // In production builds, DFATAL will not terminate the program, so we have
1332       // to do something reasonable: just set the default value.
1333       value = field->default_value_enum()->number();
1334     }
1335   }
1336   SetEnumValueInternal(message, field, value);
1337 }
1338 
SetEnumValueInternal(Message * message,const FieldDescriptor * field,int value) const1339 void GeneratedMessageReflection::SetEnumValueInternal(
1340     Message* message, const FieldDescriptor* field,
1341     int value) const {
1342   if (field->is_extension()) {
1343     MutableExtensionSet(message)->SetEnum(field->number(), field->type(),
1344                                           value, field);
1345   } else {
1346     SetField<int>(message, field, value);
1347   }
1348 }
1349 
GetRepeatedEnum(const Message & message,const FieldDescriptor * field,int index) const1350 const EnumValueDescriptor* GeneratedMessageReflection::GetRepeatedEnum(
1351     const Message& message, const FieldDescriptor* field, int index) const {
1352   // Usage checked by GetRepeatedEnumValue.
1353   int value = GetRepeatedEnumValue(message, field, index);
1354   return field->enum_type()->FindValueByNumberCreatingIfUnknown(value);
1355 }
1356 
GetRepeatedEnumValue(const Message & message,const FieldDescriptor * field,int index) const1357 int GeneratedMessageReflection::GetRepeatedEnumValue(
1358     const Message& message, const FieldDescriptor* field, int index) const {
1359   USAGE_CHECK_ALL(GetRepeatedEnumValue, REPEATED, ENUM);
1360 
1361   int value;
1362   if (field->is_extension()) {
1363     value = GetExtensionSet(message).GetRepeatedEnum(field->number(), index);
1364   } else {
1365     value = GetRepeatedField<int>(message, field, index);
1366   }
1367   return value;
1368 }
1369 
SetRepeatedEnum(Message * message,const FieldDescriptor * field,int index,const EnumValueDescriptor * value) const1370 void GeneratedMessageReflection::SetRepeatedEnum(
1371     Message* message,
1372     const FieldDescriptor* field, int index,
1373     const EnumValueDescriptor* value) const {
1374   // Usage checked by SetRepeatedEnumValue.
1375   USAGE_CHECK_ENUM_VALUE(SetRepeatedEnum);
1376   SetRepeatedEnumValueInternal(message, field, index, value->number());
1377 }
1378 
SetRepeatedEnumValue(Message * message,const FieldDescriptor * field,int index,int value) const1379 void GeneratedMessageReflection::SetRepeatedEnumValue(
1380     Message* message,
1381     const FieldDescriptor* field, int index,
1382     int value) const {
1383   USAGE_CHECK_ALL(SetRepeatedEnum, REPEATED, ENUM);
1384   if (!CreateUnknownEnumValues(descriptor_->file())) {
1385     // Check that the value is valid if we don't support direct storage of
1386     // unknown enum values.
1387     const EnumValueDescriptor* value_desc =
1388         field->enum_type()->FindValueByNumber(value);
1389     if (value_desc == NULL) {
1390       GOOGLE_LOG(DFATAL) << "SetRepeatedEnumValue accepts only valid integer values: "
1391                   << "value " << value << " unexpected for field "
1392                   << field->full_name();
1393       // In production builds, DFATAL will not terminate the program, so we have
1394       // to do something reasonable: just set the default value.
1395       value = field->default_value_enum()->number();
1396     }
1397   }
1398   SetRepeatedEnumValueInternal(message, field, index, value);
1399 }
1400 
SetRepeatedEnumValueInternal(Message * message,const FieldDescriptor * field,int index,int value) const1401 void GeneratedMessageReflection::SetRepeatedEnumValueInternal(
1402     Message* message,
1403     const FieldDescriptor* field, int index,
1404     int value) const {
1405   if (field->is_extension()) {
1406     MutableExtensionSet(message)->SetRepeatedEnum(
1407       field->number(), index, value);
1408   } else {
1409     SetRepeatedField<int>(message, field, index, value);
1410   }
1411 }
1412 
AddEnum(Message * message,const FieldDescriptor * field,const EnumValueDescriptor * value) const1413 void GeneratedMessageReflection::AddEnum(
1414     Message* message, const FieldDescriptor* field,
1415     const EnumValueDescriptor* value) const {
1416   // Usage checked by AddEnumValue.
1417   USAGE_CHECK_ENUM_VALUE(AddEnum);
1418   AddEnumValueInternal(message, field, value->number());
1419 }
1420 
AddEnumValue(Message * message,const FieldDescriptor * field,int value) const1421 void GeneratedMessageReflection::AddEnumValue(
1422     Message* message, const FieldDescriptor* field,
1423     int value) const {
1424   USAGE_CHECK_ALL(AddEnum, REPEATED, ENUM);
1425   if (!CreateUnknownEnumValues(descriptor_->file())) {
1426     // Check that the value is valid if we don't support direct storage of
1427     // unknown enum values.
1428     const EnumValueDescriptor* value_desc =
1429         field->enum_type()->FindValueByNumber(value);
1430     if (value_desc == NULL) {
1431       GOOGLE_LOG(DFATAL) << "AddEnumValue accepts only valid integer values: value "
1432                   << value << " unexpected for field " << field->full_name();
1433       // In production builds, DFATAL will not terminate the program, so we have
1434       // to do something reasonable: just set the default value.
1435       value = field->default_value_enum()->number();
1436     }
1437   }
1438   AddEnumValueInternal(message, field, value);
1439 }
1440 
AddEnumValueInternal(Message * message,const FieldDescriptor * field,int value) const1441 void GeneratedMessageReflection::AddEnumValueInternal(
1442     Message* message, const FieldDescriptor* field,
1443     int value) const {
1444   if (field->is_extension()) {
1445     MutableExtensionSet(message)->AddEnum(field->number(), field->type(),
1446                                           field->options().packed(),
1447                                           value, field);
1448   } else {
1449     AddField<int>(message, field, value);
1450   }
1451 }
1452 
1453 // -------------------------------------------------------------------
1454 
GetMessage(const Message & message,const FieldDescriptor * field,MessageFactory * factory) const1455 const Message& GeneratedMessageReflection::GetMessage(
1456     const Message& message, const FieldDescriptor* field,
1457     MessageFactory* factory) const {
1458   USAGE_CHECK_ALL(GetMessage, SINGULAR, MESSAGE);
1459 
1460   if (factory == NULL) factory = message_factory_;
1461 
1462   if (field->is_extension()) {
1463     return static_cast<const Message&>(
1464         GetExtensionSet(message).GetMessage(
1465           field->number(), field->message_type(), factory));
1466   } else {
1467     const Message* result;
1468     result = GetRaw<const Message*>(message, field);
1469     if (result == NULL) {
1470       result = DefaultRaw<const Message*>(field);
1471     }
1472     return *result;
1473   }
1474 }
1475 
MutableMessage(Message * message,const FieldDescriptor * field,MessageFactory * factory) const1476 Message* GeneratedMessageReflection::MutableMessage(
1477     Message* message, const FieldDescriptor* field,
1478     MessageFactory* factory) const {
1479   USAGE_CHECK_ALL(MutableMessage, SINGULAR, MESSAGE);
1480 
1481   if (factory == NULL) factory = message_factory_;
1482 
1483   if (field->is_extension()) {
1484     return static_cast<Message*>(
1485         MutableExtensionSet(message)->MutableMessage(field, factory));
1486   } else {
1487     Message* result;
1488     Message** result_holder = MutableRaw<Message*>(message, field);
1489 
1490     if (field->containing_oneof()) {
1491       if (!HasOneofField(*message, field)) {
1492         ClearOneof(message, field->containing_oneof());
1493         result_holder = MutableField<Message*>(message, field);
1494         const Message* default_message = DefaultRaw<const Message*>(field);
1495         *result_holder = default_message->New(message->GetArena());
1496       }
1497     } else {
1498       SetBit(message, field);
1499     }
1500 
1501     if (*result_holder == NULL) {
1502       const Message* default_message = DefaultRaw<const Message*>(field);
1503       *result_holder = default_message->New(message->GetArena());
1504     }
1505     result = *result_holder;
1506     return result;
1507   }
1508 }
1509 
UnsafeArenaSetAllocatedMessage(Message * message,Message * sub_message,const FieldDescriptor * field) const1510 void GeneratedMessageReflection::UnsafeArenaSetAllocatedMessage(
1511     Message* message,
1512     Message* sub_message,
1513     const FieldDescriptor* field) const {
1514   USAGE_CHECK_ALL(SetAllocatedMessage, SINGULAR, MESSAGE);
1515 
1516   if (field->is_extension()) {
1517     MutableExtensionSet(message)->SetAllocatedMessage(
1518         field->number(), field->type(), field, sub_message);
1519   } else {
1520     if (field->containing_oneof()) {
1521       if (sub_message == NULL) {
1522         ClearOneof(message, field->containing_oneof());
1523         return;
1524       }
1525         ClearOneof(message, field->containing_oneof());
1526         *MutableRaw<Message*>(message, field) = sub_message;
1527       SetOneofCase(message, field);
1528       return;
1529     }
1530 
1531     if (sub_message == NULL) {
1532       ClearBit(message, field);
1533     } else {
1534       SetBit(message, field);
1535     }
1536     Message** sub_message_holder = MutableRaw<Message*>(message, field);
1537     if (GetArena(message) == NULL) {
1538       delete *sub_message_holder;
1539     }
1540     *sub_message_holder = sub_message;
1541   }
1542 }
1543 
SetAllocatedMessage(Message * message,Message * sub_message,const FieldDescriptor * field) const1544 void GeneratedMessageReflection::SetAllocatedMessage(
1545     Message* message,
1546     Message* sub_message,
1547     const FieldDescriptor* field) const {
1548   // If message and sub-message are in different memory ownership domains
1549   // (different arenas, or one is on heap and one is not), then we may need to
1550   // do a copy.
1551   if (sub_message != NULL &&
1552       sub_message->GetArena() != message->GetArena()) {
1553     if (sub_message->GetArena() == NULL && message->GetArena() != NULL) {
1554       // Case 1: parent is on an arena and child is heap-allocated. We can add
1555       // the child to the arena's Own() list to free on arena destruction, then
1556       // set our pointer.
1557       message->GetArena()->Own(sub_message);
1558       UnsafeArenaSetAllocatedMessage(message, sub_message, field);
1559     } else {
1560       // Case 2: all other cases. We need to make a copy. MutableMessage() will
1561       // either get the existing message object, or instantiate a new one as
1562       // appropriate w.r.t. our arena.
1563       Message* sub_message_copy = MutableMessage(message, field);
1564       sub_message_copy->CopyFrom(*sub_message);
1565     }
1566   } else {
1567     // Same memory ownership domains.
1568     UnsafeArenaSetAllocatedMessage(message, sub_message, field);
1569   }
1570 }
1571 
UnsafeArenaReleaseMessage(Message * message,const FieldDescriptor * field,MessageFactory * factory) const1572 Message* GeneratedMessageReflection::UnsafeArenaReleaseMessage(
1573     Message* message,
1574     const FieldDescriptor* field,
1575     MessageFactory* factory) const {
1576   USAGE_CHECK_ALL(ReleaseMessage, SINGULAR, MESSAGE);
1577 
1578   if (factory == NULL) factory = message_factory_;
1579 
1580   if (field->is_extension()) {
1581     return static_cast<Message*>(
1582         MutableExtensionSet(message)->ReleaseMessage(field, factory));
1583   } else {
1584     ClearBit(message, field);
1585     if (field->containing_oneof()) {
1586       if (HasOneofField(*message, field)) {
1587         *MutableOneofCase(message, field->containing_oneof()) = 0;
1588       } else {
1589         return NULL;
1590       }
1591     }
1592     Message** result = MutableRaw<Message*>(message, field);
1593     Message* ret = *result;
1594     *result = NULL;
1595     return ret;
1596   }
1597 }
1598 
ReleaseMessage(Message * message,const FieldDescriptor * field,MessageFactory * factory) const1599 Message* GeneratedMessageReflection::ReleaseMessage(
1600     Message* message,
1601     const FieldDescriptor* field,
1602     MessageFactory* factory) const {
1603   Message* released = UnsafeArenaReleaseMessage(message, field, factory);
1604   if (GetArena(message) != NULL && released != NULL) {
1605     Message* copy_from_arena = released->New();
1606     copy_from_arena->CopyFrom(*released);
1607     released = copy_from_arena;
1608   }
1609   return released;
1610 }
1611 
GetRepeatedMessage(const Message & message,const FieldDescriptor * field,int index) const1612 const Message& GeneratedMessageReflection::GetRepeatedMessage(
1613     const Message& message, const FieldDescriptor* field, int index) const {
1614   USAGE_CHECK_ALL(GetRepeatedMessage, REPEATED, MESSAGE);
1615 
1616   if (field->is_extension()) {
1617     return static_cast<const Message&>(
1618         GetExtensionSet(message).GetRepeatedMessage(field->number(), index));
1619   } else {
1620     if (IsMapFieldInApi(field)) {
1621       return GetRaw<MapFieldBase>(message, field)
1622           .GetRepeatedField()
1623           .Get<GenericTypeHandler<Message> >(index);
1624     } else {
1625       return GetRaw<RepeatedPtrFieldBase>(message, field)
1626           .Get<GenericTypeHandler<Message> >(index);
1627     }
1628   }
1629 }
1630 
MutableRepeatedMessage(Message * message,const FieldDescriptor * field,int index) const1631 Message* GeneratedMessageReflection::MutableRepeatedMessage(
1632     Message* message, const FieldDescriptor* field, int index) const {
1633   USAGE_CHECK_ALL(MutableRepeatedMessage, REPEATED, MESSAGE);
1634 
1635   if (field->is_extension()) {
1636     return static_cast<Message*>(
1637         MutableExtensionSet(message)->MutableRepeatedMessage(
1638           field->number(), index));
1639   } else {
1640     if (IsMapFieldInApi(field)) {
1641       return MutableRaw<MapFieldBase>(message, field)
1642           ->MutableRepeatedField()
1643           ->Mutable<GenericTypeHandler<Message> >(index);
1644     } else {
1645       return MutableRaw<RepeatedPtrFieldBase>(message, field)
1646         ->Mutable<GenericTypeHandler<Message> >(index);
1647     }
1648   }
1649 }
1650 
AddMessage(Message * message,const FieldDescriptor * field,MessageFactory * factory) const1651 Message* GeneratedMessageReflection::AddMessage(
1652     Message* message, const FieldDescriptor* field,
1653     MessageFactory* factory) const {
1654   USAGE_CHECK_ALL(AddMessage, REPEATED, MESSAGE);
1655 
1656   if (factory == NULL) factory = message_factory_;
1657 
1658   if (field->is_extension()) {
1659     return static_cast<Message*>(
1660         MutableExtensionSet(message)->AddMessage(field, factory));
1661   } else {
1662     Message* result = NULL;
1663 
1664     // We can't use AddField<Message>() because RepeatedPtrFieldBase doesn't
1665     // know how to allocate one.
1666     RepeatedPtrFieldBase* repeated = NULL;
1667     if (IsMapFieldInApi(field)) {
1668       repeated =
1669           MutableRaw<MapFieldBase>(message, field)->MutableRepeatedField();
1670     } else {
1671       repeated = MutableRaw<RepeatedPtrFieldBase>(message, field);
1672     }
1673     result = repeated->AddFromCleared<GenericTypeHandler<Message> >();
1674     if (result == NULL) {
1675       // We must allocate a new object.
1676       const Message* prototype;
1677       if (repeated->size() == 0) {
1678         prototype = factory->GetPrototype(field->message_type());
1679       } else {
1680         prototype = &repeated->Get<GenericTypeHandler<Message> >(0);
1681       }
1682       result = prototype->New(message->GetArena());
1683       // We can guarantee here that repeated and result are either both heap
1684       // allocated or arena owned. So it is safe to call the unsafe version
1685       // of AddAllocated.
1686       repeated->UnsafeArenaAddAllocated<GenericTypeHandler<Message> >(result);
1687     }
1688 
1689     return result;
1690   }
1691 }
1692 
AddAllocatedMessage(Message * message,const FieldDescriptor * field,Message * new_entry) const1693 void GeneratedMessageReflection::AddAllocatedMessage(
1694     Message* message, const FieldDescriptor* field,
1695     Message* new_entry) const {
1696   USAGE_CHECK_ALL(AddAllocatedMessage, REPEATED, MESSAGE);
1697 
1698   if (field->is_extension()) {
1699     MutableExtensionSet(message)->AddAllocatedMessage(field, new_entry);
1700   } else {
1701     RepeatedPtrFieldBase* repeated = NULL;
1702     if (IsMapFieldInApi(field)) {
1703       repeated =
1704           MutableRaw<MapFieldBase>(message, field)->MutableRepeatedField();
1705     } else {
1706       repeated = MutableRaw<RepeatedPtrFieldBase>(message, field);
1707     }
1708     repeated->AddAllocated<GenericTypeHandler<Message> >(new_entry);
1709   }
1710 }
1711 
MutableRawRepeatedField(Message * message,const FieldDescriptor * field,FieldDescriptor::CppType cpptype,int ctype,const Descriptor * desc) const1712 void* GeneratedMessageReflection::MutableRawRepeatedField(
1713     Message* message, const FieldDescriptor* field,
1714     FieldDescriptor::CppType cpptype,
1715     int ctype, const Descriptor* desc) const {
1716   USAGE_CHECK_REPEATED("MutableRawRepeatedField");
1717   if (field->cpp_type() != cpptype)
1718     ReportReflectionUsageTypeError(descriptor_,
1719         field, "MutableRawRepeatedField", cpptype);
1720   if (ctype >= 0)
1721     GOOGLE_CHECK_EQ(field->options().ctype(), ctype) << "subtype mismatch";
1722   if (desc != NULL)
1723     GOOGLE_CHECK_EQ(field->message_type(), desc) << "wrong submessage type";
1724   if (field->is_extension()) {
1725     return MutableExtensionSet(message)->MutableRawRepeatedField(
1726         field->number(), field->type(), field->is_packed(), field);
1727   } else {
1728     // Trigger transform for MapField
1729     if (IsMapFieldInApi(field)) {
1730       return reinterpret_cast<MapFieldBase*>(reinterpret_cast<uint8*>(message) +
1731                                              offsets_[field->index()])
1732           ->MutableRepeatedField();
1733     }
1734     return reinterpret_cast<uint8*>(message) + offsets_[field->index()];
1735   }
1736 }
1737 
GetRawRepeatedField(const Message & message,const FieldDescriptor * field,FieldDescriptor::CppType cpptype,int ctype,const Descriptor * desc) const1738 const void* GeneratedMessageReflection::GetRawRepeatedField(
1739     const Message& message, const FieldDescriptor* field,
1740     FieldDescriptor::CppType cpptype,
1741     int ctype, const Descriptor* desc) const {
1742   USAGE_CHECK_REPEATED("GetRawRepeatedField");
1743   if (field->cpp_type() != cpptype)
1744     ReportReflectionUsageTypeError(descriptor_,
1745         field, "GetRawRepeatedField", cpptype);
1746   if (ctype >= 0)
1747     GOOGLE_CHECK_EQ(field->options().ctype(), ctype) << "subtype mismatch";
1748   if (desc != NULL)
1749     GOOGLE_CHECK_EQ(field->message_type(), desc) << "wrong submessage type";
1750   if (field->is_extension()) {
1751     // Should use extension_set::GetRawRepeatedField. However, the required
1752     // parameter "default repeated value" is not very easy to get here.
1753     // Map is not supported in extensions, it is acceptable to use
1754     // extension_set::MutableRawRepeatedField which does not change the message.
1755     return MutableExtensionSet(const_cast<Message*>(&message))
1756         ->MutableRawRepeatedField(
1757         field->number(), field->type(), field->is_packed(), field);
1758   } else {
1759     // Trigger transform for MapField
1760     if (IsMapFieldInApi(field)) {
1761       return &(reinterpret_cast<const MapFieldBase*>(
1762           reinterpret_cast<const uint8*>(&message) +
1763           offsets_[field->index()])->GetRepeatedField());
1764     }
1765     return reinterpret_cast<const uint8*>(&message) + offsets_[field->index()];
1766   }
1767 }
1768 
GetOneofFieldDescriptor(const Message & message,const OneofDescriptor * oneof_descriptor) const1769 const FieldDescriptor* GeneratedMessageReflection::GetOneofFieldDescriptor(
1770     const Message& message,
1771     const OneofDescriptor* oneof_descriptor) const {
1772   uint32 field_number = GetOneofCase(message, oneof_descriptor);
1773   if (field_number == 0) {
1774     return NULL;
1775   }
1776   return descriptor_->FindFieldByNumber(field_number);
1777 }
1778 
ContainsMapKey(const Message & message,const FieldDescriptor * field,const MapKey & key) const1779 bool GeneratedMessageReflection::ContainsMapKey(
1780     const Message& message,
1781     const FieldDescriptor* field,
1782     const MapKey& key) const {
1783   USAGE_CHECK(IsMapFieldInApi(field),
1784               "LookupMapValue",
1785               "Field is not a map field.");
1786   return GetRaw<MapFieldBase>(message, field).ContainsMapKey(key);
1787 }
1788 
InsertOrLookupMapValue(Message * message,const FieldDescriptor * field,const MapKey & key,MapValueRef * val) const1789 bool GeneratedMessageReflection::InsertOrLookupMapValue(
1790     Message* message,
1791     const FieldDescriptor* field,
1792     const MapKey& key,
1793     MapValueRef* val) const {
1794   USAGE_CHECK(IsMapFieldInApi(field),
1795               "InsertOrLookupMapValue",
1796               "Field is not a map field.");
1797   val->SetType(field->message_type()->FindFieldByName("value")->cpp_type());
1798   return MutableRaw<MapFieldBase>(message, field)->InsertOrLookupMapValue(
1799       key, val);
1800 }
1801 
DeleteMapValue(Message * message,const FieldDescriptor * field,const MapKey & key) const1802 bool GeneratedMessageReflection::DeleteMapValue(
1803     Message* message,
1804     const FieldDescriptor* field,
1805     const MapKey& key) const {
1806   USAGE_CHECK(IsMapFieldInApi(field),
1807               "DeleteMapValue",
1808               "Field is not a map field.");
1809   return MutableRaw<MapFieldBase>(message, field)->DeleteMapValue(key);
1810 }
1811 
MapBegin(Message * message,const FieldDescriptor * field) const1812 MapIterator GeneratedMessageReflection::MapBegin(
1813     Message* message,
1814     const FieldDescriptor* field) const {
1815   USAGE_CHECK(IsMapFieldInApi(field),
1816               "MapBegin",
1817               "Field is not a map field.");
1818   MapIterator iter(message, field);
1819   GetRaw<MapFieldBase>(*message, field).MapBegin(&iter);
1820   return iter;
1821 }
1822 
MapEnd(Message * message,const FieldDescriptor * field) const1823 MapIterator GeneratedMessageReflection::MapEnd(
1824     Message* message,
1825     const FieldDescriptor* field) const {
1826   USAGE_CHECK(IsMapFieldInApi(field),
1827               "MapEnd",
1828               "Field is not a map field.");
1829   MapIterator iter(message, field);
1830   GetRaw<MapFieldBase>(*message, field).MapEnd(&iter);
1831   return iter;
1832 }
1833 
MapSize(const Message & message,const FieldDescriptor * field) const1834 int GeneratedMessageReflection::MapSize(
1835     const Message& message,
1836     const FieldDescriptor* field) const {
1837   USAGE_CHECK(IsMapFieldInApi(field),
1838               "MapSize",
1839               "Field is not a map field.");
1840   return GetRaw<MapFieldBase>(message, field).size();
1841 }
1842 
1843 // -----------------------------------------------------------------------------
1844 
FindKnownExtensionByName(const string & name) const1845 const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByName(
1846     const string& name) const {
1847   if (extensions_offset_ == -1) return NULL;
1848 
1849   const FieldDescriptor* result = descriptor_pool_->FindExtensionByName(name);
1850   if (result != NULL && result->containing_type() == descriptor_) {
1851     return result;
1852   }
1853 
1854   if (descriptor_->options().message_set_wire_format()) {
1855     // MessageSet extensions may be identified by type name.
1856     const Descriptor* type = descriptor_pool_->FindMessageTypeByName(name);
1857     if (type != NULL) {
1858       // Look for a matching extension in the foreign type's scope.
1859       for (int i = 0; i < type->extension_count(); i++) {
1860         const FieldDescriptor* extension = type->extension(i);
1861         if (extension->containing_type() == descriptor_ &&
1862             extension->type() == FieldDescriptor::TYPE_MESSAGE &&
1863             extension->is_optional() &&
1864             extension->message_type() == type) {
1865           // Found it.
1866           return extension;
1867         }
1868       }
1869     }
1870   }
1871 
1872   return NULL;
1873 }
1874 
FindKnownExtensionByNumber(int number) const1875 const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByNumber(
1876     int number) const {
1877   if (extensions_offset_ == -1) return NULL;
1878   return descriptor_pool_->FindExtensionByNumber(descriptor_, number);
1879 }
1880 
SupportsUnknownEnumValues() const1881 bool GeneratedMessageReflection::SupportsUnknownEnumValues() const {
1882   return CreateUnknownEnumValues(descriptor_->file());
1883 }
1884 
1885 // ===================================================================
1886 // Some private helpers.
1887 
1888 // These simple template accessors obtain pointers (or references) to
1889 // the given field.
1890 template <typename Type>
GetRaw(const Message & message,const FieldDescriptor * field) const1891 inline const Type& GeneratedMessageReflection::GetRaw(
1892     const Message& message, const FieldDescriptor* field) const {
1893   if (field->containing_oneof() && !HasOneofField(message, field)) {
1894     return DefaultRaw<Type>(field);
1895   }
1896   int index = field->containing_oneof() ?
1897       descriptor_->field_count() + field->containing_oneof()->index() :
1898       field->index();
1899   const void* ptr = reinterpret_cast<const uint8*>(&message) +
1900       offsets_[index];
1901   return *reinterpret_cast<const Type*>(ptr);
1902 }
1903 
1904 template <typename Type>
MutableRaw(Message * message,const FieldDescriptor * field) const1905 inline Type* GeneratedMessageReflection::MutableRaw(
1906     Message* message, const FieldDescriptor* field) const {
1907   int index = field->containing_oneof() ?
1908       descriptor_->field_count() + field->containing_oneof()->index() :
1909       field->index();
1910   void* ptr = reinterpret_cast<uint8*>(message) + offsets_[index];
1911   return reinterpret_cast<Type*>(ptr);
1912 }
1913 
1914 template <typename Type>
DefaultRaw(const FieldDescriptor * field) const1915 inline const Type& GeneratedMessageReflection::DefaultRaw(
1916     const FieldDescriptor* field) const {
1917   const void* ptr = field->containing_oneof() ?
1918       reinterpret_cast<const uint8*>(default_oneof_instance_) +
1919       offsets_[field->index()] :
1920       reinterpret_cast<const uint8*>(default_instance_) +
1921       offsets_[field->index()];
1922   return *reinterpret_cast<const Type*>(ptr);
1923 }
1924 
GetHasBits(const Message & message) const1925 inline const uint32* GeneratedMessageReflection::GetHasBits(
1926     const Message& message) const {
1927   if (has_bits_offset_ == -1) {  // proto3 with no has-bits.
1928     return NULL;
1929   }
1930   const void* ptr = reinterpret_cast<const uint8*>(&message) + has_bits_offset_;
1931   return reinterpret_cast<const uint32*>(ptr);
1932 }
MutableHasBits(Message * message) const1933 inline uint32* GeneratedMessageReflection::MutableHasBits(
1934     Message* message) const {
1935   if (has_bits_offset_ == -1) {
1936     return NULL;
1937   }
1938   void* ptr = reinterpret_cast<uint8*>(message) + has_bits_offset_;
1939   return reinterpret_cast<uint32*>(ptr);
1940 }
1941 
GetOneofCase(const Message & message,const OneofDescriptor * oneof_descriptor) const1942 inline uint32 GeneratedMessageReflection::GetOneofCase(
1943     const Message& message,
1944     const OneofDescriptor* oneof_descriptor) const {
1945   const void* ptr = reinterpret_cast<const uint8*>(&message)
1946       + oneof_case_offset_;
1947   return reinterpret_cast<const uint32*>(ptr)[oneof_descriptor->index()];
1948 }
1949 
MutableOneofCase(Message * message,const OneofDescriptor * oneof_descriptor) const1950 inline uint32* GeneratedMessageReflection::MutableOneofCase(
1951     Message* message,
1952     const OneofDescriptor* oneof_descriptor) const {
1953   void* ptr = reinterpret_cast<uint8*>(message) + oneof_case_offset_;
1954   return &(reinterpret_cast<uint32*>(ptr)[oneof_descriptor->index()]);
1955 }
1956 
GetExtensionSet(const Message & message) const1957 inline const ExtensionSet& GeneratedMessageReflection::GetExtensionSet(
1958     const Message& message) const {
1959   GOOGLE_DCHECK_NE(extensions_offset_, -1);
1960   const void* ptr = reinterpret_cast<const uint8*>(&message) +
1961                     extensions_offset_;
1962   return *reinterpret_cast<const ExtensionSet*>(ptr);
1963 }
MutableExtensionSet(Message * message) const1964 inline ExtensionSet* GeneratedMessageReflection::MutableExtensionSet(
1965     Message* message) const {
1966   GOOGLE_DCHECK_NE(extensions_offset_, -1);
1967   void* ptr = reinterpret_cast<uint8*>(message) + extensions_offset_;
1968   return reinterpret_cast<ExtensionSet*>(ptr);
1969 }
1970 
GetArena(Message * message) const1971 inline Arena* GeneratedMessageReflection::GetArena(Message* message) const {
1972   if (arena_offset_ == kNoArenaPointer) {
1973     return NULL;
1974   }
1975 
1976   if (unknown_fields_offset_ == kUnknownFieldSetInMetadata) {
1977     // zero-overhead arena pointer overloading UnknownFields
1978     return GetInternalMetadataWithArena(*message).arena();
1979   }
1980 
1981   // Baseline case: message class has a dedicated arena pointer.
1982   void* ptr = reinterpret_cast<uint8*>(message) + arena_offset_;
1983   return *reinterpret_cast<Arena**>(ptr);
1984 }
1985 
1986 inline const InternalMetadataWithArena&
GetInternalMetadataWithArena(const Message & message) const1987 GeneratedMessageReflection::GetInternalMetadataWithArena(
1988     const Message& message) const {
1989   const void* ptr = reinterpret_cast<const uint8*>(&message) + arena_offset_;
1990   return *reinterpret_cast<const InternalMetadataWithArena*>(ptr);
1991 }
1992 
1993 inline InternalMetadataWithArena*
MutableInternalMetadataWithArena(Message * message) const1994 GeneratedMessageReflection::MutableInternalMetadataWithArena(
1995     Message* message) const {
1996   void* ptr = reinterpret_cast<uint8*>(message) + arena_offset_;
1997   return reinterpret_cast<InternalMetadataWithArena*>(ptr);
1998 }
1999 
2000 inline bool
GetIsDefaultInstance(const Message & message) const2001 GeneratedMessageReflection::GetIsDefaultInstance(
2002     const Message& message) const {
2003   if (is_default_instance_offset_ == kHasNoDefaultInstanceField) {
2004     return false;
2005   }
2006   const void* ptr = reinterpret_cast<const uint8*>(&message) +
2007       is_default_instance_offset_;
2008   return *reinterpret_cast<const bool*>(ptr);
2009 }
2010 
2011 // Simple accessors for manipulating has_bits_.
HasBit(const Message & message,const FieldDescriptor * field) const2012 inline bool GeneratedMessageReflection::HasBit(
2013     const Message& message, const FieldDescriptor* field) const {
2014   if (has_bits_offset_ == -1) {
2015     // proto3: no has-bits. All fields present except messages, which are
2016     // present only if their message-field pointer is non-NULL.
2017     if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
2018       return !GetIsDefaultInstance(message) &&
2019           GetRaw<const Message*>(message, field) != NULL;
2020     } else {
2021       // Non-message field (and non-oneof, since that was handled in HasField()
2022       // before calling us), and singular (again, checked in HasField). So, this
2023       // field must be a scalar.
2024 
2025       // Scalar primitive (numeric or string/bytes) fields are present if
2026       // their value is non-zero (numeric) or non-empty (string/bytes).  N.B.:
2027       // we must use this definition here, rather than the "scalar fields
2028       // always present" in the proto3 docs, because MergeFrom() semantics
2029       // require presence as "present on wire", and reflection-based merge
2030       // (which uses HasField()) needs to be consistent with this.
2031       switch (field->cpp_type()) {
2032         case FieldDescriptor::CPPTYPE_STRING:
2033           switch (field->options().ctype()) {
2034             default: {
2035               const string* default_ptr =
2036                   &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
2037               return GetField<ArenaStringPtr>(message, field).Get(
2038                   default_ptr).size() > 0;
2039             }
2040           }
2041           return false;
2042         case FieldDescriptor::CPPTYPE_BOOL:
2043           return GetRaw<bool>(message, field) != false;
2044         case FieldDescriptor::CPPTYPE_INT32:
2045           return GetRaw<int32>(message, field) != 0;
2046         case FieldDescriptor::CPPTYPE_INT64:
2047           return GetRaw<int64>(message, field) != 0;
2048         case FieldDescriptor::CPPTYPE_UINT32:
2049           return GetRaw<uint32>(message, field) != 0;
2050         case FieldDescriptor::CPPTYPE_UINT64:
2051           return GetRaw<uint64>(message, field) != 0;
2052         case FieldDescriptor::CPPTYPE_FLOAT:
2053           return GetRaw<float>(message, field) != 0.0;
2054         case FieldDescriptor::CPPTYPE_DOUBLE:
2055           return GetRaw<double>(message, field) != 0.0;
2056         case FieldDescriptor::CPPTYPE_ENUM:
2057           return GetRaw<int>(message, field) != 0;
2058         case FieldDescriptor::CPPTYPE_MESSAGE:
2059           // handled above; avoid warning
2060           GOOGLE_LOG(FATAL) << "Reached impossible case in HasBit().";
2061           break;
2062       }
2063     }
2064   }
2065   return GetHasBits(message)[field->index() / 32] &
2066     (1 << (field->index() % 32));
2067 }
2068 
SetBit(Message * message,const FieldDescriptor * field) const2069 inline void GeneratedMessageReflection::SetBit(
2070     Message* message, const FieldDescriptor* field) const {
2071   if (has_bits_offset_ == -1) {
2072     return;
2073   }
2074   MutableHasBits(message)[field->index() / 32] |= (1 << (field->index() % 32));
2075 }
2076 
ClearBit(Message * message,const FieldDescriptor * field) const2077 inline void GeneratedMessageReflection::ClearBit(
2078     Message* message, const FieldDescriptor* field) const {
2079   if (has_bits_offset_ == -1) {
2080     return;
2081   }
2082   MutableHasBits(message)[field->index() / 32] &= ~(1 << (field->index() % 32));
2083 }
2084 
SwapBit(Message * message1,Message * message2,const FieldDescriptor * field) const2085 inline void GeneratedMessageReflection::SwapBit(
2086     Message* message1, Message* message2, const FieldDescriptor* field) const {
2087   if (has_bits_offset_ == -1) {
2088     return;
2089   }
2090   bool temp_has_bit = HasBit(*message1, field);
2091   if (HasBit(*message2, field)) {
2092     SetBit(message1, field);
2093   } else {
2094     ClearBit(message1, field);
2095   }
2096   if (temp_has_bit) {
2097     SetBit(message2, field);
2098   } else {
2099     ClearBit(message2, field);
2100   }
2101 }
2102 
HasOneof(const Message & message,const OneofDescriptor * oneof_descriptor) const2103 inline bool GeneratedMessageReflection::HasOneof(
2104     const Message& message, const OneofDescriptor* oneof_descriptor) const {
2105   return (GetOneofCase(message, oneof_descriptor) > 0);
2106 }
2107 
HasOneofField(const Message & message,const FieldDescriptor * field) const2108 inline bool GeneratedMessageReflection::HasOneofField(
2109     const Message& message, const FieldDescriptor* field) const {
2110   return (GetOneofCase(message, field->containing_oneof()) == field->number());
2111 }
2112 
SetOneofCase(Message * message,const FieldDescriptor * field) const2113 inline void GeneratedMessageReflection::SetOneofCase(
2114     Message* message, const FieldDescriptor* field) const {
2115   *MutableOneofCase(message, field->containing_oneof()) = field->number();
2116 }
2117 
ClearOneofField(Message * message,const FieldDescriptor * field) const2118 inline void GeneratedMessageReflection::ClearOneofField(
2119     Message* message, const FieldDescriptor* field) const {
2120   if (HasOneofField(*message, field)) {
2121     ClearOneof(message, field->containing_oneof());
2122   }
2123 }
2124 
ClearOneof(Message * message,const OneofDescriptor * oneof_descriptor) const2125 inline void GeneratedMessageReflection::ClearOneof(
2126     Message* message, const OneofDescriptor* oneof_descriptor) const {
2127   // TODO(jieluo): Consider to cache the unused object instead of deleting
2128   // it. It will be much faster if an aplication switches a lot from
2129   // a few oneof fields.  Time/space tradeoff
2130   uint32 oneof_case = GetOneofCase(*message, oneof_descriptor);
2131   if (oneof_case > 0) {
2132     const FieldDescriptor* field = descriptor_->FindFieldByNumber(oneof_case);
2133     if (GetArena(message) == NULL) {
2134       switch (field->cpp_type()) {
2135         case FieldDescriptor::CPPTYPE_STRING: {
2136           switch (field->options().ctype()) {
2137             default:  // TODO(kenton):  Support other string reps.
2138             case FieldOptions::STRING: {
2139               const string* default_ptr =
2140                   &DefaultRaw<ArenaStringPtr>(field).Get(NULL);
2141               MutableField<ArenaStringPtr>(message, field)->
2142                   Destroy(default_ptr, GetArena(message));
2143               break;
2144             }
2145           }
2146           break;
2147         }
2148 
2149         case FieldDescriptor::CPPTYPE_MESSAGE:
2150           delete *MutableRaw<Message*>(message, field);
2151           break;
2152         default:
2153           break;
2154       }
2155     }
2156 
2157     *MutableOneofCase(message, oneof_descriptor) = 0;
2158   }
2159 }
2160 
2161 // Template implementations of basic accessors.  Inline because each
2162 // template instance is only called from one location.  These are
2163 // used for all types except messages.
2164 template <typename Type>
GetField(const Message & message,const FieldDescriptor * field) const2165 inline const Type& GeneratedMessageReflection::GetField(
2166     const Message& message, const FieldDescriptor* field) const {
2167   return GetRaw<Type>(message, field);
2168 }
2169 
2170 template <typename Type>
SetField(Message * message,const FieldDescriptor * field,const Type & value) const2171 inline void GeneratedMessageReflection::SetField(
2172     Message* message, const FieldDescriptor* field, const Type& value) const {
2173   if (field->containing_oneof() && !HasOneofField(*message, field)) {
2174     ClearOneof(message, field->containing_oneof());
2175   }
2176   *MutableRaw<Type>(message, field) = value;
2177   field->containing_oneof() ?
2178       SetOneofCase(message, field) : SetBit(message, field);
2179 }
2180 
2181 template <typename Type>
MutableField(Message * message,const FieldDescriptor * field) const2182 inline Type* GeneratedMessageReflection::MutableField(
2183     Message* message, const FieldDescriptor* field) const {
2184   field->containing_oneof() ?
2185       SetOneofCase(message, field) : SetBit(message, field);
2186   return MutableRaw<Type>(message, field);
2187 }
2188 
2189 template <typename Type>
GetRepeatedField(const Message & message,const FieldDescriptor * field,int index) const2190 inline const Type& GeneratedMessageReflection::GetRepeatedField(
2191     const Message& message, const FieldDescriptor* field, int index) const {
2192   return GetRaw<RepeatedField<Type> >(message, field).Get(index);
2193 }
2194 
2195 template <typename Type>
GetRepeatedPtrField(const Message & message,const FieldDescriptor * field,int index) const2196 inline const Type& GeneratedMessageReflection::GetRepeatedPtrField(
2197     const Message& message, const FieldDescriptor* field, int index) const {
2198   return GetRaw<RepeatedPtrField<Type> >(message, field).Get(index);
2199 }
2200 
2201 template <typename Type>
SetRepeatedField(Message * message,const FieldDescriptor * field,int index,Type value) const2202 inline void GeneratedMessageReflection::SetRepeatedField(
2203     Message* message, const FieldDescriptor* field,
2204     int index, Type value) const {
2205   MutableRaw<RepeatedField<Type> >(message, field)->Set(index, value);
2206 }
2207 
2208 template <typename Type>
MutableRepeatedField(Message * message,const FieldDescriptor * field,int index) const2209 inline Type* GeneratedMessageReflection::MutableRepeatedField(
2210     Message* message, const FieldDescriptor* field, int index) const {
2211   RepeatedPtrField<Type>* repeated =
2212     MutableRaw<RepeatedPtrField<Type> >(message, field);
2213   return repeated->Mutable(index);
2214 }
2215 
2216 template <typename Type>
AddField(Message * message,const FieldDescriptor * field,const Type & value) const2217 inline void GeneratedMessageReflection::AddField(
2218     Message* message, const FieldDescriptor* field, const Type& value) const {
2219   MutableRaw<RepeatedField<Type> >(message, field)->Add(value);
2220 }
2221 
2222 template <typename Type>
AddField(Message * message,const FieldDescriptor * field) const2223 inline Type* GeneratedMessageReflection::AddField(
2224     Message* message, const FieldDescriptor* field) const {
2225   RepeatedPtrField<Type>* repeated =
2226     MutableRaw<RepeatedPtrField<Type> >(message, field);
2227   return repeated->Add();
2228 }
2229 
GetMessageFactory() const2230 MessageFactory* GeneratedMessageReflection::GetMessageFactory() const {
2231   return message_factory_;
2232 }
2233 
RepeatedFieldData(Message * message,const FieldDescriptor * field,FieldDescriptor::CppType cpp_type,const Descriptor * message_type) const2234 void* GeneratedMessageReflection::RepeatedFieldData(
2235     Message* message, const FieldDescriptor* field,
2236     FieldDescriptor::CppType cpp_type,
2237     const Descriptor* message_type) const {
2238   GOOGLE_CHECK(field->is_repeated());
2239   GOOGLE_CHECK(field->cpp_type() == cpp_type ||
2240         (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM &&
2241          cpp_type == FieldDescriptor::CPPTYPE_INT32))
2242       << "The type parameter T in RepeatedFieldRef<T> API doesn't match "
2243       << "the actual field type (for enums T should be the generated enum "
2244       << "type or int32).";
2245   if (message_type != NULL) {
2246     GOOGLE_CHECK_EQ(message_type, field->message_type());
2247   }
2248   if (field->is_extension()) {
2249     return MutableExtensionSet(message)->MutableRawRepeatedField(
2250         field->number(), field->type(), field->is_packed(), field);
2251   } else {
2252     return reinterpret_cast<uint8*>(message) + offsets_[field->index()];
2253   }
2254 }
2255 
MapData(Message * message,const FieldDescriptor * field) const2256 MapFieldBase* GeneratedMessageReflection::MapData(
2257     Message* message, const FieldDescriptor* field) const {
2258   USAGE_CHECK(IsMapFieldInApi(field),
2259               "GetMapData",
2260               "Field is not a map field.");
2261   return MutableRaw<MapFieldBase>(message, field);
2262 }
2263 
2264 GeneratedMessageReflection*
NewGeneratedMessageReflection(const Descriptor * descriptor,const Message * default_instance,const int offsets[],int has_bits_offset,int unknown_fields_offset,int extensions_offset,const void * default_oneof_instance,int oneof_case_offset,int object_size,int arena_offset,int is_default_instance_offset)2265 GeneratedMessageReflection::NewGeneratedMessageReflection(
2266     const Descriptor* descriptor,
2267     const Message* default_instance,
2268     const int offsets[],
2269     int has_bits_offset,
2270     int unknown_fields_offset,
2271     int extensions_offset,
2272     const void* default_oneof_instance,
2273     int oneof_case_offset,
2274     int object_size,
2275     int arena_offset,
2276     int is_default_instance_offset) {
2277   return new GeneratedMessageReflection(descriptor,
2278                                         default_instance,
2279                                         offsets,
2280                                         has_bits_offset,
2281                                         unknown_fields_offset,
2282                                         extensions_offset,
2283                                         default_oneof_instance,
2284                                         oneof_case_offset,
2285                                         DescriptorPool::generated_pool(),
2286                                         MessageFactory::generated_factory(),
2287                                         object_size,
2288                                         arena_offset,
2289                                         is_default_instance_offset);
2290 }
2291 
2292 GeneratedMessageReflection*
NewGeneratedMessageReflection(const Descriptor * descriptor,const Message * default_instance,const int offsets[],int has_bits_offset,int unknown_fields_offset,int extensions_offset,int object_size,int arena_offset,int is_default_instance_offset)2293 GeneratedMessageReflection::NewGeneratedMessageReflection(
2294     const Descriptor* descriptor,
2295     const Message* default_instance,
2296     const int offsets[],
2297     int has_bits_offset,
2298     int unknown_fields_offset,
2299     int extensions_offset,
2300     int object_size,
2301     int arena_offset,
2302     int is_default_instance_offset) {
2303   return new GeneratedMessageReflection(descriptor,
2304                                         default_instance,
2305                                         offsets,
2306                                         has_bits_offset,
2307                                         unknown_fields_offset,
2308                                         extensions_offset,
2309                                         DescriptorPool::generated_pool(),
2310                                         MessageFactory::generated_factory(),
2311                                         object_size,
2312                                         arena_offset,
2313                                         is_default_instance_offset);
2314 }
2315 
2316 }  // namespace internal
2317 }  // namespace protobuf
2318 }  // namespace google
2319