17#ifndef CYBER_MESSAGE_MESSAGE_TRAITS_H_
18#define CYBER_MESSAGE_MESSAGE_TRAITS_H_
52 static constexpr bool value =
53 HasSerializeToString<T>::value && HasParseFromString<T>::value &&
54 HasSerializeToArray<T>::value && HasParseFromArray<T>::value;
59constexpr bool HasSerializer<T>::value;
62 typename std::enable_if<HasType<T>::value &&
63 std::is_member_function_pointer<
64 decltype(&T::TypeName)>::value,
67 return message.TypeName();
71 typename std::enable_if<HasType<T>::value &&
72 !std::is_member_function_pointer<
73 decltype(&T::TypeName)>::value,
80 typename std::enable_if<
82 !std::is_base_of<google::protobuf::Message, T>::value,
85 return typeid(T).name();
89 typename std::enable_if<HasType<T>::value &&
90 !std::is_member_function_pointer<
91 decltype(&T::TypeName)>::value,
98 typename std::enable_if<
100 !std::is_base_of<google::protobuf::Message, T>::value,
103 return typeid(T).name();
108 typename std::enable_if<
110 std::is_member_function_pointer<
decltype(&T::TypeName)>::value &&
111 !std::is_base_of<google::protobuf::Message, T>::value,
114 return typeid(T).name();
118typename std::enable_if<HasSetType<T>::value,
void>::type
SetTypeName(
119 const std::string& type_name, T* message) {
120 message->SetTypeName(type_name);
124typename std::enable_if<!HasSetType<T>::value,
void>::type
SetTypeName(
125 const std::string& type_name, T* message) {}
128typename std::enable_if<HasByteSize<T>::value,
int>::type
ByteSize(
130 return static_cast<int>(message.ByteSizeLong());
134typename std::enable_if<!HasByteSize<T>::value,
int>::type
ByteSize(
142 int content_size =
ByteSize(message);
143 if (content_size < 0) {
146 return content_size +
static_cast<int>(
sizeof(
MessageHeader));
150typename std::enable_if<HasParseFromArenaMessageWrapper<T>::value,
bool>::type
153 return message->ParseFromArenaMessageWrapper(wrapper, message_ptr);
157 typename std::enable_if<
158 !HasParseFromArenaMessageWrapper<T>::value &&
159 !std::is_base_of<google::protobuf::Message, T>::value,
171 const void* data,
int size, T* message) {
172 return message->ParseFromArray(data, size);
176typename std::enable_if<!HasParseFromArray<T>::value,
bool>::type
182typename std::enable_if<HasParseFromString<T>::value,
bool>::type
184 return message->ParseFromString(str);
188typename std::enable_if<!HasParseFromString<T>::value,
bool>::type
194typename std::enable_if<HasParseFromArray<T>::value,
bool>::type
ParseFromHC(
195 const void* data,
int size, T* message) {
201 return message->ParseFromArray(
202 static_cast<const void*
>(
static_cast<const char*
>(data) + header_size),
207typename std::enable_if<!HasParseFromArray<T>::value,
bool>::type
ParseFromHC(
208 const void* data,
int size, T* message) {
213typename std::enable_if<HasSerializeToArenaMessageWrapper<T>::value,
bool>::type
216 return message->SerializeToArenaMessageWrapper(wrapper, message_ptr);
220 typename std::enable_if<
221 !HasSerializeToArenaMessageWrapper<T>::value &&
222 !std::is_base_of<google::protobuf::Message, T>::value,
234typename std::enable_if<HasSerializeToArray<T>::value,
bool>::type
236 return message.SerializeToArray(data, size);
240typename std::enable_if<!HasSerializeToArray<T>::value,
bool>::type
246typename std::enable_if<HasSerializeToString<T>::value,
bool>::type
248 return message.SerializeToString(str);
252typename std::enable_if<!HasSerializeToString<T>::value,
bool>::type
258typename std::enable_if<HasSerializeToArray<T>::value,
bool>::type
264 const std::string& type_name =
MessageType(message);
266 header.
set_msg_type(type_name.data(), type_name.size());
268 if (
sizeof(header) >
static_cast<size_t>(size)) {
271 char* ptr =
reinterpret_cast<char*
>(data);
272 memcpy(ptr,
static_cast<const void*
>(&header),
sizeof(header));
273 ptr +=
sizeof(header);
274 int left_size = size -
static_cast<int>(
sizeof(header));
279typename std::enable_if<!HasSerializeToArray<T>::value,
bool>::type
284template <typename T, typename std::enable_if<HasGetDescriptorString<T>::value,
287 T::GetDescriptorString(type, desc_str);
291 typename std::enable_if<
292 !HasGetDescriptorString<T>::value &&
293 !std::is_base_of<google::protobuf::Message, T>::value,
297template <
typename MessageT,
298 typename std::enable_if<
299 !std::is_base_of<google::protobuf::Message, MessageT>::value,
304 typename T,
typename Descriptor,
305 typename std::enable_if<HasFullName<Descriptor>::value,
bool>::type = 0>
307 return T::descriptor()->full_name();
311 typename T,
typename Descriptor,
312 typename std::enable_if<!HasFullName<Descriptor>::value,
bool>::type = 0>
314 return typeid(T).name();
318 typename std::enable_if<
319 HasDescriptor<T>::value &&
320 !std::is_base_of<google::protobuf::Message, T>::value,
323 return GetFullName<T, decltype(*T::descriptor())>();
327 typename std::enable_if<
328 HasDescriptor<T>::value &&
329 std::is_base_of<google::protobuf::Message, T>::value,
332 return T::descriptor()->full_name();
336 typename std::enable_if<!HasDescriptor<T>::value,
bool>::type = 0>
338 return typeid(T).name();
#define DEFINE_TYPE_TRAIT(name, func)
#define RETURN_VAL_IF(condition, val)
std::enable_if< HasSerializeToArray< T >::value, bool >::type SerializeToArray(const T &message, void *data, int size)
std::enable_if< HasParseFromArenaMessageWrapper< T >::value, bool >::type ParseFromArenaMessageWrapper(ArenaMessageWrapper *wrapper, T *message, T **message_ptr)
std::enable_if< HasSetType< T >::value, void >::type SetTypeName(const std::string &type_name, T *message)
std::enable_if< HasSerializeToString< T >::value, bool >::type SerializeToString(const T &message, std::string *str)
std::enable_if< HasByteSize< T >::value, int >::type ByteSize(const T &message)
std::enable_if< HasParseFromString< T >::value, bool >::type ParseFromString(const std::string &str, T *message)
std::string GetMessageName()
std::enable_if< HasSerializeToArenaMessageWrapper< T >::value, bool >::type SerializeToArenaMessageWrapper(const T &message, ArenaMessageWrapper *wrapper, T **message_ptr)
std::enable_if< HasParseFromArray< T >::value, bool >::type ParseFromArray(const void *data, int size, T *message)
std::string MessageType()
std::enable_if< HasSerializeToArray< T >::value, bool >::type SerializeToHC(const T &message, void *data, int size)
int FullByteSize(const T &message)
std::string GetFullName()
void GetDescriptorString(const std::string &type, std::string *desc_str)
std::enable_if< HasParseFromArray< T >::value, bool >::type ParseFromHC(const void *data, int size, T *message)