1#include <vanetza/security/exception.hpp>
2#include <vanetza/security/v2/validity_restriction.hpp>
16 m_raw(
static_cast<
decltype(m_raw)>(unit))
22Duration::Duration(uint16_t raw) : m_raw(raw)
28 using std::chrono::seconds;
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();
54 start_validity(start), end_validity(end) {}
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&)
65 return ValidityRestrictionType::Time_End;
69 return ValidityRestrictionType::Time_Start_And_End;
73 return ValidityRestrictionType::Time_Start_And_Duration;
75 ValidityRestrictionType operator()(
const GeographicRegion&)
77 return ValidityRestrictionType::Region;
81 validity_restriction_visitor visit;
82 return boost::apply_visitor(visit, restriction);
85size_t get_size(
const Time32&)
87 return sizeof(Time32);
90size_t get_size(
const Time64&)
92 return sizeof(Time64);
97 return sizeof(uint16_t);
102 size_t size =
sizeof(validity.end_validity);
103 size +=
sizeof(validity.start_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);
125 return get_size(validity);
129 return get_size(validity);
131 size_t operator()(
const GeographicRegion& region)
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: {
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: {
168 deserialize(ar, validity.start_validity);
169 deserialize(ar, validity.end_validity);
170 restriction = validity;
171 size += get_size(validity);
174 case ValidityRestrictionType::Region: {
175 GeographicRegion region;
176 size += deserialize(ar, region);
177 restriction = region;
186void serialize(
OutputArchive& ar,
const ValidityRestriction& restriction)
188 struct validity_restriction_visitor :
public boost::static_visitor<>
194 void operator()(
const EndValidity& validity)
196 serialize(m_archive, host_cast(validity));
200 serialize(m_archive, host_cast(validity.start_validity));
201 serialize(m_archive, host_cast(validity.end_validity));
205 serialize(m_archive, host_cast(validity.start_validity));
206 serialize(m_archive, host_cast(validity.duration.raw()));
208 void operator()(
const GeographicRegion& region)
210 serialize(m_archive, region);
215 ValidityRestrictionType type = get_type(restriction);
217 validity_restriction_visitor visit(ar);
218 boost::apply_visitor(visit, restriction);
thrown when a deserialization error occurred
std::chrono::seconds to_seconds() const