Gazebo Sim

API Reference

9.0.0
Serialization.hh
Go to the documentation of this file.
1/*
2 * Copyright (C) 2019 Open Source Robotics Foundation
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 GZ_SIM_COMPONENTS_SERIALIZATION_HH_
18#define GZ_SIM_COMPONENTS_SERIALIZATION_HH_
19
20#ifdef _MSC_VER
21#pragma warning(push)
22#pragma warning(disable: 4251)
23#endif
24
25#include <google/protobuf/message_lite.h>
26
27#ifdef _MSC_VER
28#pragma warning(pop)
29#endif
30
31#include <gz/msgs/double_v.pb.h>
32
33#include <string>
34#include <vector>
35#include <sdf/Sensor.hh>
36
37#include <gz/sim/Conversions.hh>
38#include <gz/msgs/Utility.hh>
39
40// This header holds serialization operators which are shared among several
41// components
42
43namespace gz
44{
45namespace sim
46{
47// Inline bracket to help doxygen filtering.
48inline namespace GZ_SIM_VERSION_NAMESPACE {
49namespace traits
50{
58 template <typename In, typename Out>
60 {
61 private: template <typename InArg, typename OutArg>
62 static auto Test(int _test)
63 -> decltype(std::declval<OutArg>() =
64 gz::sim::convert<OutArg>(std::declval<const InArg &>()),
66
67 private: template <typename, typename>
68 static auto Test(...) -> std::false_type;
69
70 public: static constexpr bool value = // NOLINT
71 decltype(Test<In, Out>(true))::value;
72 };
73}
92
93namespace serializers
94{
107 template <typename DataType, typename MsgType>
109 {
114 public: static std::ostream &Serialize(std::ostream &_out,
115 const DataType &_data)
116 {
117 MsgType msg;
118 // cppcheck-suppress syntaxError
120 {
121 msg = gz::sim::convert<MsgType>(_data);
122 }
123 else
124 {
125 msg = gz::msgs::Convert(_data);
126 }
127
128 msg.SerializeToOstream(&_out);
129 return _out;
130 }
131
137 DataType &_data)
138 {
139 MsgType msg;
140 msg.ParseFromIstream(&_in);
141
143 {
144 _data = gz::sim::convert<DataType>(msg);
145 }
146 else
147 {
148 _data = gz::msgs::Convert(msg);
149 }
150 return _in;
151 }
152 };
153
156
159 {
164 public: static std::ostream &Serialize(std::ostream &_out,
165 const std::vector<double> &_vec)
166 {
167 gz::msgs::Double_V msg;
168 *msg.mutable_data() = {_vec.begin(), _vec.end()};
169 msg.SerializeToOstream(&_out);
170 return _out;
171 }
172
179 {
180 gz::msgs::Double_V msg;
181 msg.ParseFromIstream(&_in);
182
183 _vec = {msg.data().begin(), msg.data().end()};
184 return _in;
185 }
186 };
187
190 {
195 public: static std::ostream &Serialize(std::ostream &_out,
196 const google::protobuf::Message &_msg)
197 {
198 _msg.SerializeToOstream(&_out);
199 return _out;
200 }
201
207 google::protobuf::Message &_msg)
208 {
209 _msg.ParseFromIstream(&_in);
210 return _in;
211 }
212 };
213
216 {
221 public: static std::ostream &Serialize(std::ostream &_out,
222 const std::string &_data)
223 {
224 _out << _data;
225 return _out;
226 }
227
233 std::string &_data)
234 {
236 return _in;
237 }
238 };
239
240 template <typename T>
242 {
247 public: static std::ostream &Serialize(std::ostream &_out,
248 const std::vector<T> &_data)
249 {
250 _out << _data.size();
251 for (const auto& datum : _data)
252 _out << " " << datum;
253 return _out;
254 }
255
261 std::vector<T> &_data)
262 {
263 size_t size;
264 _in >> size;
265 _data.resize(size);
266 for (size_t i = 0; i < size; ++i)
267 {
268 _in >> _data[i];
269 }
270 return _in;
271 }
272 };
273}
274}
275}
276}
277
278#endif