Home | History | Annotate | Download | only in protobuf
      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 (at) google.com (Kenton Varda)
     32 //  Based on original Protocol Buffers design by
     33 //  Sanjay Ghemawat, Jeff Dean, and others.
     34 //
     35 // This header is logically internal, but is made public because it is used
     36 // from protocol-compiler-generated code, which may reside in other components.
     37 
     38 #ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__
     39 #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__
     40 
     41 #include <string>
     42 #include <vector>
     43 #include <google/protobuf/stubs/common.h>
     44 // TODO(jasonh): Remove this once the compiler change to directly include this
     45 // is released to components.
     46 #include <google/protobuf/generated_enum_reflection.h>
     47 #include <google/protobuf/message.h>
     48 #include <google/protobuf/unknown_field_set.h>
     49 
     50 
     51 namespace google {
     52 namespace upb {
     53 namespace google_opensource {
     54 class GMR_Handlers;
     55 }  // namespace google_opensource
     56 }  // namespace upb
     57 
     58 namespace protobuf {
     59   class DescriptorPool;
     60 }
     61 
     62 namespace protobuf {
     63 namespace internal {
     64 class DefaultEmptyOneof;
     65 
     66 // Defined in this file.
     67 class GeneratedMessageReflection;
     68 
     69 // Defined in other files.
     70 class ExtensionSet;             // extension_set.h
     71 
     72 // THIS CLASS IS NOT INTENDED FOR DIRECT USE.  It is intended for use
     73 // by generated code.  This class is just a big hack that reduces code
     74 // size.
     75 //
     76 // A GeneratedMessageReflection is an implementation of Reflection
     77 // which expects all fields to be backed by simple variables located in
     78 // memory.  The locations are given using a base pointer and a set of
     79 // offsets.
     80 //
     81 // It is required that the user represents fields of each type in a standard
     82 // way, so that GeneratedMessageReflection can cast the void* pointer to
     83 // the appropriate type.  For primitive fields and string fields, each field
     84 // should be represented using the obvious C++ primitive type.  Enums and
     85 // Messages are different:
     86 //  - Singular Message fields are stored as a pointer to a Message.  These
     87 //    should start out NULL, except for in the default instance where they
     88 //    should start out pointing to other default instances.
     89 //  - Enum fields are stored as an int.  This int must always contain
     90 //    a valid value, such that EnumDescriptor::FindValueByNumber() would
     91 //    not return NULL.
     92 //  - Repeated fields are stored as RepeatedFields or RepeatedPtrFields
     93 //    of whatever type the individual field would be.  Strings and
     94 //    Messages use RepeatedPtrFields while everything else uses
     95 //    RepeatedFields.
     96 class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection {
     97  public:
     98   // Constructs a GeneratedMessageReflection.
     99   // Parameters:
    100   //   descriptor:    The descriptor for the message type being implemented.
    101   //   default_instance:  The default instance of the message.  This is only
    102   //                  used to obtain pointers to default instances of embedded
    103   //                  messages, which GetMessage() will return if the particular
    104   //                  sub-message has not been initialized yet.  (Thus, all
    105   //                  embedded message fields *must* have non-NULL pointers
    106   //                  in the default instance.)
    107   //   offsets:       An array of ints giving the byte offsets, relative to
    108   //                  the start of the message object, of each field.  These can
    109   //                  be computed at compile time using the
    110   //                  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET() macro, defined
    111   //                  below.
    112   //   has_bits_offset:  Offset in the message of an array of uint32s of size
    113   //                  descriptor->field_count()/32, rounded up.  This is a
    114   //                  bitfield where each bit indicates whether or not the
    115   //                  corresponding field of the message has been initialized.
    116   //                  The bit for field index i is obtained by the expression:
    117   //                    has_bits[i / 32] & (1 << (i % 32))
    118   //   unknown_fields_offset:  Offset in the message of the UnknownFieldSet for
    119   //                  the message.
    120   //   extensions_offset:  Offset in the message of the ExtensionSet for the
    121   //                  message, or -1 if the message type has no extension
    122   //                  ranges.
    123   //   pool:          DescriptorPool to search for extension definitions.  Only
    124   //                  used by FindKnownExtensionByName() and
    125   //                  FindKnownExtensionByNumber().
    126   //   factory:       MessageFactory to use to construct extension messages.
    127   //   object_size:   The size of a message object of this type, as measured
    128   //                  by sizeof().
    129   GeneratedMessageReflection(const Descriptor* descriptor,
    130                              const Message* default_instance,
    131                              const int offsets[],
    132                              int has_bits_offset,
    133                              int unknown_fields_offset,
    134                              int extensions_offset,
    135                              const DescriptorPool* pool,
    136                              MessageFactory* factory,
    137                              int object_size);
    138 
    139   // Similar with the construction above. Call this construction if the
    140   // message has oneof definition.
    141   // Parameters:
    142   //   offsets:       An array of ints giving the byte offsets.
    143   //                  For each oneof field, the offset is relative to the
    144   //                  default_oneof_instance. These can be computed at compile
    145   //                  time using the
    146   //                  PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET() macro.
    147   //                  For each none oneof field, the offset is related to
    148   //                  the start of the message object.  These can be computed
    149   //                  at compile time using the
    150   //                  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET() macro.
    151   //                  Besides offsets for all fields, this array also contains
    152   //                  offsets for oneof unions. The offset of the i-th oneof
    153   //                  union is offsets[descriptor->field_count() + i].
    154   //   default_oneof_instance: The default instance of the oneofs. It is a
    155   //                  struct holding the default value of all oneof fields
    156   //                  for this message. It is only used to obtain pointers
    157   //                  to default instances of oneof fields, which Get
    158   //                  methods will return if the field is not set.
    159   //   oneof_case_offset:  Offset in the message of an array of uint32s of
    160   //                  size descriptor->oneof_decl_count().  Each uint32
    161   //                  indicates what field is set for each oneof.
    162   //   other parameters are the same with the construction above.
    163   GeneratedMessageReflection(const Descriptor* descriptor,
    164                              const Message* default_instance,
    165                              const int offsets[],
    166                              int has_bits_offset,
    167                              int unknown_fields_offset,
    168                              int extensions_offset,
    169                              const void* default_oneof_instance,
    170                              int oneof_case_offset,
    171                              const DescriptorPool* pool,
    172                              MessageFactory* factory,
    173                              int object_size);
    174   ~GeneratedMessageReflection();
    175 
    176   // implements Reflection -------------------------------------------
    177 
    178   const UnknownFieldSet& GetUnknownFields(const Message& message) const;
    179   UnknownFieldSet* MutableUnknownFields(Message* message) const;
    180 
    181   int SpaceUsed(const Message& message) const;
    182 
    183   bool HasField(const Message& message, const FieldDescriptor* field) const;
    184   int FieldSize(const Message& message, const FieldDescriptor* field) const;
    185   void ClearField(Message* message, const FieldDescriptor* field) const;
    186   bool HasOneof(const Message& message,
    187                 const OneofDescriptor* oneof_descriptor) const;
    188   void ClearOneof(Message* message, const OneofDescriptor* field) const;
    189   void RemoveLast(Message* message, const FieldDescriptor* field) const;
    190   Message* ReleaseLast(Message* message, const FieldDescriptor* field) const;
    191   void Swap(Message* message1, Message* message2) const;
    192   void SwapFields(Message* message1, Message* message2,
    193                   const vector<const FieldDescriptor*>& fields) const;
    194   void SwapElements(Message* message, const FieldDescriptor* field,
    195                     int index1, int index2) const;
    196   void ListFields(const Message& message,
    197                   vector<const FieldDescriptor*>* output) const;
    198 
    199   int32  GetInt32 (const Message& message,
    200                    const FieldDescriptor* field) const;
    201   int64  GetInt64 (const Message& message,
    202                    const FieldDescriptor* field) const;
    203   uint32 GetUInt32(const Message& message,
    204                    const FieldDescriptor* field) const;
    205   uint64 GetUInt64(const Message& message,
    206                    const FieldDescriptor* field) const;
    207   float  GetFloat (const Message& message,
    208                    const FieldDescriptor* field) const;
    209   double GetDouble(const Message& message,
    210                    const FieldDescriptor* field) const;
    211   bool   GetBool  (const Message& message,
    212                    const FieldDescriptor* field) const;
    213   string GetString(const Message& message,
    214                    const FieldDescriptor* field) const;
    215   const string& GetStringReference(const Message& message,
    216                                    const FieldDescriptor* field,
    217                                    string* scratch) const;
    218   const EnumValueDescriptor* GetEnum(const Message& message,
    219                                      const FieldDescriptor* field) const;
    220   const Message& GetMessage(const Message& message,
    221                             const FieldDescriptor* field,
    222                             MessageFactory* factory = NULL) const;
    223 
    224   const FieldDescriptor* GetOneofFieldDescriptor(
    225       const Message& message,
    226       const OneofDescriptor* oneof_descriptor) const;
    227 
    228  public:
    229   void SetInt32 (Message* message,
    230                  const FieldDescriptor* field, int32  value) const;
    231   void SetInt64 (Message* message,
    232                  const FieldDescriptor* field, int64  value) const;
    233   void SetUInt32(Message* message,
    234                  const FieldDescriptor* field, uint32 value) const;
    235   void SetUInt64(Message* message,
    236                  const FieldDescriptor* field, uint64 value) const;
    237   void SetFloat (Message* message,
    238                  const FieldDescriptor* field, float  value) const;
    239   void SetDouble(Message* message,
    240                  const FieldDescriptor* field, double value) const;
    241   void SetBool  (Message* message,
    242                  const FieldDescriptor* field, bool   value) const;
    243   void SetString(Message* message,
    244                  const FieldDescriptor* field,
    245                  const string& value) const;
    246   void SetEnum  (Message* message, const FieldDescriptor* field,
    247                  const EnumValueDescriptor* value) const;
    248   Message* MutableMessage(Message* message, const FieldDescriptor* field,
    249                           MessageFactory* factory = NULL) const;
    250   void SetAllocatedMessage(Message* message,
    251                            Message* sub_message,
    252                            const FieldDescriptor* field) const;
    253   Message* ReleaseMessage(Message* message, const FieldDescriptor* field,
    254                           MessageFactory* factory = NULL) const;
    255 
    256   int32  GetRepeatedInt32 (const Message& message,
    257                            const FieldDescriptor* field, int index) const;
    258   int64  GetRepeatedInt64 (const Message& message,
    259                            const FieldDescriptor* field, int index) const;
    260   uint32 GetRepeatedUInt32(const Message& message,
    261                            const FieldDescriptor* field, int index) const;
    262   uint64 GetRepeatedUInt64(const Message& message,
    263                            const FieldDescriptor* field, int index) const;
    264   float  GetRepeatedFloat (const Message& message,
    265                            const FieldDescriptor* field, int index) const;
    266   double GetRepeatedDouble(const Message& message,
    267                            const FieldDescriptor* field, int index) const;
    268   bool   GetRepeatedBool  (const Message& message,
    269                            const FieldDescriptor* field, int index) const;
    270   string GetRepeatedString(const Message& message,
    271                            const FieldDescriptor* field, int index) const;
    272   const string& GetRepeatedStringReference(const Message& message,
    273                                            const FieldDescriptor* field,
    274                                            int index, string* scratch) const;
    275   const EnumValueDescriptor* GetRepeatedEnum(const Message& message,
    276                                              const FieldDescriptor* field,
    277                                              int index) const;
    278   const Message& GetRepeatedMessage(const Message& message,
    279                                     const FieldDescriptor* field,
    280                                     int index) const;
    281 
    282   // Set the value of a field.
    283   void SetRepeatedInt32 (Message* message,
    284                          const FieldDescriptor* field, int index, int32  value) const;
    285   void SetRepeatedInt64 (Message* message,
    286                          const FieldDescriptor* field, int index, int64  value) const;
    287   void SetRepeatedUInt32(Message* message,
    288                          const FieldDescriptor* field, int index, uint32 value) const;
    289   void SetRepeatedUInt64(Message* message,
    290                          const FieldDescriptor* field, int index, uint64 value) const;
    291   void SetRepeatedFloat (Message* message,
    292                          const FieldDescriptor* field, int index, float  value) const;
    293   void SetRepeatedDouble(Message* message,
    294                          const FieldDescriptor* field, int index, double value) const;
    295   void SetRepeatedBool  (Message* message,
    296                          const FieldDescriptor* field, int index, bool   value) const;
    297   void SetRepeatedString(Message* message,
    298                          const FieldDescriptor* field, int index,
    299                          const string& value) const;
    300   void SetRepeatedEnum(Message* message, const FieldDescriptor* field,
    301                        int index, const EnumValueDescriptor* value) const;
    302   // Get a mutable pointer to a field with a message type.
    303   Message* MutableRepeatedMessage(Message* message,
    304                                   const FieldDescriptor* field,
    305                                   int index) const;
    306 
    307   void AddInt32 (Message* message,
    308                  const FieldDescriptor* field, int32  value) const;
    309   void AddInt64 (Message* message,
    310                  const FieldDescriptor* field, int64  value) const;
    311   void AddUInt32(Message* message,
    312                  const FieldDescriptor* field, uint32 value) const;
    313   void AddUInt64(Message* message,
    314                  const FieldDescriptor* field, uint64 value) const;
    315   void AddFloat (Message* message,
    316                  const FieldDescriptor* field, float  value) const;
    317   void AddDouble(Message* message,
    318                  const FieldDescriptor* field, double value) const;
    319   void AddBool  (Message* message,
    320                  const FieldDescriptor* field, bool   value) const;
    321   void AddString(Message* message,
    322                  const FieldDescriptor* field, const string& value) const;
    323   void AddEnum(Message* message,
    324                const FieldDescriptor* field,
    325                const EnumValueDescriptor* value) const;
    326   Message* AddMessage(Message* message, const FieldDescriptor* field,
    327                       MessageFactory* factory = NULL) const;
    328 
    329   const FieldDescriptor* FindKnownExtensionByName(const string& name) const;
    330   const FieldDescriptor* FindKnownExtensionByNumber(int number) const;
    331 
    332  protected:
    333   virtual void* MutableRawRepeatedField(
    334       Message* message, const FieldDescriptor* field, FieldDescriptor::CppType,
    335       int ctype, const Descriptor* desc) const;
    336 
    337  private:
    338   friend class GeneratedMessage;
    339 
    340   // To parse directly into a proto2 generated class, the class GMR_Handlers
    341   // needs access to member offsets and hasbits.
    342   friend class LIBPROTOBUF_EXPORT upb::google_opensource::GMR_Handlers;
    343 
    344   const Descriptor* descriptor_;
    345   const Message* default_instance_;
    346   const void* default_oneof_instance_;
    347   const int* offsets_;
    348 
    349   int has_bits_offset_;
    350   int oneof_case_offset_;
    351   int unknown_fields_offset_;
    352   int extensions_offset_;
    353   int object_size_;
    354 
    355   const DescriptorPool* descriptor_pool_;
    356   MessageFactory* message_factory_;
    357 
    358   template <typename Type>
    359   inline const Type& GetRaw(const Message& message,
    360                             const FieldDescriptor* field) const;
    361   template <typename Type>
    362   inline Type* MutableRaw(Message* message,
    363                           const FieldDescriptor* field) const;
    364   template <typename Type>
    365   inline const Type& DefaultRaw(const FieldDescriptor* field) const;
    366   template <typename Type>
    367   inline const Type& DefaultOneofRaw(const FieldDescriptor* field) const;
    368 
    369   inline const uint32* GetHasBits(const Message& message) const;
    370   inline uint32* MutableHasBits(Message* message) const;
    371   inline uint32 GetOneofCase(
    372       const Message& message,
    373       const OneofDescriptor* oneof_descriptor) const;
    374   inline uint32* MutableOneofCase(
    375       Message* message,
    376       const OneofDescriptor* oneof_descriptor) const;
    377   inline const ExtensionSet& GetExtensionSet(const Message& message) const;
    378   inline ExtensionSet* MutableExtensionSet(Message* message) const;
    379 
    380   inline bool HasBit(const Message& message,
    381                      const FieldDescriptor* field) const;
    382   inline void SetBit(Message* message,
    383                      const FieldDescriptor* field) const;
    384   inline void ClearBit(Message* message,
    385                        const FieldDescriptor* field) const;
    386   inline void SwapBit(Message* message1,
    387                       Message* message2,
    388                       const FieldDescriptor* field) const;
    389 
    390   // This function only swaps the field. Should swap corresponding has_bit
    391   // before or after using this function.
    392   void SwapField(Message* message1,
    393                  Message* message2,
    394                  const FieldDescriptor* field) const;
    395 
    396   void SwapOneofField(Message* message1,
    397                       Message* message2,
    398                       const OneofDescriptor* oneof_descriptor) const;
    399 
    400   inline bool HasOneofField(const Message& message,
    401                             const FieldDescriptor* field) const;
    402   inline void SetOneofCase(Message* message,
    403                            const FieldDescriptor* field) const;
    404   inline void ClearOneofField(Message* message,
    405                               const FieldDescriptor* field) const;
    406 
    407   template <typename Type>
    408   inline const Type& GetField(const Message& message,
    409                               const FieldDescriptor* field) const;
    410   template <typename Type>
    411   inline void SetField(Message* message,
    412                        const FieldDescriptor* field, const Type& value) const;
    413   template <typename Type>
    414   inline Type* MutableField(Message* message,
    415                             const FieldDescriptor* field) const;
    416   template <typename Type>
    417   inline const Type& GetRepeatedField(const Message& message,
    418                                       const FieldDescriptor* field,
    419                                       int index) const;
    420   template <typename Type>
    421   inline const Type& GetRepeatedPtrField(const Message& message,
    422                                          const FieldDescriptor* field,
    423                                          int index) const;
    424   template <typename Type>
    425   inline void SetRepeatedField(Message* message,
    426                                const FieldDescriptor* field, int index,
    427                                Type value) const;
    428   template <typename Type>
    429   inline Type* MutableRepeatedField(Message* message,
    430                                     const FieldDescriptor* field,
    431                                     int index) const;
    432   template <typename Type>
    433   inline void AddField(Message* message,
    434                        const FieldDescriptor* field, const Type& value) const;
    435   template <typename Type>
    436   inline Type* AddField(Message* message,
    437                         const FieldDescriptor* field) const;
    438 
    439   int GetExtensionNumberOrDie(const Descriptor* type) const;
    440 
    441   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratedMessageReflection);
    442 };
    443 
    444 // Returns the offset of the given field within the given aggregate type.
    445 // This is equivalent to the ANSI C offsetof() macro.  However, according
    446 // to the C++ standard, offsetof() only works on POD types, and GCC
    447 // enforces this requirement with a warning.  In practice, this rule is
    448 // unnecessarily strict; there is probably no compiler or platform on
    449 // which the offsets of the direct fields of a class are non-constant.
    450 // Fields inherited from superclasses *can* have non-constant offsets,
    451 // but that's not what this macro will be used for.
    452 //
    453 // Note that we calculate relative to the pointer value 16 here since if we
    454 // just use zero, GCC complains about dereferencing a NULL pointer.  We
    455 // choose 16 rather than some other number just in case the compiler would
    456 // be confused by an unaligned pointer.
    457 #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD)    \
    458   static_cast<int>(                                           \
    459       reinterpret_cast<const char*>(                          \
    460           &reinterpret_cast<const TYPE*>(16)->FIELD) -        \
    461       reinterpret_cast<const char*>(16))
    462 
    463 #define PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(ONEOF, FIELD)     \
    464   static_cast<int>(                                                   \
    465       reinterpret_cast<const char*>(&(ONEOF->FIELD))                  \
    466       - reinterpret_cast<const char*>(ONEOF))
    467 
    468 // There are some places in proto2 where dynamic_cast would be useful as an
    469 // optimization.  For example, take Message::MergeFrom(const Message& other).
    470 // For a given generated message FooMessage, we generate these two methods:
    471 //   void MergeFrom(const FooMessage& other);
    472 //   void MergeFrom(const Message& other);
    473 // The former method can be implemented directly in terms of FooMessage's
    474 // inline accessors, but the latter method must work with the reflection
    475 // interface.  However, if the parameter to the latter method is actually of
    476 // type FooMessage, then we'd like to be able to just call the other method
    477 // as an optimization.  So, we use dynamic_cast to check this.
    478 //
    479 // That said, dynamic_cast requires RTTI, which many people like to disable
    480 // for performance and code size reasons.  When RTTI is not available, we
    481 // still need to produce correct results.  So, in this case we have to fall
    482 // back to using reflection, which is what we would have done anyway if the
    483 // objects were not of the exact same class.
    484 //
    485 // dynamic_cast_if_available() implements this logic.  If RTTI is
    486 // enabled, it does a dynamic_cast.  If RTTI is disabled, it just returns
    487 // NULL.
    488 //
    489 // If you need to compile without RTTI, simply #define GOOGLE_PROTOBUF_NO_RTTI.
    490 // On MSVC, this should be detected automatically.
    491 template<typename To, typename From>
    492 inline To dynamic_cast_if_available(From from) {
    493 #if defined(GOOGLE_PROTOBUF_NO_RTTI) || (defined(_MSC_VER)&&!defined(_CPPRTTI))
    494   return NULL;
    495 #else
    496   return dynamic_cast<To>(from);
    497 #endif
    498 }
    499 
    500 }  // namespace internal
    501 }  // namespace protobuf
    502 
    503 }  // namespace google
    504 #endif  // GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__
    505