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
21namespace apollo {
22namespace bridge {
23
24typedef uint32_t bsize;
25
39
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
52template <enum HType t, typename T>
53struct HeaderItem;
54
55template <enum HType t, typename T>
56char *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
85template <enum HType t, typename T>
86const 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
119template <enum HType t, typename T>
120struct HeaderItem : public HeaderItemBase {
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
148template <enum HType t>
149struct 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
virtual HType GetType() const =0
virtual char * SerializeItem(char *buf, size_t buf_size)=0
virtual const char * DiserializeItem(const char *buf, const size_t buf_size, size_t *diserialized_size)=0
const char * DiserializeItemImp(HeaderItem< t, T > *item, const char *buf, const size_t buf_size, size_t *diserialized_size)
char * SerializeItemImp(const HeaderItem< t, T > &item, char *buf, size_t buf_size)
class register implement
Definition arena_queue.h:37
Definition future.h:29
char * SerializeItem(char *buf, size_t buf_size) override
HeaderItem & operator=(const std::string &val)
const char * DiserializeItem(const char *buf, size_t buf_size, size_t *diserialized_size) override
void SetValue(const char *buf)
HeaderItem & operator=(const T &val)
HType GetType() const override
char * SerializeItem(char *buf, size_t buf_size) override
const char * DiserializeItem(const char *buf, size_t buf_size, size_t *diserialized_size) override