1#include <vanetza/security/exception.hpp>
2#include <vanetza/security/v2/validity_restriction.hpp>
11Duration::Duration() : m_raw(0)
15Duration::Duration(BitNumber<uint16_t, 13> value, Units unit) :
16 m_raw(static_cast<decltype(m_raw)>(unit))
22Duration::Duration(uint16_t raw) : m_raw(raw)
26std::chrono::seconds Duration::to_seconds()
const
28 using std::chrono::seconds;
33 return seconds(value());
36 return seconds(value() * 60U);
39 return seconds(value() * 3600U);
41 case Units::Sixty_Hour_Blocks:
42 return seconds(value() * 216000U);
45 return seconds(value() * 31556925ULL);
49 return std::chrono::seconds::min();
53StartAndEndValidity::StartAndEndValidity(Time32 start, Time32 end) :
54 start_validity(start), end_validity(end) {}
56StartAndDurationValidity::StartAndDurationValidity(Time32 start,
Duration dur) :
57 start_validity(start), duration(dur) {}
59ValidityRestrictionType get_type(
const ValidityRestriction& restriction)
61 struct validity_restriction_visitor :
public boost::static_visitor<ValidityRestrictionType>
63 ValidityRestrictionType operator()(
const EndValidity& validity)
65 return ValidityRestrictionType::Time_End;
67 ValidityRestrictionType operator()(
const StartAndEndValidity& validity)
69 return ValidityRestrictionType::Time_Start_And_End;
71 ValidityRestrictionType operator()(
const StartAndDurationValidity& validity)
73 return ValidityRestrictionType::Time_Start_And_Duration;
77 return ValidityRestrictionType::Region;
81 validity_restriction_visitor visit;
82 return boost::apply_visitor(visit, restriction);
85size_t get_size(
const Time32& time)
87 return sizeof(Time32);
90size_t get_size(
const Time64& time)
92 return sizeof(Time64);
95size_t get_size(
const Duration& duration)
97 return sizeof(uint16_t);
100size_t get_size(
const StartAndEndValidity& validity)
102 size_t size =
sizeof(validity.end_validity);
103 size +=
sizeof(validity.start_validity);
107size_t get_size(
const StartAndDurationValidity& validity)
109 size_t size =
sizeof(validity.start_validity);
110 size += get_size(validity.duration);
114size_t get_size(
const ValidityRestriction& restriction)
116 size_t size =
sizeof(ValidityRestrictionType);
117 struct validity_restriction_visitor :
public boost::static_visitor<size_t>
119 size_t operator()(
const EndValidity& validity)
121 return sizeof(validity);
123 size_t operator()(
const StartAndEndValidity& validity)
125 return get_size(validity);
127 size_t operator()(
const StartAndDurationValidity& validity)
129 return get_size(validity);
133 return get_size(region);
137 validity_restriction_visitor visit;
138 size += boost::apply_visitor(visit, restriction);
142size_t deserialize(InputArchive& ar, ValidityRestriction& restriction)
145 ValidityRestrictionType type;
146 deserialize(ar, type);
147 size +=
sizeof(ValidityRestrictionType);
149 case ValidityRestrictionType::Time_End: {
151 deserialize(ar, end);
156 case ValidityRestrictionType::Time_Start_And_Duration: {
157 StartAndDurationValidity validity;
158 deserialize(ar, validity.start_validity);
160 deserialize(ar, duration);
161 validity.duration =
Duration(duration);
162 size += get_size(validity);
163 restriction = validity;
166 case ValidityRestrictionType::Time_Start_And_End: {
167 StartAndEndValidity validity;
168 deserialize(ar, validity.start_validity);
169 deserialize(ar, validity.end_validity);
170 restriction = validity;
171 size += get_size(validity);
174 case ValidityRestrictionType::Region: {
176 size += deserialize(ar, region);
177 restriction = region;
181 throw deserialization_error(
"Unknown ValidityRestrictionType");
186void serialize(OutputArchive& ar,
const ValidityRestriction& restriction)
188 struct validity_restriction_visitor :
public boost::static_visitor<>
190 validity_restriction_visitor(OutputArchive& ar) :
194 void operator()(
const EndValidity& validity)
196 serialize(m_archive, host_cast(validity));
198 void operator()(
const StartAndEndValidity& validity)
200 serialize(m_archive, host_cast(validity.start_validity));
201 serialize(m_archive, host_cast(validity.end_validity));
203 void operator()(
const StartAndDurationValidity& validity)
205 serialize(m_archive, host_cast(validity.start_validity));
206 serialize(m_archive, host_cast(validity.duration.raw()));
210 serialize(m_archive, region);
212 OutputArchive& m_archive;
215 ValidityRestrictionType type = get_type(restriction);
217 validity_restriction_visitor visit(ar);
218 boost::apply_visitor(visit, restriction);