Vanetza
 
Loading...
Searching...
No Matches
dcc_field.cpp
1#include <vanetza/geonet/dcc_field.hpp>
2#include <boost/variant/apply_visitor.hpp>
3#include <boost/variant/static_visitor.hpp>
4
5namespace vanetza
6{
7namespace geonet
8{
9
10struct dcc_mco_extractor : boost::static_visitor< boost::optional<DccMcoField> >
11{
12 using return_type = boost::optional<DccMcoField>;
13
14 return_type operator()(const DccMcoField& mco) const
15 {
16 return mco;
17 }
18
19 return_type operator()(uint32_t raw) const
20 {
21 return DccMcoField { raw };
22 }
23
24 template<typename T>
25 return_type operator()(const T&)
26 {
27 return boost::none;
28 }
29};
30
31boost::optional<DccMcoField> get_dcc_mco(const DccField& field)
32{
33 return boost::apply_visitor(dcc_mco_extractor {}, field);
34}
35
36void serialize(const DccField& field, OutputArchive& ar)
37{
38 struct serialize_visitor : boost::static_visitor<uint32_t>
39 {
40 uint32_t operator()(const DccMcoField& mco) const { return static_cast<uint32_t>(mco); }
41 uint32_t operator()(const uint32_t& raw) const { return raw; }
42 };
43
44 uint32_t raw = boost::apply_visitor(serialize_visitor {}, field);
45 serialize(host_cast(raw), ar);
46}
47
48void deserialize(DccField& field, InputArchive& ar)
49{
50 uint32_t raw;
51 deserialize(raw, ar);
52 field = raw;
53}
54
55} // namespace geonet
56} // namespace vanetza