Apollo  6.0
Open source self driving car software
message_traits.h
Go to the documentation of this file.
1 /******************************************************************************
2  * Copyright 2018 The Apollo Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *****************************************************************************/
16 
17 #ifndef CYBER_MESSAGE_MESSAGE_TRAITS_H_
18 #define CYBER_MESSAGE_MESSAGE_TRAITS_H_
19 
20 #include <string>
21 
22 #include "cyber/base/macros.h"
23 #include "cyber/common/log.h"
28 
29 namespace apollo {
30 namespace cyber {
31 namespace message {
32 
33 DEFINE_TYPE_TRAIT(HasByteSize, ByteSizeLong)
34 DEFINE_TYPE_TRAIT(HasType, TypeName)
35 DEFINE_TYPE_TRAIT(HasSetType, SetTypeName)
36 DEFINE_TYPE_TRAIT(HasGetDescriptorString, GetDescriptorString)
37 DEFINE_TYPE_TRAIT(HasDescriptor, descriptor)
38 DEFINE_TYPE_TRAIT(HasFullName, full_name)
39 DEFINE_TYPE_TRAIT(HasSerializeToString, SerializeToString)
40 DEFINE_TYPE_TRAIT(HasParseFromString, ParseFromString)
41 DEFINE_TYPE_TRAIT(HasSerializeToArray, SerializeToArray)
42 DEFINE_TYPE_TRAIT(HasParseFromArray, ParseFromArray)
43 
44 template <typename T>
46  public:
47  static constexpr bool value =
50 };
51 
52 // avoid potential ODR violation
53 template <typename T>
54 constexpr bool HasSerializer<T>::value;
55 
56 template <typename T,
58  std::is_member_function_pointer<
59  decltype(&T::TypeName)>::value,
60  bool>::type = 0>
61 std::string MessageType(const T& message) {
62  return message.TypeName();
63 }
64 
65 template <typename T,
67  !std::is_member_function_pointer<
68  decltype(&T::TypeName)>::value,
69  bool>::type = 0>
70 std::string MessageType(const T& message) {
71  return T::TypeName();
72 }
73 
74 template <typename T,
75  typename std::enable_if<
78  bool>::type = 0>
79 std::string MessageType(const T& message) {
80  return typeid(T).name();
81 }
82 
83 template <typename T,
85  !std::is_member_function_pointer<
86  decltype(&T::TypeName)>::value,
87  bool>::type = 0>
88 std::string MessageType() {
89  return T::TypeName();
90 }
91 
92 template <typename T,
93  typename std::enable_if<
96  bool>::type = 0>
97 std::string MessageType() {
98  return typeid(T).name();
99 }
100 
101 template <
102  typename T,
103  typename std::enable_if<
107  bool>::type = 0>
108 std::string MessageType() {
109  return typeid(T).name();
110 }
111 
112 template <typename T>
114  const std::string& type_name, T* message) {
115  message->SetTypeName(type_name);
116 }
117 
118 template <typename T>
120  const std::string& type_name, T* message) {}
121 
122 template <typename T>
124  const T& message) {
125  return static_cast<int>(message.ByteSizeLong());
126 }
127 
128 template <typename T>
130  const T& message) {
131  (void)message;
132  return -1;
133 }
134 
135 template <typename T>
136 int FullByteSize(const T& message) {
137  int content_size = ByteSize(message);
138  if (content_size < 0) {
139  return content_size;
140  }
141  return content_size + static_cast<int>(sizeof(MessageHeader));
142 }
143 
144 template <typename T>
146  const void* data, int size, T* message) {
147  return message->ParseFromArray(data, size);
148 }
149 
150 template <typename T>
152 ParseFromArray(const void* data, int size, T* message) {
153  return false;
154 }
155 
156 template <typename T>
158 ParseFromString(const std::string& str, T* message) {
159  return message->ParseFromString(str);
160 }
161 
162 template <typename T>
164 ParseFromString(const std::string& str, T* message) {
165  return false;
166 }
167 
168 template <typename T>
170  const void* data, int size, T* message) {
171  const auto header_size = sizeof(MessageHeader);
172  RETURN_VAL_IF(size < (int)header_size, false);
173  const MessageHeader* header = static_cast<const MessageHeader*>(data);
174  RETURN_VAL_IF((size - header_size) < header->content_size(), false);
175  SetTypeName(header->msg_type(), message);
176  return message->ParseFromArray(
177  static_cast<const void*>(static_cast<const char*>(data) + header_size),
178  header->content_size());
179 }
180 
181 template <typename T>
183  const void* data, int size, T* message) {
184  return false;
185 }
186 
187 template <typename T>
189 SerializeToArray(const T& message, void* data, int size) {
190  return message.SerializeToArray(data, size);
191 }
192 
193 template <typename T>
195 SerializeToArray(const T& message, void* data, int size) {
196  return false;
197 }
198 
199 template <typename T>
201 SerializeToString(const T& message, std::string* str) {
202  return message.SerializeToString(str);
203 }
204 
205 template <typename T>
207 SerializeToString(const T& message, std::string* str) {
208  return false;
209 }
210 
211 template <typename T>
213 SerializeToHC(const T& message, void* data, int size) {
214  int msg_size = ByteSize(message);
215  if (msg_size < 0) {
216  return false;
217  }
218  const std::string& type_name = MessageType(message);
219  MessageHeader header;
220  header.set_msg_type(type_name.data(), type_name.size());
221  header.set_content_size(msg_size);
222  char* ptr = reinterpret_cast<char*>(data);
223  memcpy(ptr, static_cast<const void*>(&header), sizeof(header));
224  ptr += sizeof(header);
225  int left_size = size - static_cast<int>(sizeof(header));
226  return SerializeToArray(message, reinterpret_cast<void*>(ptr), left_size);
227 }
228 
229 template <typename T>
231 SerializeToHC(const T& message, void* data, int size) {
232  return false;
233 }
234 
236  bool>::type = 0>
237 void GetDescriptorString(const std::string& type, std::string* desc_str) {
238  T::GetDescriptorString(type, desc_str);
239 }
240 
241 template <typename T,
242  typename std::enable_if<
245  bool>::type = 0>
246 void GetDescriptorString(const std::string& type, std::string* desc_str) {}
247 
248 template <typename MessageT,
249  typename std::enable_if<
251  int>::type = 0>
252 void GetDescriptorString(const MessageT& message, std::string* desc_str) {}
253 
254 template <
255  typename T, typename Descriptor,
256  typename std::enable_if<HasFullName<Descriptor>::value, bool>::type = 0>
257 std::string GetFullName() {
258  return T::descriptor()->full_name();
259 }
260 
261 template <
262  typename T, typename Descriptor,
263  typename std::enable_if<!HasFullName<Descriptor>::value, bool>::type = 0>
264 std::string GetFullName() {
265  return typeid(T).name();
266 }
267 
268 template <typename T,
269  typename std::enable_if<
272  bool>::type = 0>
273 std::string GetMessageName() {
274  return GetFullName<T, decltype(*T::descriptor())>();
275 }
276 
277 template <typename T,
278  typename std::enable_if<
281  bool>::type = 0>
282 std::string GetMessageName() {
283  return T::descriptor()->full_name();
284 }
285 
286 template <typename T,
287  typename std::enable_if<!HasDescriptor<T>::value, bool>::type = 0>
288 std::string GetMessageName() {
289  return typeid(T).name();
290 }
291 
292 } // namespace message
293 } // namespace cyber
294 } // namespace apollo
295 
296 #endif // CYBER_MESSAGE_MESSAGE_TRAITS_H_
std::enable_if< HasSetType< T >::value, void >::type SetTypeName(const std::string &type_name, T *message)
Definition: message_traits.h:113
std::enable_if< HasParseFromArray< T >::value, bool >::type ParseFromHC(const void *data, int size, T *message)
Definition: message_traits.h:169
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
#define RETURN_VAL_IF(condition, val)
Definition: log.h:114
std::enable_if< HasByteSize< T >::value, int >::type ByteSize(const T &message)
Definition: message_traits.h:123
std::enable_if< HasParseFromArray< T >::value, bool >::type ParseFromArray(const void *data, int size, T *message)
Definition: message_traits.h:145
std::enable_if< HasSerializeToString< T >::value, bool >::type SerializeToString(const T &message, std::string *str)
Definition: message_traits.h:201
static constexpr bool value
Definition: message_traits.h:47
std::string MessageType(const T &message)
Definition: message_traits.h:61
std::enable_if< HasSerializeToArray< T >::value, bool >::type SerializeToArray(const T &message, void *data, int size)
Definition: message_traits.h:189
std::string GetFullName()
Definition: message_traits.h:257
#define DEFINE_TYPE_TRAIT(name, func)
Definition: macros.h:33
const char * msg_type() const
Definition: message_header.h:74
std::enable_if< HasParseFromString< T >::value, bool >::type ParseFromString(const std::string &str, T *message)
Definition: message_traits.h:158
uint32_t content_size() const
Definition: message_header.h:90
Definition: message_traits.h:45
void GetDescriptorString(const std::string &type, std::string *desc_str)
Definition: message_traits.h:237
Definition: message_header.h:31
void set_content_size(uint32_t content_size)
Definition: message_header.h:91
void GetDescriptorString(const MessageT &message, std::string *desc_str)
Definition: message_traits.h:252
int FullByteSize(const T &message)
Definition: message_traits.h:136
apollo::cyber::base::std value
void set_msg_type(const char *msg_type, size_t msg_type_len)
Definition: message_header.h:75
std::string GetMessageName()
Definition: message_traits.h:273
std::enable_if< HasSerializeToArray< T >::value, bool >::type SerializeToHC(const T &message, void *data, int size)
Definition: message_traits.h:213