Apollo
10.0
自动驾驶开放平台
bridge_header_item.h
浏览该文件的文档.
1
/******************************************************************************
2
* Copyright 2019 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
#pragma once
18
19
#include <string>
20
21
namespace
apollo
{
22
namespace
bridge {
23
24
typedef
uint32_t
bsize
;
25
26
enum
HType
{
27
Header_Ver
,
28
Msg_Name
,
29
Msg_ID
,
30
Msg_Size
,
31
Msg_Frames
,
32
Frame_Size
,
33
Frame_Pos
,
34
Frame_Index
,
35
Time_Stamp
,
36
37
Header_Tail
,
38
};
39
40
class
HeaderItemBase
{
41
public
:
42
HeaderItemBase
() =
default
;
43
virtual
~HeaderItemBase
() {}
44
45
public
:
46
virtual
char
*
SerializeItem
(
char
*buf,
size_t
buf_size) = 0;
47
virtual
const
char
*
DiserializeItem
(
const
char
*buf,
const
size_t
buf_size,
48
size_t
*diserialized_size) = 0;
49
virtual
HType
GetType
()
const
= 0;
50
};
51
52
template
<enum HType t,
typename
T>
53
struct
HeaderItem
;
54
55
template
<enum HType t,
typename
T>
56
char
*
SerializeItemImp
(
const
HeaderItem<t, T>
&item,
char
*buf,
57
size_t
buf_size) {
58
if
(!buf || buf_size == 0 ||
59
buf_size <
size_t
(
sizeof
(t) +
sizeof
(
bsize
) + item.
ValueSize
() + 3)) {
60
return
nullptr
;
61
}
62
char
*res = buf;
63
64
// item.ValueSize() get the size of T type data,
65
// the maximum of which is proto_name
66
// when transfer data, bsize can save sizeof(proto_name).
67
// The type needs to be kept consistent during serialize and diserialize.
68
bsize
item_size =
static_cast<
bsize
>
(item.
ValueSize
());
69
70
HType
type = t;
71
memcpy(res, &type,
sizeof
(
HType
));
72
res[
sizeof
(
HType
)] =
':'
;
73
res = res +
sizeof
(
HType
) + 1;
74
75
memcpy(res, &item_size,
sizeof
(
bsize
));
76
res[
sizeof
(
bsize
)] =
':'
;
77
res = res +
sizeof
(
bsize
) + 1;
78
79
memcpy(res, item.
GetValuePtr
(), item.
ValueSize
());
80
res[item.
ValueSize
()] =
'\n'
;
81
res += item.
ValueSize
() + 1;
82
return
res;
83
}
84
85
template
<enum HType t,
typename
T>
86
const
char
*
DiserializeItemImp
(
HeaderItem<t, T>
*item,
const
char
*buf,
87
const
size_t
buf_size,
88
size_t
*diserialized_size) {
89
if
(!buf || !diserialized_size ||
90
buf_size <
size_t
(
sizeof
(
HType
) +
sizeof
(
bsize
) + 2)) {
91
return
nullptr
;
92
}
93
const
char
*res = buf;
94
95
char
p_type[
sizeof
(
HType
)] = {0};
96
memcpy(p_type, buf,
sizeof
(
HType
));
97
HType
type = *(
reinterpret_cast<
HType
*
>
(p_type));
98
if
(type != t) {
99
return
nullptr
;
100
}
101
res +=
sizeof
(
HType
) + 1;
102
*diserialized_size +=
sizeof
(
HType
) + 1;
103
104
char
p_size[
sizeof
(
bsize
)] = {0};
105
memcpy(p_size, res,
sizeof
(
bsize
));
106
bsize
size = *(
reinterpret_cast<
bsize
*
>
(p_size));
107
res +=
sizeof
(
bsize
) + 1;
108
*diserialized_size +=
sizeof
(
bsize
) + 1;
109
110
if
(buf_size <
size_t
(
sizeof
(
HType
) +
sizeof
(
bsize
) + size + 3)) {
111
return
nullptr
;
112
}
113
item->
SetValue
(res);
114
res += size + 1;
115
*diserialized_size += size + 1;
116
return
res;
117
}
118
119
template
<enum HType t,
typename
T>
120
struct
HeaderItem
:
public
HeaderItemBase
{
121
T
value_
;
122
123
operator
T() {
return
value_
; }
124
HeaderItem
&
operator=
(
const
T &val) {
125
value_
= val;
126
return
*
this
;
127
}
128
HType
GetType
()
const override
{
return
t; }
129
size_t
ValueSize
()
const
{
return
sizeof
(
value_
); }
130
const
T *
GetValuePtr
()
const
{
return
&
value_
; }
131
void
SetValue
(
const
char
*buf) {
132
if
(!buf) {
133
return
;
134
}
135
value_
= *(
reinterpret_cast<
const
T *
>
(buf));
136
}
137
138
char
*
SerializeItem
(
char
*buf,
size_t
buf_size)
override
{
139
return
SerializeItemImp
(*
this
, buf, buf_size);
140
}
141
142
const
char
*
DiserializeItem
(
const
char
*buf,
size_t
buf_size,
143
size_t
*diserialized_size)
override
{
144
return
DiserializeItemImp
(
this
, buf, buf_size, diserialized_size);
145
}
146
};
147
148
template
<enum HType t>
149
struct
HeaderItem
<t,
std
::string> :
public
HeaderItemBase
{
150
std::string
value_
;
151
operator
std::string() {
return
value_
; }
152
HeaderItem
&
operator=
(
const
std::string &val) {
153
value_
= val;
154
return
*
this
;
155
}
156
size_t
ValueSize
()
const
{
return
value_
.length() + 1; }
157
HType
GetType
()
const override
{
return
t; }
158
const
char
*
GetValuePtr
()
const
{
return
value_
.c_str(); }
159
void
SetValue
(
const
char
*buf) {
160
if
(!buf) {
161
return
;
162
}
163
value_
= std::string(buf);
164
}
165
166
char
*
SerializeItem
(
char
*buf,
size_t
buf_size)
override
{
167
return
SerializeItemImp
(*
this
, buf, buf_size);
168
}
169
170
const
char
*
DiserializeItem
(
const
char
*buf,
size_t
buf_size,
171
size_t
*diserialized_size)
override
{
172
return
DiserializeItemImp
(
this
, buf, buf_size, diserialized_size);
173
}
174
};
175
176
}
// namespace bridge
177
}
// namespace apollo
apollo::bridge::HeaderItemBase
Definition
bridge_header_item.h:40
apollo::bridge::HeaderItemBase::~HeaderItemBase
virtual ~HeaderItemBase()
Definition
bridge_header_item.h:43
apollo::bridge::HeaderItemBase::GetType
virtual HType GetType() const =0
apollo::bridge::HeaderItemBase::HeaderItemBase
HeaderItemBase()=default
apollo::bridge::HeaderItemBase::SerializeItem
virtual char * SerializeItem(char *buf, size_t buf_size)=0
apollo::bridge::HeaderItemBase::DiserializeItem
virtual const char * DiserializeItem(const char *buf, const size_t buf_size, size_t *diserialized_size)=0
apollo::bridge::HType
HType
Definition
bridge_header_item.h:26
apollo::bridge::Msg_ID
@ Msg_ID
Definition
bridge_header_item.h:29
apollo::bridge::Header_Ver
@ Header_Ver
Definition
bridge_header_item.h:27
apollo::bridge::Frame_Size
@ Frame_Size
Definition
bridge_header_item.h:32
apollo::bridge::Msg_Frames
@ Msg_Frames
Definition
bridge_header_item.h:31
apollo::bridge::Frame_Pos
@ Frame_Pos
Definition
bridge_header_item.h:33
apollo::bridge::Msg_Size
@ Msg_Size
Definition
bridge_header_item.h:30
apollo::bridge::Frame_Index
@ Frame_Index
Definition
bridge_header_item.h:34
apollo::bridge::Msg_Name
@ Msg_Name
Definition
bridge_header_item.h:28
apollo::bridge::Time_Stamp
@ Time_Stamp
Definition
bridge_header_item.h:35
apollo::bridge::Header_Tail
@ Header_Tail
Definition
bridge_header_item.h:37
apollo::bridge::DiserializeItemImp
const char * DiserializeItemImp(HeaderItem< t, T > *item, const char *buf, const size_t buf_size, size_t *diserialized_size)
Definition
bridge_header_item.h:86
apollo::bridge::bsize
uint32_t bsize
Definition
bridge_header_item.h:24
apollo::bridge::SerializeItemImp
char * SerializeItemImp(const HeaderItem< t, T > &item, char *buf, size_t buf_size)
Definition
bridge_header_item.h:56
apollo
class register implement
Definition
arena_queue.h:37
std
Definition
future.h:29
apollo::bridge::HeaderItem< t, std::string >::ValueSize
size_t ValueSize() const
Definition
bridge_header_item.h:156
apollo::bridge::HeaderItem< t, std::string >::GetValuePtr
const char * GetValuePtr() const
Definition
bridge_header_item.h:158
apollo::bridge::HeaderItem< t, std::string >::GetType
HType GetType() const override
Definition
bridge_header_item.h:157
apollo::bridge::HeaderItem< t, std::string >::SerializeItem
char * SerializeItem(char *buf, size_t buf_size) override
Definition
bridge_header_item.h:166
apollo::bridge::HeaderItem< t, std::string >::value_
std::string value_
Definition
bridge_header_item.h:150
apollo::bridge::HeaderItem< t, std::string >::operator=
HeaderItem & operator=(const std::string &val)
Definition
bridge_header_item.h:152
apollo::bridge::HeaderItem< t, std::string >::SetValue
void SetValue(const char *buf)
Definition
bridge_header_item.h:159
apollo::bridge::HeaderItem< t, std::string >::DiserializeItem
const char * DiserializeItem(const char *buf, size_t buf_size, size_t *diserialized_size) override
Definition
bridge_header_item.h:170
apollo::bridge::HeaderItem
Definition
bridge_header_item.h:120
apollo::bridge::HeaderItem::SetValue
void SetValue(const char *buf)
Definition
bridge_header_item.h:131
apollo::bridge::HeaderItem::GetValuePtr
const T * GetValuePtr() const
Definition
bridge_header_item.h:130
apollo::bridge::HeaderItem::ValueSize
size_t ValueSize() const
Definition
bridge_header_item.h:129
apollo::bridge::HeaderItem::operator=
HeaderItem & operator=(const T &val)
Definition
bridge_header_item.h:124
apollo::bridge::HeaderItem::GetType
HType GetType() const override
Definition
bridge_header_item.h:128
apollo::bridge::HeaderItem::SerializeItem
char * SerializeItem(char *buf, size_t buf_size) override
Definition
bridge_header_item.h:138
apollo::bridge::HeaderItem::DiserializeItem
const char * DiserializeItem(const char *buf, size_t buf_size, size_t *diserialized_size) override
Definition
bridge_header_item.h:142
apollo::bridge::HeaderItem::value_
T value_
Definition
bridge_header_item.h:121
modules
bridge
common
bridge_header_item.h