generated_message_reflection.cc revision fbaaef999ba563838ebd00874ed8a1c01fbf286d
1// Protocol Buffers - Google's data interchange format
2// Copyright 2008 Google Inc.  All rights reserved.
3// http://code.google.com/p/protobuf/
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 <google/protobuf/generated_message_reflection.h>
37#include <google/protobuf/descriptor.h>
38#include <google/protobuf/descriptor.pb.h>
39#include <google/protobuf/repeated_field.h>
40#include <google/protobuf/extension_set.h>
41#include <google/protobuf/generated_message_util.h>
42#include <google/protobuf/stubs/common.h>
43
44namespace google {
45namespace protobuf {
46namespace internal {
47
48namespace { const string kEmptyString; }
49
50int StringSpaceUsedExcludingSelf(const string& str) {
51  const void* start = &str;
52  const void* end = &str + 1;
53
54  if (start <= str.data() && str.data() <= end) {
55    // The string's data is stored inside the string object itself.
56    return 0;
57  } else {
58    return str.capacity();
59  }
60}
61
62bool ParseNamedEnum(const EnumDescriptor* descriptor,
63                    const string& name,
64                    int* value) {
65  const EnumValueDescriptor* d = descriptor->FindValueByName(name);
66  if (d == NULL) return false;
67  *value = d->number();
68  return true;
69}
70
71const string& NameOfEnum(const EnumDescriptor* descriptor, int value) {
72  static string kEmptyString;
73  const EnumValueDescriptor* d = descriptor->FindValueByNumber(value);
74  return (d == NULL ? kEmptyString : d->name());
75}
76
77// ===================================================================
78// Helpers for reporting usage errors (e.g. trying to use GetInt32() on
79// a string field).
80
81namespace {
82
83void ReportReflectionUsageError(
84    const Descriptor* descriptor, const FieldDescriptor* field,
85    const char* method, const char* description) {
86  GOOGLE_LOG(FATAL)
87    << "Protocol Buffer reflection usage error:\n"
88       "  Method      : google::protobuf::Reflection::" << method << "\n"
89       "  Message type: " << descriptor->full_name() << "\n"
90       "  Field       : " << field->full_name() << "\n"
91       "  Problem     : " << description;
92}
93
94const char* cpptype_names_[FieldDescriptor::MAX_CPPTYPE + 1] = {
95  "INVALID_CPPTYPE",
96  "CPPTYPE_INT32",
97  "CPPTYPE_INT64",
98  "CPPTYPE_UINT32",
99  "CPPTYPE_UINT64",
100  "CPPTYPE_DOUBLE",
101  "CPPTYPE_FLOAT",
102  "CPPTYPE_BOOL",
103  "CPPTYPE_ENUM",
104  "CPPTYPE_STRING",
105  "CPPTYPE_MESSAGE"
106};
107
108static void ReportReflectionUsageTypeError(
109    const Descriptor* descriptor, const FieldDescriptor* field,
110    const char* method,
111    FieldDescriptor::CppType expected_type) {
112  GOOGLE_LOG(FATAL)
113    << "Protocol Buffer reflection usage error:\n"
114       "  Method      : google::protobuf::Reflection::" << method << "\n"
115       "  Message type: " << descriptor->full_name() << "\n"
116       "  Field       : " << field->full_name() << "\n"
117       "  Problem     : Field is not the right type for this message:\n"
118       "    Expected  : " << cpptype_names_[expected_type] << "\n"
119       "    Field type: " << cpptype_names_[field->cpp_type()];
120}
121
122static void ReportReflectionUsageEnumTypeError(
123    const Descriptor* descriptor, const FieldDescriptor* field,
124    const char* method, const EnumValueDescriptor* value) {
125  GOOGLE_LOG(FATAL)
126    << "Protocol Buffer reflection usage error:\n"
127       "  Method      : google::protobuf::Reflection::" << method << "\n"
128       "  Message type: " << descriptor->full_name() << "\n"
129       "  Field       : " << field->full_name() << "\n"
130       "  Problem     : Enum value did not match field type:\n"
131       "    Expected  : " << field->enum_type()->full_name() << "\n"
132       "    Actual    : " << value->full_name();
133}
134
135#define USAGE_CHECK(CONDITION, METHOD, ERROR_DESCRIPTION)                      \
136  if (!(CONDITION))                                                            \
137    ReportReflectionUsageError(descriptor_, field, #METHOD, ERROR_DESCRIPTION)
138#define USAGE_CHECK_EQ(A, B, METHOD, ERROR_DESCRIPTION)                        \
139  USAGE_CHECK((A) == (B), METHOD, ERROR_DESCRIPTION)
140#define USAGE_CHECK_NE(A, B, METHOD, ERROR_DESCRIPTION)                        \
141  USAGE_CHECK((A) != (B), METHOD, ERROR_DESCRIPTION)
142
143#define USAGE_CHECK_TYPE(METHOD, CPPTYPE)                                      \
144  if (field->cpp_type() != FieldDescriptor::CPPTYPE_##CPPTYPE)                 \
145    ReportReflectionUsageTypeError(descriptor_, field, #METHOD,                \
146                                   FieldDescriptor::CPPTYPE_##CPPTYPE)
147
148#define USAGE_CHECK_ENUM_VALUE(METHOD)                                         \
149  if (value->type() != field->enum_type())                                     \
150    ReportReflectionUsageEnumTypeError(descriptor_, field, #METHOD, value)
151
152#define USAGE_CHECK_MESSAGE_TYPE(METHOD)                                       \
153  USAGE_CHECK_EQ(field->containing_type(), descriptor_,                        \
154                 METHOD, "Field does not match message type.");
155#define USAGE_CHECK_SINGULAR(METHOD)                                           \
156  USAGE_CHECK_NE(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD,      \
157                 "Field is repeated; the method requires a singular field.")
158#define USAGE_CHECK_REPEATED(METHOD)                                           \
159  USAGE_CHECK_EQ(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD,      \
160                 "Field is singular; the method requires a repeated field.")
161
162#define USAGE_CHECK_ALL(METHOD, LABEL, CPPTYPE)                       \
163    USAGE_CHECK_MESSAGE_TYPE(METHOD);                                 \
164    USAGE_CHECK_##LABEL(METHOD);                                      \
165    USAGE_CHECK_TYPE(METHOD, CPPTYPE)
166
167}  // namespace
168
169// ===================================================================
170
171GeneratedMessageReflection::GeneratedMessageReflection(
172    const Descriptor* descriptor,
173    const Message* default_instance,
174    const int offsets[],
175    int has_bits_offset,
176    int unknown_fields_offset,
177    int extensions_offset,
178    const DescriptorPool* descriptor_pool,
179    MessageFactory* factory,
180    int object_size)
181  : descriptor_       (descriptor),
182    default_instance_ (default_instance),
183    offsets_          (offsets),
184    has_bits_offset_  (has_bits_offset),
185    unknown_fields_offset_(unknown_fields_offset),
186    extensions_offset_(extensions_offset),
187    object_size_      (object_size),
188    descriptor_pool_  ((descriptor_pool == NULL) ?
189                         DescriptorPool::generated_pool() :
190                         descriptor_pool),
191    message_factory_  (factory) {
192}
193
194GeneratedMessageReflection::~GeneratedMessageReflection() {}
195
196const UnknownFieldSet& GeneratedMessageReflection::GetUnknownFields(
197    const Message& message) const {
198  const void* ptr = reinterpret_cast<const uint8*>(&message) +
199                    unknown_fields_offset_;
200  return *reinterpret_cast<const UnknownFieldSet*>(ptr);
201}
202UnknownFieldSet* GeneratedMessageReflection::MutableUnknownFields(
203    Message* message) const {
204  void* ptr = reinterpret_cast<uint8*>(message) + unknown_fields_offset_;
205  return reinterpret_cast<UnknownFieldSet*>(ptr);
206}
207
208int GeneratedMessageReflection::SpaceUsed(const Message& message) const {
209  // object_size_ already includes the in-memory representation of each field
210  // in the message, so we only need to account for additional memory used by
211  // the fields.
212  int total_size = object_size_;
213
214  total_size += GetUnknownFields(message).SpaceUsedExcludingSelf();
215
216  if (extensions_offset_ != -1) {
217    total_size += GetExtensionSet(message).SpaceUsedExcludingSelf();
218  }
219
220  for (int i = 0; i < descriptor_->field_count(); i++) {
221    const FieldDescriptor* field = descriptor_->field(i);
222
223    if (field->is_repeated()) {
224      switch (field->cpp_type()) {
225#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
226        case FieldDescriptor::CPPTYPE_##UPPERCASE :                           \
227          total_size += GetRaw<RepeatedField<LOWERCASE> >(message, field)     \
228                          .SpaceUsedExcludingSelf();                          \
229          break
230
231        HANDLE_TYPE( INT32,  int32);
232        HANDLE_TYPE( INT64,  int64);
233        HANDLE_TYPE(UINT32, uint32);
234        HANDLE_TYPE(UINT64, uint64);
235        HANDLE_TYPE(DOUBLE, double);
236        HANDLE_TYPE( FLOAT,  float);
237        HANDLE_TYPE(  BOOL,   bool);
238        HANDLE_TYPE(  ENUM,    int);
239#undef HANDLE_TYPE
240
241        case FieldDescriptor::CPPTYPE_STRING:
242            total_size += GetRaw<RepeatedPtrField<string> >(message, field)
243                            .SpaceUsedExcludingSelf();
244          break;
245
246        case FieldDescriptor::CPPTYPE_MESSAGE:
247          // We don't know which subclass of RepeatedPtrFieldBase the type is,
248          // so we use RepeatedPtrFieldBase directly.
249          total_size +=
250              GetRaw<RepeatedPtrFieldBase>(message, field)
251                .SpaceUsedExcludingSelf<GenericTypeHandler<Message> >();
252          break;
253      }
254    } else {
255      switch (field->cpp_type()) {
256        case FieldDescriptor::CPPTYPE_INT32 :
257        case FieldDescriptor::CPPTYPE_INT64 :
258        case FieldDescriptor::CPPTYPE_UINT32:
259        case FieldDescriptor::CPPTYPE_UINT64:
260        case FieldDescriptor::CPPTYPE_DOUBLE:
261        case FieldDescriptor::CPPTYPE_FLOAT :
262        case FieldDescriptor::CPPTYPE_BOOL  :
263        case FieldDescriptor::CPPTYPE_ENUM  :
264          // Field is inline, so we've already counted it.
265          break;
266
267        case FieldDescriptor::CPPTYPE_STRING: {
268            const string* ptr = GetField<const string*>(message, field);
269
270            // Initially, the string points to the default value stored in
271            // the prototype. Only count the string if it has been changed
272            // from the default value.
273            const string* default_ptr = DefaultRaw<const string*>(field);
274
275            if (ptr != default_ptr) {
276              // string fields are represented by just a pointer, so also
277              // include sizeof(string) as well.
278              total_size += sizeof(*ptr) + StringSpaceUsedExcludingSelf(*ptr);
279            }
280          break;
281        }
282
283        case FieldDescriptor::CPPTYPE_MESSAGE:
284          if (&message == default_instance_) {
285            // For singular fields, the prototype just stores a pointer to the
286            // external type's prototype, so there is no extra memory usage.
287          } else {
288            const Message* sub_message = GetRaw<const Message*>(message, field);
289            if (sub_message != NULL) {
290              total_size += sub_message->SpaceUsed();
291            }
292          }
293          break;
294      }
295    }
296  }
297
298  return total_size;
299}
300
301void GeneratedMessageReflection::Swap(
302    Message* message1,
303    Message* message2) const {
304  if (message1 == message2) return;
305
306  // TODO(kenton):  Other Reflection methods should probably check this too.
307  GOOGLE_CHECK_EQ(message1->GetReflection(), this)
308    << "First argument to Swap() (of type \""
309    << message1->GetDescriptor()->full_name()
310    << "\") is not compatible with this reflection object (which is for type \""
311    << descriptor_->full_name()
312    << "\").  Note that the exact same class is required; not just the same "
313       "descriptor.";
314  GOOGLE_CHECK_EQ(message2->GetReflection(), this)
315    << "Second argument to Swap() (of type \""
316    << message1->GetDescriptor()->full_name()
317    << "\") is not compatible with this reflection object (which is for type \""
318    << descriptor_->full_name()
319    << "\").  Note that the exact same class is required; not just the same "
320       "descriptor.";
321
322  uint32* has_bits1 = MutableHasBits(message1);
323  uint32* has_bits2 = MutableHasBits(message2);
324  int has_bits_size = (descriptor_->field_count() + 31) / 32;
325
326  for (int i = 0; i < has_bits_size; i++) {
327    swap(has_bits1[i], has_bits2[i]);
328  }
329
330  for (int i = 0; i < descriptor_->field_count(); i++) {
331    const FieldDescriptor* field = descriptor_->field(i);
332    if (field->is_repeated()) {
333      switch (field->cpp_type()) {
334#define SWAP_ARRAYS(CPPTYPE, TYPE)                                           \
335        case FieldDescriptor::CPPTYPE_##CPPTYPE:                             \
336          MutableRaw<RepeatedField<TYPE> >(message1, field)->Swap(           \
337              MutableRaw<RepeatedField<TYPE> >(message2, field));            \
338          break;
339
340          SWAP_ARRAYS(INT32 , int32 );
341          SWAP_ARRAYS(INT64 , int64 );
342          SWAP_ARRAYS(UINT32, uint32);
343          SWAP_ARRAYS(UINT64, uint64);
344          SWAP_ARRAYS(FLOAT , float );
345          SWAP_ARRAYS(DOUBLE, double);
346          SWAP_ARRAYS(BOOL  , bool  );
347          SWAP_ARRAYS(ENUM  , int   );
348#undef SWAP_ARRAYS
349
350        case FieldDescriptor::CPPTYPE_STRING:
351        case FieldDescriptor::CPPTYPE_MESSAGE:
352          MutableRaw<RepeatedPtrFieldBase>(message1, field)->Swap(
353              MutableRaw<RepeatedPtrFieldBase>(message2, field));
354          break;
355
356        default:
357          GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type();
358      }
359    } else {
360      switch (field->cpp_type()) {
361#define SWAP_VALUES(CPPTYPE, TYPE)                                           \
362        case FieldDescriptor::CPPTYPE_##CPPTYPE:                             \
363          swap(*MutableRaw<TYPE>(message1, field),                           \
364               *MutableRaw<TYPE>(message2, field));                          \
365          break;
366
367          SWAP_VALUES(INT32 , int32 );
368          SWAP_VALUES(INT64 , int64 );
369          SWAP_VALUES(UINT32, uint32);
370          SWAP_VALUES(UINT64, uint64);
371          SWAP_VALUES(FLOAT , float );
372          SWAP_VALUES(DOUBLE, double);
373          SWAP_VALUES(BOOL  , bool  );
374          SWAP_VALUES(ENUM  , int   );
375          SWAP_VALUES(MESSAGE, Message*);
376#undef SWAP_VALUES
377
378        case FieldDescriptor::CPPTYPE_STRING:
379            swap(*MutableRaw<string*>(message1, field),
380                 *MutableRaw<string*>(message2, field));
381          break;
382
383        default:
384          GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type();
385      }
386    }
387  }
388
389  if (extensions_offset_ != -1) {
390    MutableExtensionSet(message1)->Swap(MutableExtensionSet(message2));
391  }
392
393  MutableUnknownFields(message1)->Swap(MutableUnknownFields(message2));
394}
395
396// -------------------------------------------------------------------
397
398bool GeneratedMessageReflection::HasField(const Message& message,
399                                          const FieldDescriptor* field) const {
400  USAGE_CHECK_MESSAGE_TYPE(HasField);
401  USAGE_CHECK_SINGULAR(HasField);
402
403  if (field->is_extension()) {
404    return GetExtensionSet(message).Has(field->number());
405  } else {
406    return HasBit(message, field);
407  }
408}
409
410int GeneratedMessageReflection::FieldSize(const Message& message,
411                                          const FieldDescriptor* field) const {
412  USAGE_CHECK_MESSAGE_TYPE(FieldSize);
413  USAGE_CHECK_REPEATED(FieldSize);
414
415  if (field->is_extension()) {
416    return GetExtensionSet(message).ExtensionSize(field->number());
417  } else {
418    switch (field->cpp_type()) {
419#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
420      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
421        return GetRaw<RepeatedField<LOWERCASE> >(message, field).size()
422
423      HANDLE_TYPE( INT32,  int32);
424      HANDLE_TYPE( INT64,  int64);
425      HANDLE_TYPE(UINT32, uint32);
426      HANDLE_TYPE(UINT64, uint64);
427      HANDLE_TYPE(DOUBLE, double);
428      HANDLE_TYPE( FLOAT,  float);
429      HANDLE_TYPE(  BOOL,   bool);
430      HANDLE_TYPE(  ENUM,    int);
431#undef HANDLE_TYPE
432
433      case FieldDescriptor::CPPTYPE_STRING:
434      case FieldDescriptor::CPPTYPE_MESSAGE:
435        return GetRaw<RepeatedPtrFieldBase>(message, field).size();
436    }
437
438    GOOGLE_LOG(FATAL) << "Can't get here.";
439    return 0;
440  }
441}
442
443void GeneratedMessageReflection::ClearField(
444    Message* message, const FieldDescriptor* field) const {
445  USAGE_CHECK_MESSAGE_TYPE(ClearField);
446
447  if (field->is_extension()) {
448    MutableExtensionSet(message)->ClearExtension(field->number());
449  } else if (!field->is_repeated()) {
450    if (HasBit(*message, field)) {
451      ClearBit(message, field);
452
453      // We need to set the field back to its default value.
454      switch (field->cpp_type()) {
455#define CLEAR_TYPE(CPPTYPE, TYPE)                                            \
456        case FieldDescriptor::CPPTYPE_##CPPTYPE:                             \
457          *MutableRaw<TYPE>(message, field) =                                \
458            field->default_value_##TYPE();                                   \
459          break;
460
461        CLEAR_TYPE(INT32 , int32 );
462        CLEAR_TYPE(INT64 , int64 );
463        CLEAR_TYPE(UINT32, uint32);
464        CLEAR_TYPE(UINT64, uint64);
465        CLEAR_TYPE(FLOAT , float );
466        CLEAR_TYPE(DOUBLE, double);
467        CLEAR_TYPE(BOOL  , bool  );
468#undef CLEAR_TYPE
469
470        case FieldDescriptor::CPPTYPE_ENUM:
471          *MutableRaw<int>(message, field) =
472            field->default_value_enum()->number();
473          break;
474
475        case FieldDescriptor::CPPTYPE_STRING: {
476            const string* default_ptr = DefaultRaw<const string*>(field);
477            string** value = MutableRaw<string*>(message, field);
478            if (*value != default_ptr) {
479              if (field->has_default_value()) {
480                (*value)->assign(field->default_value_string());
481              } else {
482                (*value)->clear();
483              }
484            }
485          break;
486        }
487
488        case FieldDescriptor::CPPTYPE_MESSAGE:
489          (*MutableRaw<Message*>(message, field))->Clear();
490          break;
491      }
492    }
493  } else {
494    switch (field->cpp_type()) {
495#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
496      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
497        MutableRaw<RepeatedField<LOWERCASE> >(message, field)->Clear();       \
498        break
499
500      HANDLE_TYPE( INT32,  int32);
501      HANDLE_TYPE( INT64,  int64);
502      HANDLE_TYPE(UINT32, uint32);
503      HANDLE_TYPE(UINT64, uint64);
504      HANDLE_TYPE(DOUBLE, double);
505      HANDLE_TYPE( FLOAT,  float);
506      HANDLE_TYPE(  BOOL,   bool);
507      HANDLE_TYPE(  ENUM,    int);
508#undef HANDLE_TYPE
509
510      case FieldDescriptor::CPPTYPE_STRING: {
511          MutableRaw<RepeatedPtrField<string> >(message, field)->Clear();
512        break;
513      }
514
515      case FieldDescriptor::CPPTYPE_MESSAGE: {
516        // We don't know which subclass of RepeatedPtrFieldBase the type is,
517        // so we use RepeatedPtrFieldBase directly.
518        MutableRaw<RepeatedPtrFieldBase>(message, field)
519            ->Clear<GenericTypeHandler<Message> >();
520        break;
521      }
522    }
523  }
524}
525
526void GeneratedMessageReflection::RemoveLast(
527    Message* message,
528    const FieldDescriptor* field) const {
529  USAGE_CHECK_MESSAGE_TYPE(RemoveLast);
530  USAGE_CHECK_REPEATED(RemoveLast);
531
532  if (field->is_extension()) {
533    MutableExtensionSet(message)->RemoveLast(field->number());
534  } else {
535    switch (field->cpp_type()) {
536#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
537      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
538        MutableRaw<RepeatedField<LOWERCASE> >(message, field)->RemoveLast();  \
539        break
540
541      HANDLE_TYPE( INT32,  int32);
542      HANDLE_TYPE( INT64,  int64);
543      HANDLE_TYPE(UINT32, uint32);
544      HANDLE_TYPE(UINT64, uint64);
545      HANDLE_TYPE(DOUBLE, double);
546      HANDLE_TYPE( FLOAT,  float);
547      HANDLE_TYPE(  BOOL,   bool);
548      HANDLE_TYPE(  ENUM,    int);
549#undef HANDLE_TYPE
550
551      case FieldDescriptor::CPPTYPE_STRING:
552          MutableRaw<RepeatedPtrField<string> >(message, field)->RemoveLast();
553        break;
554
555      case FieldDescriptor::CPPTYPE_MESSAGE:
556        MutableRaw<RepeatedPtrFieldBase>(message, field)
557            ->RemoveLast<GenericTypeHandler<Message> >();
558        break;
559    }
560  }
561}
562
563void GeneratedMessageReflection::SwapElements(
564    Message* message,
565    const FieldDescriptor* field,
566    int index1,
567    int index2) const {
568  USAGE_CHECK_MESSAGE_TYPE(Swap);
569  USAGE_CHECK_REPEATED(Swap);
570
571  if (field->is_extension()) {
572    MutableExtensionSet(message)->SwapElements(field->number(), index1, index2);
573  } else {
574    switch (field->cpp_type()) {
575#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
576      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
577        MutableRaw<RepeatedField<LOWERCASE> >(message, field)                 \
578            ->SwapElements(index1, index2);                                   \
579        break
580
581      HANDLE_TYPE( INT32,  int32);
582      HANDLE_TYPE( INT64,  int64);
583      HANDLE_TYPE(UINT32, uint32);
584      HANDLE_TYPE(UINT64, uint64);
585      HANDLE_TYPE(DOUBLE, double);
586      HANDLE_TYPE( FLOAT,  float);
587      HANDLE_TYPE(  BOOL,   bool);
588      HANDLE_TYPE(  ENUM,    int);
589#undef HANDLE_TYPE
590
591      case FieldDescriptor::CPPTYPE_STRING:
592      case FieldDescriptor::CPPTYPE_MESSAGE:
593        MutableRaw<RepeatedPtrFieldBase>(message, field)
594            ->SwapElements(index1, index2);
595        break;
596    }
597  }
598}
599
600namespace {
601// Comparison functor for sorting FieldDescriptors by field number.
602struct FieldNumberSorter {
603  bool operator()(const FieldDescriptor* left,
604                  const FieldDescriptor* right) const {
605    return left->number() < right->number();
606  }
607};
608}  // namespace
609
610void GeneratedMessageReflection::ListFields(
611    const Message& message,
612    vector<const FieldDescriptor*>* output) const {
613  output->clear();
614
615  // Optimization:  The default instance never has any fields set.
616  if (&message == default_instance_) return;
617
618  for (int i = 0; i < descriptor_->field_count(); i++) {
619    const FieldDescriptor* field = descriptor_->field(i);
620    if (field->is_repeated()) {
621      if (FieldSize(message, field) > 0) {
622        output->push_back(field);
623      }
624    } else {
625      if (HasBit(message, field)) {
626        output->push_back(field);
627      }
628    }
629  }
630
631  if (extensions_offset_ != -1) {
632    GetExtensionSet(message).AppendToList(descriptor_, descriptor_pool_,
633                                          output);
634  }
635
636  // ListFields() must sort output by field number.
637  sort(output->begin(), output->end(), FieldNumberSorter());
638}
639
640// -------------------------------------------------------------------
641
642#undef DEFINE_PRIMITIVE_ACCESSORS
643#define DEFINE_PRIMITIVE_ACCESSORS(TYPENAME, TYPE, PASSTYPE, CPPTYPE)        \
644  PASSTYPE GeneratedMessageReflection::Get##TYPENAME(                        \
645      const Message& message, const FieldDescriptor* field) const {          \
646    USAGE_CHECK_ALL(Get##TYPENAME, SINGULAR, CPPTYPE);                       \
647    if (field->is_extension()) {                                             \
648      return GetExtensionSet(message).Get##TYPENAME(                         \
649        field->number(), field->default_value_##PASSTYPE());                 \
650    } else {                                                                 \
651      return GetField<TYPE>(message, field);                                 \
652    }                                                                        \
653  }                                                                          \
654                                                                             \
655  void GeneratedMessageReflection::Set##TYPENAME(                            \
656      Message* message, const FieldDescriptor* field,                        \
657      PASSTYPE value) const {                                                \
658    USAGE_CHECK_ALL(Set##TYPENAME, SINGULAR, CPPTYPE);                       \
659    if (field->is_extension()) {                                             \
660      return MutableExtensionSet(message)->Set##TYPENAME(                    \
661        field->number(), field->type(), value);                              \
662    } else {                                                                 \
663      SetField<TYPE>(message, field, value);                                 \
664    }                                                                        \
665  }                                                                          \
666                                                                             \
667  PASSTYPE GeneratedMessageReflection::GetRepeated##TYPENAME(                \
668      const Message& message,                                                \
669      const FieldDescriptor* field, int index) const {                       \
670    USAGE_CHECK_ALL(GetRepeated##TYPENAME, REPEATED, CPPTYPE);               \
671    if (field->is_extension()) {                                             \
672      return GetExtensionSet(message).GetRepeated##TYPENAME(                 \
673        field->number(), index);                                             \
674    } else {                                                                 \
675      return GetRepeatedField<TYPE>(message, field, index);                  \
676    }                                                                        \
677  }                                                                          \
678                                                                             \
679  void GeneratedMessageReflection::SetRepeated##TYPENAME(                    \
680      Message* message, const FieldDescriptor* field,                        \
681      int index, PASSTYPE value) const {                                     \
682    USAGE_CHECK_ALL(SetRepeated##TYPENAME, REPEATED, CPPTYPE);               \
683    if (field->is_extension()) {                                             \
684      MutableExtensionSet(message)->SetRepeated##TYPENAME(                   \
685        field->number(), index, value);                                      \
686    } else {                                                                 \
687      SetRepeatedField<TYPE>(message, field, index, value);                  \
688    }                                                                        \
689  }                                                                          \
690                                                                             \
691  void GeneratedMessageReflection::Add##TYPENAME(                            \
692      Message* message, const FieldDescriptor* field,                        \
693      PASSTYPE value) const {                                                \
694    USAGE_CHECK_ALL(Add##TYPENAME, REPEATED, CPPTYPE);                       \
695    if (field->is_extension()) {                                             \
696      MutableExtensionSet(message)->Add##TYPENAME(                           \
697        field->number(), field->type(), field->options().packed(), value);   \
698    } else {                                                                 \
699      AddField<TYPE>(message, field, value);                                 \
700    }                                                                        \
701  }
702
703DEFINE_PRIMITIVE_ACCESSORS(Int32 , int32 , int32 , INT32 )
704DEFINE_PRIMITIVE_ACCESSORS(Int64 , int64 , int64 , INT64 )
705DEFINE_PRIMITIVE_ACCESSORS(UInt32, uint32, uint32, UINT32)
706DEFINE_PRIMITIVE_ACCESSORS(UInt64, uint64, uint64, UINT64)
707DEFINE_PRIMITIVE_ACCESSORS(Float , float , float , FLOAT )
708DEFINE_PRIMITIVE_ACCESSORS(Double, double, double, DOUBLE)
709DEFINE_PRIMITIVE_ACCESSORS(Bool  , bool  , bool  , BOOL  )
710#undef DEFINE_PRIMITIVE_ACCESSORS
711
712// -------------------------------------------------------------------
713
714string GeneratedMessageReflection::GetString(
715    const Message& message, const FieldDescriptor* field) const {
716  USAGE_CHECK_ALL(GetString, SINGULAR, STRING);
717  if (field->is_extension()) {
718    return GetExtensionSet(message).GetString(field->number(),
719                                              field->default_value_string());
720  } else {
721    return *GetField<const string*>(message, field);
722  }
723}
724
725const string& GeneratedMessageReflection::GetStringReference(
726    const Message& message,
727    const FieldDescriptor* field, string* scratch) const {
728  USAGE_CHECK_ALL(GetStringReference, SINGULAR, STRING);
729  if (field->is_extension()) {
730    return GetExtensionSet(message).GetString(field->number(),
731                                              field->default_value_string());
732  } else {
733    return *GetField<const string*>(message, field);
734  }
735}
736
737
738void GeneratedMessageReflection::SetString(
739    Message* message, const FieldDescriptor* field,
740    const string& value) const {
741  USAGE_CHECK_ALL(SetString, SINGULAR, STRING);
742  if (field->is_extension()) {
743    return MutableExtensionSet(message)->SetString(field->number(),
744                                                   field->type(), value);
745  } else {
746    string** ptr = MutableField<string*>(message, field);
747    if (*ptr == DefaultRaw<const string*>(field)) {
748      *ptr = new string(value);
749    } else {
750      (*ptr)->assign(value);
751    }
752  }
753}
754
755
756string GeneratedMessageReflection::GetRepeatedString(
757    const Message& message, const FieldDescriptor* field, int index) const {
758  USAGE_CHECK_ALL(GetRepeatedString, REPEATED, STRING);
759  if (field->is_extension()) {
760    return GetExtensionSet(message).GetRepeatedString(field->number(), index);
761  } else {
762    return GetRepeatedPtrField<string>(message, field, index);
763  }
764}
765
766const string& GeneratedMessageReflection::GetRepeatedStringReference(
767    const Message& message, const FieldDescriptor* field,
768    int index, string* scratch) const {
769  USAGE_CHECK_ALL(GetRepeatedStringReference, REPEATED, STRING);
770  if (field->is_extension()) {
771    return GetExtensionSet(message).GetRepeatedString(field->number(), index);
772  } else {
773    return GetRepeatedPtrField<string>(message, field, index);
774  }
775}
776
777
778void GeneratedMessageReflection::SetRepeatedString(
779    Message* message, const FieldDescriptor* field,
780    int index, const string& value) const {
781  USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING);
782  if (field->is_extension()) {
783    MutableExtensionSet(message)->SetRepeatedString(
784      field->number(), index, value);
785  } else {
786    *MutableRepeatedField<string>(message, field, index) = value;
787  }
788}
789
790
791void GeneratedMessageReflection::AddString(
792    Message* message, const FieldDescriptor* field,
793    const string& value) const {
794  USAGE_CHECK_ALL(AddString, REPEATED, STRING);
795  if (field->is_extension()) {
796    MutableExtensionSet(message)->AddString(field->number(),
797                                            field->type(), value);
798  } else {
799    *AddField<string>(message, field) = value;
800  }
801}
802
803
804// -------------------------------------------------------------------
805
806const EnumValueDescriptor* GeneratedMessageReflection::GetEnum(
807    const Message& message, const FieldDescriptor* field) const {
808  USAGE_CHECK_ALL(GetEnum, SINGULAR, ENUM);
809
810  int value;
811  if (field->is_extension()) {
812    value = GetExtensionSet(message).GetEnum(
813      field->number(), field->default_value_enum()->number());
814  } else {
815    value = GetField<int>(message, field);
816  }
817  const EnumValueDescriptor* result =
818    field->enum_type()->FindValueByNumber(value);
819  GOOGLE_CHECK(result != NULL);
820  return result;
821}
822
823void GeneratedMessageReflection::SetEnum(
824    Message* message, const FieldDescriptor* field,
825    const EnumValueDescriptor* value) const {
826  USAGE_CHECK_ALL(SetEnum, SINGULAR, ENUM);
827  USAGE_CHECK_ENUM_VALUE(SetEnum);
828
829  if (field->is_extension()) {
830    MutableExtensionSet(message)->SetEnum(field->number(), field->type(),
831                                          value->number());
832  } else {
833    SetField<int>(message, field, value->number());
834  }
835}
836
837const EnumValueDescriptor* GeneratedMessageReflection::GetRepeatedEnum(
838    const Message& message, const FieldDescriptor* field, int index) const {
839  USAGE_CHECK_ALL(GetRepeatedEnum, REPEATED, ENUM);
840
841  int value;
842  if (field->is_extension()) {
843    value = GetExtensionSet(message).GetRepeatedEnum(field->number(), index);
844  } else {
845    value = GetRepeatedField<int>(message, field, index);
846  }
847  const EnumValueDescriptor* result =
848    field->enum_type()->FindValueByNumber(value);
849  GOOGLE_CHECK(result != NULL);
850  return result;
851}
852
853void GeneratedMessageReflection::SetRepeatedEnum(
854    Message* message,
855    const FieldDescriptor* field, int index,
856    const EnumValueDescriptor* value) const {
857  USAGE_CHECK_ALL(SetRepeatedEnum, REPEATED, ENUM);
858  USAGE_CHECK_ENUM_VALUE(SetRepeatedEnum);
859
860  if (field->is_extension()) {
861    MutableExtensionSet(message)->SetRepeatedEnum(
862      field->number(), index, value->number());
863  } else {
864    SetRepeatedField<int>(message, field, index, value->number());
865  }
866}
867
868void GeneratedMessageReflection::AddEnum(
869    Message* message, const FieldDescriptor* field,
870    const EnumValueDescriptor* value) const {
871  USAGE_CHECK_ALL(AddEnum, REPEATED, ENUM);
872  USAGE_CHECK_ENUM_VALUE(AddEnum);
873
874  if (field->is_extension()) {
875    MutableExtensionSet(message)->AddEnum(field->number(), field->type(),
876                                          field->options().packed(),
877                                          value->number());
878  } else {
879    AddField<int>(message, field, value->number());
880  }
881}
882
883// -------------------------------------------------------------------
884
885const Message& GeneratedMessageReflection::GetMessage(
886    const Message& message, const FieldDescriptor* field) const {
887  USAGE_CHECK_ALL(GetMessage, SINGULAR, MESSAGE);
888
889  if (field->is_extension()) {
890    return static_cast<const Message&>(
891      GetExtensionSet(message).GetMessage(field->number(),
892                                          field->message_type(),
893                                          message_factory_));
894  } else {
895    const Message* result = GetRaw<const Message*>(message, field);
896    if (result == NULL) {
897      result = DefaultRaw<const Message*>(field);
898    }
899    return *result;
900  }
901}
902
903Message* GeneratedMessageReflection::MutableMessage(
904    Message* message, const FieldDescriptor* field) const {
905  USAGE_CHECK_ALL(MutableMessage, SINGULAR, MESSAGE);
906
907  if (field->is_extension()) {
908    return static_cast<Message*>(
909        MutableExtensionSet(message)->MutableMessage(field->number(),
910                                                     field->type(),
911                                                     field->message_type(),
912                                                     message_factory_));
913  } else {
914    Message** result = MutableField<Message*>(message, field);
915    if (*result == NULL) {
916      const Message* default_message = DefaultRaw<const Message*>(field);
917      *result = default_message->New();
918    }
919    return *result;
920  }
921}
922
923const Message& GeneratedMessageReflection::GetRepeatedMessage(
924    const Message& message, const FieldDescriptor* field, int index) const {
925  USAGE_CHECK_ALL(GetRepeatedMessage, REPEATED, MESSAGE);
926
927  if (field->is_extension()) {
928    return static_cast<const Message&>(
929        GetExtensionSet(message).GetRepeatedMessage(field->number(), index));
930  } else {
931    return GetRaw<RepeatedPtrFieldBase>(message, field)
932        .Get<GenericTypeHandler<Message> >(index);
933  }
934}
935
936Message* GeneratedMessageReflection::MutableRepeatedMessage(
937    Message* message, const FieldDescriptor* field, int index) const {
938  USAGE_CHECK_ALL(MutableRepeatedMessage, REPEATED, MESSAGE);
939
940  if (field->is_extension()) {
941    return static_cast<Message*>(
942        MutableExtensionSet(message)->MutableRepeatedMessage(
943          field->number(), index));
944  } else {
945    return MutableRaw<RepeatedPtrFieldBase>(message, field)
946        ->Mutable<GenericTypeHandler<Message> >(index);
947  }
948}
949
950Message* GeneratedMessageReflection::AddMessage(
951    Message* message, const FieldDescriptor* field) const {
952  USAGE_CHECK_ALL(AddMessage, REPEATED, MESSAGE);
953
954  if (field->is_extension()) {
955    return static_cast<Message*>(
956        MutableExtensionSet(message)->AddMessage(field->number(),
957                                                 field->type(),
958                                                 field->message_type(),
959                                                 message_factory_));
960  } else {
961    // We can't use AddField<Message>() because RepeatedPtrFieldBase doesn't
962    // know how to allocate one.
963    RepeatedPtrFieldBase* repeated =
964      MutableRaw<RepeatedPtrFieldBase>(message, field);
965    Message* result = repeated->AddFromCleared<GenericTypeHandler<Message> >();
966    if (result == NULL) {
967      // We must allocate a new object.
968      const Message* prototype;
969      if (repeated->size() == 0) {
970        prototype = message_factory_->GetPrototype(field->message_type());
971      } else {
972        prototype = &repeated->Get<GenericTypeHandler<Message> >(0);
973      }
974      result = prototype->New();
975      repeated->AddAllocated<GenericTypeHandler<Message> >(result);
976    }
977    return result;
978  }
979}
980
981// -------------------------------------------------------------------
982
983const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByName(
984    const string& name) const {
985  if (extensions_offset_ == -1) return NULL;
986
987  const FieldDescriptor* result = descriptor_pool_->FindExtensionByName(name);
988  if (result != NULL && result->containing_type() == descriptor_) {
989    return result;
990  }
991
992  if (descriptor_->options().message_set_wire_format()) {
993    // MessageSet extensions may be identified by type name.
994    const Descriptor* type = descriptor_pool_->FindMessageTypeByName(name);
995    if (type != NULL) {
996      // Look for a matching extension in the foreign type's scope.
997      for (int i = 0; i < type->extension_count(); i++) {
998        const FieldDescriptor* extension = type->extension(i);
999        if (extension->containing_type() == descriptor_ &&
1000            extension->type() == FieldDescriptor::TYPE_MESSAGE &&
1001            extension->is_optional() &&
1002            extension->message_type() == type) {
1003          // Found it.
1004          return extension;
1005        }
1006      }
1007    }
1008  }
1009
1010  return NULL;
1011}
1012
1013const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByNumber(
1014    int number) const {
1015  if (extensions_offset_ == -1) return NULL;
1016  return descriptor_pool_->FindExtensionByNumber(descriptor_, number);
1017}
1018
1019// ===================================================================
1020// Some private helpers.
1021
1022// These simple template accessors obtain pointers (or references) to
1023// the given field.
1024template <typename Type>
1025inline const Type& GeneratedMessageReflection::GetRaw(
1026    const Message& message, const FieldDescriptor* field) const {
1027  const void* ptr = reinterpret_cast<const uint8*>(&message) +
1028                    offsets_[field->index()];
1029  return *reinterpret_cast<const Type*>(ptr);
1030}
1031
1032template <typename Type>
1033inline Type* GeneratedMessageReflection::MutableRaw(
1034    Message* message, const FieldDescriptor* field) const {
1035  void* ptr = reinterpret_cast<uint8*>(message) + offsets_[field->index()];
1036  return reinterpret_cast<Type*>(ptr);
1037}
1038
1039template <typename Type>
1040inline const Type& GeneratedMessageReflection::DefaultRaw(
1041    const FieldDescriptor* field) const {
1042  const void* ptr = reinterpret_cast<const uint8*>(default_instance_) +
1043                    offsets_[field->index()];
1044  return *reinterpret_cast<const Type*>(ptr);
1045}
1046
1047inline const uint32* GeneratedMessageReflection::GetHasBits(
1048    const Message& message) const {
1049  const void* ptr = reinterpret_cast<const uint8*>(&message) + has_bits_offset_;
1050  return reinterpret_cast<const uint32*>(ptr);
1051}
1052inline uint32* GeneratedMessageReflection::MutableHasBits(
1053    Message* message) const {
1054  void* ptr = reinterpret_cast<uint8*>(message) + has_bits_offset_;
1055  return reinterpret_cast<uint32*>(ptr);
1056}
1057
1058inline const ExtensionSet& GeneratedMessageReflection::GetExtensionSet(
1059    const Message& message) const {
1060  GOOGLE_DCHECK_NE(extensions_offset_, -1);
1061  const void* ptr = reinterpret_cast<const uint8*>(&message) +
1062                    extensions_offset_;
1063  return *reinterpret_cast<const ExtensionSet*>(ptr);
1064}
1065inline ExtensionSet* GeneratedMessageReflection::MutableExtensionSet(
1066    Message* message) const {
1067  GOOGLE_DCHECK_NE(extensions_offset_, -1);
1068  void* ptr = reinterpret_cast<uint8*>(message) + extensions_offset_;
1069  return reinterpret_cast<ExtensionSet*>(ptr);
1070}
1071
1072// Simple accessors for manipulating has_bits_.
1073inline bool GeneratedMessageReflection::HasBit(
1074    const Message& message, const FieldDescriptor* field) const {
1075  return GetHasBits(message)[field->index() / 32] &
1076    (1 << (field->index() % 32));
1077}
1078
1079inline void GeneratedMessageReflection::SetBit(
1080    Message* message, const FieldDescriptor* field) const {
1081  MutableHasBits(message)[field->index() / 32] |= (1 << (field->index() % 32));
1082}
1083
1084inline void GeneratedMessageReflection::ClearBit(
1085    Message* message, const FieldDescriptor* field) const {
1086  MutableHasBits(message)[field->index() / 32] &= ~(1 << (field->index() % 32));
1087}
1088
1089// Template implementations of basic accessors.  Inline because each
1090// template instance is only called from one location.  These are
1091// used for all types except messages.
1092template <typename Type>
1093inline const Type& GeneratedMessageReflection::GetField(
1094    const Message& message, const FieldDescriptor* field) const {
1095  return GetRaw<Type>(message, field);
1096}
1097
1098template <typename Type>
1099inline void GeneratedMessageReflection::SetField(
1100    Message* message, const FieldDescriptor* field, const Type& value) const {
1101  *MutableRaw<Type>(message, field) = value;
1102  SetBit(message, field);
1103}
1104
1105template <typename Type>
1106inline Type* GeneratedMessageReflection::MutableField(
1107    Message* message, const FieldDescriptor* field) const {
1108  SetBit(message, field);
1109  return MutableRaw<Type>(message, field);
1110}
1111
1112template <typename Type>
1113inline Type GeneratedMessageReflection::GetRepeatedField(
1114    const Message& message, const FieldDescriptor* field, int index) const {
1115  return GetRaw<RepeatedField<Type> >(message, field).Get(index);
1116}
1117
1118template <typename Type>
1119inline const Type& GeneratedMessageReflection::GetRepeatedPtrField(
1120    const Message& message, const FieldDescriptor* field, int index) const {
1121  return GetRaw<RepeatedPtrField<Type> >(message, field).Get(index);
1122}
1123
1124template <typename Type>
1125inline void GeneratedMessageReflection::SetRepeatedField(
1126    Message* message, const FieldDescriptor* field,
1127    int index, Type value) const {
1128  MutableRaw<RepeatedField<Type> >(message, field)->Set(index, value);
1129}
1130
1131template <typename Type>
1132inline Type* GeneratedMessageReflection::MutableRepeatedField(
1133    Message* message, const FieldDescriptor* field, int index) const {
1134  RepeatedPtrField<Type>* repeated =
1135    MutableRaw<RepeatedPtrField<Type> >(message, field);
1136  return repeated->Mutable(index);
1137}
1138
1139template <typename Type>
1140inline void GeneratedMessageReflection::AddField(
1141    Message* message, const FieldDescriptor* field, Type value) const {
1142  MutableRaw<RepeatedField<Type> >(message, field)->Add(value);
1143}
1144
1145template <typename Type>
1146inline Type* GeneratedMessageReflection::AddField(
1147    Message* message, const FieldDescriptor* field) const {
1148  RepeatedPtrField<Type>* repeated =
1149    MutableRaw<RepeatedPtrField<Type> >(message, field);
1150  return repeated->Add();
1151}
1152
1153}  // namespace internal
1154}  // namespace protobuf
1155}  // namespace google
1156