110 #ifndef GOOGLE_PROTOBUF_MESSAGE_H__
111 #define GOOGLE_PROTOBUF_MESSAGE_H__
115 #include <type_traits>
118 #include <google/protobuf/stubs/casts.h>
119 #include <google/protobuf/stubs/common.h>
121 #include <google/protobuf/descriptor.h>
122 #include <google/protobuf/generated_message_reflection.h>
124 #include <google/protobuf/port.h>
127 #define GOOGLE_PROTOBUF_HAS_ONEOF
128 #define GOOGLE_PROTOBUF_HAS_ARENAS
130 #include <google/protobuf/port_def.inc>
133 #error "You cannot SWIG proto headers"
142 class MessageFactory;
145 class AssignDescriptorsHelper;
146 class DynamicMessageFactory;
150 class MapReflectionTester;
153 struct DescriptorTable;
156 class UnknownFieldSet;
158 class ZeroCopyInputStream;
159 class ZeroCopyOutputStream;
160 class CodedInputStream;
161 class CodedOutputStream;
164 class MapReflectionFriend;
167 class CelMapReflectionFriend;
171 class MapFieldPrinterHelper;
176 class ReflectionAccessor;
180 class MapFieldReflectionTest;
183 template <
typename T>
186 template <
typename T>
198 return reinterpret_cast<To*
>(
reinterpret_cast<char*
>(message) + offset);
203 return reinterpret_cast<const To*
>(
reinterpret_cast<const char*
>(message) +
209 return *GetConstPointerAtOffset<To>(&message, offset);
244 if (arena !=
nullptr) {
298 PROTOBUF_DEPRECATED_MSG(
"Please use SpaceUsedLong() instead")
327 internal::ParseContext* ctx)
override;
330 io::EpsCopyOutputStream* stream)
const override;
340 virtual void SetCachedSize(
int size)
const;
349 const Descriptor*
GetDescriptor()
const {
return GetMetadata().descriptor; }
366 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(
Message);
372 class RepeatedFieldAccessor;
377 template <
typename T,
typename Enable =
void>
380 template <
typename T,
typename Enable =
void>
435 PROTOBUF_DEPRECATED_MSG(
"Please use SpaceUsedLong() instead")
453 const OneofDescriptor* oneof_descriptor)
const;
456 const OneofDescriptor* oneof_descriptor)
const;
460 const Message& message,
const OneofDescriptor* oneof_descriptor)
const;
479 const std::vector<const FieldDescriptor*>& fields)
const;
494 std::vector<const FieldDescriptor*>* output)
const;
508 const FieldDescriptor*
field)
const;
510 const FieldDescriptor*
field)
const;
521 const FieldDescriptor*
field,
540 const FieldDescriptor*
field,
541 std::string* scratch)
const;
562 std::string value)
const;
564 const EnumValueDescriptor* value)
const;
592 const FieldDescriptor*
field)
const;
622 const FieldDescriptor*
field,
int index)
const;
624 const FieldDescriptor*
field,
634 const FieldDescriptor*
field,
639 const FieldDescriptor*
field,
641 std::string* scratch)
const;
648 int index,
int32 value)
const;
650 int index,
int64 value)
const;
652 int index,
uint32 value)
const;
654 int index,
uint64 value)
const;
656 int index,
float value)
const;
658 int index,
double value)
const;
660 int index,
bool value)
const;
662 int index, std::string value)
const;
664 int index,
const EnumValueDescriptor* value)
const;
673 int index,
int value)
const;
677 const FieldDescriptor*
field,
699 std::string value)
const;
701 const EnumValueDescriptor* value)
const;
745 template <
typename T>
747 const FieldDescriptor*
field)
const;
751 template <
typename T>
772 template <
typename T>
773 PROTOBUF_DEPRECATED_MSG(
"Please use GetRepeatedFieldRef() instead")
775 const FieldDescriptor* d)
const {
776 return GetRepeatedFieldInternal<T>(
msg, d);
782 template <
typename T>
783 PROTOBUF_DEPRECATED_MSG(
"Please use GetMutableRepeatedFieldRef() instead")
785 const FieldDescriptor* d)
const {
786 return MutableRepeatedFieldInternal<T>(
msg, d);
793 template <
typename T>
794 PROTOBUF_DEPRECATED_MSG(
"Please use GetRepeatedFieldRef() instead")
796 const
Message&
msg, const FieldDescriptor* d)
const {
797 return GetRepeatedPtrFieldInternal<T>(
msg, d);
804 template <
typename T>
805 PROTOBUF_DEPRECATED_MSG(
"Please use GetMutableRepeatedFieldRef() instead")
807 const FieldDescriptor* d)
const {
808 return MutableRepeatedPtrFieldInternal<T>(
msg, d);
816 const std::string& name)
const;
866 template <
typename T>
868 const Message& message,
const FieldDescriptor*
field)
const;
869 template <
typename T>
872 template <
typename T>
874 const Message& message,
const FieldDescriptor*
field)
const;
875 template <
typename T>
883 void* MutableRawRepeatedField(
Message* message,
const FieldDescriptor*
field,
884 FieldDescriptor::CppType,
int ctype,
885 const Descriptor* message_type)
const;
887 const void* GetRawRepeatedField(
const Message& message,
888 const FieldDescriptor*
field,
889 FieldDescriptor::CppType cpptype,
int ctype,
890 const Descriptor* message_type)
const;
906 void* RepeatedFieldData(
Message* message,
const FieldDescriptor*
field,
907 FieldDescriptor::CppType cpp_type,
908 const Descriptor* message_type)
const;
912 const internal::RepeatedFieldAccessor* RepeatedFieldAccessor(
913 const FieldDescriptor*
field)
const;
915 const Descriptor*
const descriptor_;
916 const internal::ReflectionSchema schema_;
917 const DescriptorPool*
const descriptor_pool_;
923 int last_non_weak_field_index_;
925 template <
typename T,
typename Enable>
927 template <
typename T,
typename Enable>
929 friend class ::PROTOBUF_NAMESPACE_ID::MessageLayoutInspector;
930 friend class ::PROTOBUF_NAMESPACE_ID::AssignDescriptorsHelper;
931 friend class DynamicMessageFactory;
932 friend class python::MapReflectionFriend;
933 #define GOOGLE_PROTOBUF_HAS_CEL_MAP_REFLECTION_FRIEND
934 friend class expr::CelMapReflectionFriend;
935 friend class internal::MapFieldReflectionTest;
936 friend class internal::MapKeySorter;
937 friend class internal::WireFormat;
938 friend class internal::ReflectionOps;
940 friend class internal::MapFieldPrinterHelper;
943 const internal::ReflectionSchema& schema,
952 void* MutableRawRepeatedString(
Message* message,
const FieldDescriptor*
field,
953 bool is_string)
const;
955 friend class MapReflectionTester;
957 bool ContainsMapKey(
const Message& message,
const FieldDescriptor*
field,
958 const MapKey& key)
const;
963 bool InsertOrLookupMapValue(
Message* message,
const FieldDescriptor*
field,
964 const MapKey& key, MapValueRef* val)
const;
968 bool DeleteMapValue(
Message* message,
const FieldDescriptor*
field,
969 const MapKey& key)
const;
974 MapIterator MapBegin(
Message* message,
const FieldDescriptor*
field)
const;
979 MapIterator MapEnd(
Message* message,
const FieldDescriptor*
field)
const;
983 int MapSize(
const Message& message,
const FieldDescriptor*
field)
const;
986 friend class MapIterator;
987 friend class WireFormatForMapFieldTest;
988 internal::MapFieldBase* MutableMapData(
Message* message,
989 const FieldDescriptor*
field)
const;
991 const internal::MapFieldBase* GetMapData(
const Message& message,
992 const FieldDescriptor*
field)
const;
995 const T& GetRawNonOneof(
const Message& message,
996 const FieldDescriptor*
field)
const;
998 T* MutableRawNonOneof(
Message* message,
const FieldDescriptor*
field)
const;
1000 template <
typename Type>
1001 const Type& GetRaw(
const Message& message,
1002 const FieldDescriptor*
field)
const;
1003 template <
typename Type>
1004 inline Type* MutableRaw(
Message* message,
const FieldDescriptor*
field)
const;
1005 template <
typename Type>
1006 const Type& DefaultRaw(
const FieldDescriptor*
field)
const;
1008 inline const uint32* GetHasBits(
const Message& message)
const;
1011 const OneofDescriptor* oneof_descriptor)
const;
1012 inline uint32* MutableOneofCase(
1013 Message* message,
const OneofDescriptor* oneof_descriptor)
const;
1014 inline const internal::ExtensionSet& GetExtensionSet(
1015 const Message& message)
const;
1016 internal::ExtensionSet* MutableExtensionSet(
Message* message)
const;
1017 inline Arena* GetArena(
Message* message)
const;
1019 inline const internal::InternalMetadata& GetInternalMetadata(
1020 const Message& message)
const;
1022 internal::InternalMetadata* MutableInternalMetadata(
Message* message)
const;
1024 inline bool IsInlined(
const FieldDescriptor*
field)
const;
1026 inline bool HasBit(
const Message& message,
1027 const FieldDescriptor*
field)
const;
1028 inline void SetBit(
Message* message,
const FieldDescriptor*
field)
const;
1029 inline void ClearBit(
Message* message,
const FieldDescriptor*
field)
const;
1031 const FieldDescriptor*
field)
const;
1036 const FieldDescriptor*
field)
const;
1039 const OneofDescriptor* oneof_descriptor)
const;
1041 inline bool HasOneofField(
const Message& message,
1042 const FieldDescriptor*
field)
const;
1043 inline void SetOneofCase(
Message* message,
1044 const FieldDescriptor*
field)
const;
1045 inline void ClearOneofField(
Message* message,
1046 const FieldDescriptor*
field)
const;
1048 template <
typename Type>
1049 inline const Type& GetField(
const Message& message,
1050 const FieldDescriptor*
field)
const;
1051 template <
typename Type>
1052 inline void SetField(
Message* message,
const FieldDescriptor*
field,
1053 const Type& value)
const;
1054 template <
typename Type>
1055 inline Type* MutableField(
Message* message,
1056 const FieldDescriptor*
field)
const;
1057 template <
typename Type>
1058 inline const Type& GetRepeatedField(
const Message& message,
1059 const FieldDescriptor*
field,
1061 template <
typename Type>
1062 inline const Type& GetRepeatedPtrField(
const Message& message,
1063 const FieldDescriptor*
field,
1065 template <
typename Type>
1066 inline void SetRepeatedField(
Message* message,
const FieldDescriptor*
field,
1067 int index, Type value)
const;
1068 template <
typename Type>
1069 inline Type* MutableRepeatedField(
Message* message,
1070 const FieldDescriptor*
field,
1072 template <
typename Type>
1073 inline void AddField(
Message* message,
const FieldDescriptor*
field,
1074 const Type& value)
const;
1075 template <
typename Type>
1076 inline Type* AddField(
Message* message,
const FieldDescriptor*
field)
const;
1078 int GetExtensionNumberOrDie(
const Descriptor*
type)
const;
1082 void SetEnumValueInternal(
Message* message,
const FieldDescriptor*
field,
1084 void SetRepeatedEnumValueInternal(
Message* message,
1085 const FieldDescriptor*
field,
int index,
1087 void AddEnumValueInternal(
Message* message,
const FieldDescriptor*
field,
1091 const FieldDescriptor*
field,
1094 void UnsafeArenaSetAllocatedMessage(
Message* message,
Message* sub_message,
1095 const FieldDescriptor*
field)
const;
1101 const FieldDescriptor*
field,
1105 internal::ParseContext* ctx);
1110 internal::ParseContext* ctx);
1112 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(
Reflection);
1166 const google::protobuf::internal::DescriptorTable* table);
1179 #define DECLARE_GET_REPEATED_FIELD(TYPE) \
1181 PROTOBUF_EXPORT const RepeatedField<TYPE>& \
1182 Reflection::GetRepeatedFieldInternal<TYPE>( \
1183 const Message& message, const FieldDescriptor* field) const; \
1186 PROTOBUF_EXPORT RepeatedField<TYPE>* \
1187 Reflection::MutableRepeatedFieldInternal<TYPE>( \
1188 Message * message, const FieldDescriptor* field) const;
1198 #undef DECLARE_GET_REPEATED_FIELD
1207 template <
typename T>
1211 const T& (*get_default_instance)() = &T::default_instance;
1212 (void)get_default_instance;
1215 const Message* unused =
static_cast<T*
>(
nullptr);
1219 return dynamic_cast<const T*
>(from);
1221 bool ok = T::default_instance().GetReflection() == from->
GetReflection();
1222 return ok ? down_cast<const T*>(from) :
nullptr;
1226 template <
typename T>
1228 const Message* message_const = from;
1229 return const_cast<T*
>(DynamicCastToGenerated<T>(message_const));
1252 template <
typename T>
1254 internal::StrongReference(T::default_instance);
1266 Reflection::GetRepeatedPtrFieldInternal<std::string>(
1267 const Message& message,
const FieldDescriptor*
field)
const {
1269 MutableRawRepeatedString(
const_cast<Message*
>(&message),
field,
true));
1273 inline RepeatedPtrField<std::string>*
1274 Reflection::MutableRepeatedPtrFieldInternal<std::string>(
1275 Message* message,
const FieldDescriptor*
field)
const {
1276 return static_cast<RepeatedPtrField<std::string>*
>(
1277 MutableRawRepeatedString(message,
field,
true));
1285 const Message& message,
const FieldDescriptor*
field)
const {
1287 message,
field, FieldDescriptor::CPPTYPE_MESSAGE, -1,
nullptr));
1292 Message* message,
const FieldDescriptor*
field)
const {
1294 message,
field, FieldDescriptor::CPPTYPE_MESSAGE, -1,
nullptr));
1297 template <
typename PB>
1299 const Message& message,
const FieldDescriptor*
field)
const {
1301 GetRawRepeatedField(message,
field, FieldDescriptor::CPPTYPE_MESSAGE, -1,
1302 PB::default_instance().GetDescriptor()));
1305 template <
typename PB>
1306 inline RepeatedPtrField<PB>* Reflection::MutableRepeatedPtrFieldInternal(
1307 Message* message,
const FieldDescriptor*
field)
const {
1308 return static_cast<RepeatedPtrField<PB>*
>(
1309 MutableRawRepeatedField(message,
field, FieldDescriptor::CPPTYPE_MESSAGE,
1310 -1, PB::default_instance().GetDescriptor()));
1313 template <
typename Type>
1314 const Type& Reflection::DefaultRaw(
const FieldDescriptor*
field)
const {
1315 return *
reinterpret_cast<const Type*
>(schema_.GetFieldDefault(
field));
1320 #include <google/protobuf/port_undef.inc>
static void InternalRegisterGeneratedFile(const google::protobuf::internal::DescriptorTable *table)
virtual const Message * GetPrototype(const Descriptor *type)=0
static void InternalRegisterGeneratedMessage(const Descriptor *descriptor, const Message *prototype)
static MessageFactory * generated_factory()
virtual ~MessageFactory()
void CheckTypeAndMergeFrom(const MessageLite &other) override
virtual Metadata GetMetadata() const =0
void PrintDebugString() const
virtual size_t SpaceUsedLong() const
virtual void MergeFrom(const Message &from)
std::string DebugString() const
size_t ByteSizeLong() const override
virtual void CopyFrom(const Message &from)
virtual void DiscardUnknownFields()
Message * New(Arena *arena) const override
std::string Utf8DebugString() const
uint8 * _InternalSerialize(uint8 *target, io::EpsCopyOutputStream *stream) const override
void CheckInitialized() const
std::string GetTypeName() const override
const char * _InternalParse(const char *ptr, internal::ParseContext *ctx) override
void FindInitializationErrors(std::vector< std::string > *errors) const
bool IsInitialized() const override
Message * New() const override=0
const Descriptor * GetDescriptor() const
std::string InitializationErrorString() const override
std::string ShortDebugString() const
const Reflection * GetReflection() const
uint64 GetRepeatedUInt64(const Message &message, const FieldDescriptor *field, int index) const
size_t SpaceUsedLong(const Message &message) const
float GetFloat(const Message &message, const FieldDescriptor *field) const
void AddInt32(Message *message, const FieldDescriptor *field, int32 value) const
std::string GetString(const Message &message, const FieldDescriptor *field) const
void AddInt64(Message *message, const FieldDescriptor *field, int64 value) const
const EnumValueDescriptor * GetRepeatedEnum(const Message &message, const FieldDescriptor *field, int index) const
friend const char * ParseLenDelim(int field_number, const FieldDescriptor *field, Message *msg, const Reflection *reflection, const char *ptr, internal::ParseContext *ctx)
const std::string & GetStringReference(const Message &message, const FieldDescriptor *field, std::string *scratch) const
void SetInt64(Message *message, const FieldDescriptor *field, int64 value) const
int32 GetRepeatedInt32(const Message &message, const FieldDescriptor *field, int index) const
uint32 GetUInt32(const Message &message, const FieldDescriptor *field) const
const FieldDescriptor * GetOneofFieldDescriptor(const Message &message, const OneofDescriptor *oneof_descriptor) const
const Message & GetRepeatedMessage(const Message &message, const FieldDescriptor *field, int index) const
void AddUInt64(Message *message, const FieldDescriptor *field, uint64 value) const
RepeatedFieldRef< T > GetRepeatedFieldRef(const Message &message, const FieldDescriptor *field) const
void SetInt32(Message *message, const FieldDescriptor *field, int32 value) const
int FieldSize(const Message &message, const FieldDescriptor *field) const
void ClearField(Message *message, const FieldDescriptor *field) const
void SwapElements(Message *message, const FieldDescriptor *field, int index1, int index2) const
void SetRepeatedInt64(Message *message, const FieldDescriptor *field, int index, int64 value) const
void SetRepeatedEnumValue(Message *message, const FieldDescriptor *field, int index, int value) const
bool GetBool(const Message &message, const FieldDescriptor *field) const
int32 GetInt32(const Message &message, const FieldDescriptor *field) const
UnknownFieldSet * MutableUnknownFields(Message *message) const
uint32 GetRepeatedUInt32(const Message &message, const FieldDescriptor *field, int index) const
void SetRepeatedInt32(Message *message, const FieldDescriptor *field, int index, int32 value) const
bool HasField(const Message &message, const FieldDescriptor *field) const
void AddString(Message *message, const FieldDescriptor *field, std::string value) const
void SetUInt32(Message *message, const FieldDescriptor *field, uint32 value) const
Message * AddMessage(Message *message, const FieldDescriptor *field, MessageFactory *factory=nullptr) const
void ClearOneof(Message *message, const OneofDescriptor *oneof_descriptor) const
void SetRepeatedEnum(Message *message, const FieldDescriptor *field, int index, const EnumValueDescriptor *value) const
bool HasOneof(const Message &message, const OneofDescriptor *oneof_descriptor) const
const UnknownFieldSet & GetUnknownFields(const Message &message) const
Message * MutableRepeatedMessage(Message *message, const FieldDescriptor *field, int index) const
void SetRepeatedString(Message *message, const FieldDescriptor *field, int index, std::string value) const
void SetRepeatedDouble(Message *message, const FieldDescriptor *field, int index, double value) const
void SetRepeatedUInt64(Message *message, const FieldDescriptor *field, int index, uint64 value) const
uint64 GetUInt64(const Message &message, const FieldDescriptor *field) const
double GetRepeatedDouble(const Message &message, const FieldDescriptor *field, int index) const
int GetEnumValue(const Message &message, const FieldDescriptor *field) const
void SetDouble(Message *message, const FieldDescriptor *field, double value) const
void SetRepeatedBool(Message *message, const FieldDescriptor *field, int index, bool value) const
void SetRepeatedFloat(Message *message, const FieldDescriptor *field, int index, float value) const
friend void RegisterAllTypesInternal(const Metadata *file_level_metadata, int size)
double GetDouble(const Message &message, const FieldDescriptor *field) const
const FieldDescriptor * FindKnownExtensionByName(const std::string &name) const
MessageFactory * GetMessageFactory() const
void SetEnumValue(Message *message, const FieldDescriptor *field, int value) const
void SetUInt64(Message *message, const FieldDescriptor *field, uint64 value) const
void AddEnumValue(Message *message, const FieldDescriptor *field, int value) const
void SetFloat(Message *message, const FieldDescriptor *field, float value) const
Message * ReleaseLast(Message *message, const FieldDescriptor *field) const
void SetAllocatedMessage(Message *message, Message *sub_message, const FieldDescriptor *field) const
void SetRepeatedUInt32(Message *message, const FieldDescriptor *field, int index, uint32 value) const
Message * ReleaseMessage(Message *message, const FieldDescriptor *field, MessageFactory *factory=nullptr) const
const Message & GetMessage(const Message &message, const FieldDescriptor *field, MessageFactory *factory=nullptr) const
MutableRepeatedFieldRef< T > GetMutableRepeatedFieldRef(Message *message, const FieldDescriptor *field) const
void RemoveLast(Message *message, const FieldDescriptor *field) const
void Swap(Message *message1, Message *message2) const
void ListFields(const Message &message, std::vector< const FieldDescriptor * > *output) const
void AddBool(Message *message, const FieldDescriptor *field, bool value) const
const std::string & GetRepeatedStringReference(const Message &message, const FieldDescriptor *field, int index, std::string *scratch) const
int64 GetInt64(const Message &message, const FieldDescriptor *field) const
const FieldDescriptor * FindKnownExtensionByNumber(int number) const
int GetRepeatedEnumValue(const Message &message, const FieldDescriptor *field, int index) const
void SetString(Message *message, const FieldDescriptor *field, std::string value) const
const EnumValueDescriptor * GetEnum(const Message &message, const FieldDescriptor *field) const
void AddAllocatedMessage(Message *message, const FieldDescriptor *field, Message *new_entry) const
friend const char * ParsePackedField(const FieldDescriptor *field, Message *msg, const Reflection *reflection, const char *ptr, internal::ParseContext *ctx)
float GetRepeatedFloat(const Message &message, const FieldDescriptor *field, int index) const
void SwapFields(Message *message1, Message *message2, const std::vector< const FieldDescriptor * > &fields) const
void AddUInt32(Message *message, const FieldDescriptor *field, uint32 value) const
bool GetRepeatedBool(const Message &message, const FieldDescriptor *field, int index) const
void AddEnum(Message *message, const FieldDescriptor *field, const EnumValueDescriptor *value) const
std::string GetRepeatedString(const Message &message, const FieldDescriptor *field, int index) const
void AddFloat(Message *message, const FieldDescriptor *field, float value) const
void SetEnum(Message *message, const FieldDescriptor *field, const EnumValueDescriptor *value) const
int64 GetRepeatedInt64(const Message &message, const FieldDescriptor *field, int index) const
Message * MutableMessage(Message *message, const FieldDescriptor *field, MessageFactory *factory=nullptr) const
bool SupportsUnknownEnumValues() const
void AddDouble(Message *message, const FieldDescriptor *field, double value) const
void SetBool(Message *message, const FieldDescriptor *field, bool value) const
extern ::PROTOBUF_NAMESPACE_ID::internal::ExtensionIdentifier< ::google::protobuf::MessageOptions, ::PROTOBUF_NAMESPACE_ID::internal::MessageTypeTraits< ::goby::GobyMessageOptions >, 11, false > msg
extern ::PROTOBUF_NAMESPACE_ID::internal::ExtensionIdentifier< ::google::protobuf::FieldOptions, ::PROTOBUF_NAMESPACE_ID::internal::MessageTypeTraits< ::goby::GobyFieldOptions >, 11, false > field
To * GetPointerAtOffset(Message *message, uint32 offset)
const To & GetConstRefAtOffset(const Message &message, uint32 offset)
const To * GetConstPointerAtOffset(const Message *message, uint32 offset)
bool CreateUnknownEnumValues(const FieldDescriptor *field)
int ToIntSize(size_t size)
const T * DynamicCastToGenerated(const Message *from)
void LinkMessageReflection()
type
Generic JSON types used in JWTs.
#define DECLARE_GET_REPEATED_FIELD(TYPE)