File indexing completed on 2026-07-28 09:14:00
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef GOOGLE_PROTOBUF_ANY_H__
0009 #define GOOGLE_PROTOBUF_ANY_H__
0010
0011 #include <string>
0012
0013 #include "absl/strings/string_view.h"
0014 #include "google/protobuf/port.h"
0015 #include "google/protobuf/message_lite.h"
0016
0017
0018 #include "google/protobuf/port_def.inc"
0019
0020 namespace google {
0021 namespace protobuf {
0022
0023 class FieldDescriptor;
0024 class Message;
0025
0026 namespace internal {
0027
0028
0029 PROTOBUF_EXPORT extern const char kAnyFullTypeName[];
0030
0031 PROTOBUF_EXPORT extern const char kTypeGoogleApisComPrefix[];
0032
0033 PROTOBUF_EXPORT extern const char kTypeGoogleProdComPrefix[];
0034
0035 std::string GetTypeUrl(absl::string_view message_name,
0036 absl::string_view type_url_prefix);
0037
0038 template <typename T>
0039 absl::string_view GetAnyMessageName() {
0040 return T::FullMessageName();
0041 }
0042
0043
0044 #define URL_TYPE std::string
0045 #define VALUE_TYPE std::string
0046
0047
0048 PROTOBUF_EXPORT bool InternalPackFromLite(
0049 const MessageLite& message, absl::string_view type_url_prefix,
0050 absl::string_view type_name, URL_TYPE* PROTOBUF_NONNULL dst_url,
0051 VALUE_TYPE* PROTOBUF_NONNULL dst_value);
0052 PROTOBUF_EXPORT bool InternalUnpackToLite(
0053 absl::string_view type_name, absl::string_view type_url,
0054 const VALUE_TYPE& value, MessageLite* PROTOBUF_NONNULL dst_message);
0055 PROTOBUF_EXPORT bool InternalIsLite(absl::string_view type_name,
0056 absl::string_view type_url);
0057
0058
0059
0060
0061 template <typename T>
0062 bool InternalPackFrom(const T& message, URL_TYPE* PROTOBUF_NONNULL dst_url,
0063 VALUE_TYPE* PROTOBUF_NONNULL dst_value) {
0064 return InternalPackFromLite(message, kTypeGoogleApisComPrefix,
0065 GetAnyMessageName<T>(), dst_url, dst_value);
0066 }
0067 PROTOBUF_EXPORT bool InternalPackFrom(const Message& message,
0068 URL_TYPE* PROTOBUF_NONNULL dst_url,
0069 VALUE_TYPE* PROTOBUF_NONNULL dst_value);
0070
0071
0072
0073
0074
0075
0076
0077
0078 template <typename T>
0079 bool InternalPackFrom(const T& message, absl::string_view type_url_prefix,
0080 URL_TYPE* PROTOBUF_NONNULL dst_url,
0081 VALUE_TYPE* PROTOBUF_NONNULL dst_value) {
0082 return InternalPackFromLite(message, type_url_prefix, GetAnyMessageName<T>(),
0083 dst_url, dst_value);
0084 }
0085 PROTOBUF_EXPORT bool InternalPackFrom(const Message& message,
0086 absl::string_view type_url_prefix,
0087 URL_TYPE* PROTOBUF_NONNULL dst_url,
0088 VALUE_TYPE* PROTOBUF_NONNULL dst_value);
0089
0090
0091
0092
0093
0094 template <typename T>
0095 bool InternalUnpackTo(absl::string_view type_url, const VALUE_TYPE& value,
0096 T* PROTOBUF_NONNULL message) {
0097 return InternalUnpackToLite(GetAnyMessageName<T>(), type_url, value, message);
0098 }
0099 PROTOBUF_EXPORT bool InternalUnpackTo(absl::string_view type_url,
0100 const VALUE_TYPE& value,
0101 Message* PROTOBUF_NONNULL message);
0102
0103
0104
0105
0106 template <typename T>
0107 bool InternalIs(absl::string_view type_url) {
0108 return InternalIsLite(GetAnyMessageName<T>(), type_url);
0109 }
0110
0111 #undef URL_TYPE
0112 #undef VALUE_TYPE
0113
0114
0115
0116
0117
0118
0119
0120
0121 bool ParseAnyTypeUrl(absl::string_view type_url,
0122 std::string* PROTOBUF_NONNULL full_type_name);
0123
0124
0125
0126
0127
0128
0129 bool ParseAnyTypeUrl(absl::string_view type_url,
0130 std::string* PROTOBUF_NULLABLE url_prefix,
0131 std::string* PROTOBUF_NONNULL full_type_name);
0132
0133
0134
0135 bool GetAnyFieldDescriptors(
0136 const Message& message,
0137 const FieldDescriptor* PROTOBUF_NULLABLE* PROTOBUF_NONNULL type_url_field,
0138 const FieldDescriptor* PROTOBUF_NULLABLE* PROTOBUF_NONNULL value_field);
0139
0140 }
0141 }
0142 }
0143
0144 #include "google/protobuf/port_undef.inc"
0145
0146 #endif