1#include <vanetza/security/cam_ssp.hpp>
2#include <boost/format.hpp>
9CamPermissions::CamPermissions() : m_bits(0)
13CamPermissions::CamPermissions(CamPermission cp) : m_bits(static_cast<value_type>(cp))
17CamPermissions::CamPermissions(
const std::initializer_list<CamPermission>& cps) : m_bits(0)
19 for (CamPermission cp : cps) {
24bool CamPermissions::has(CamPermission cp)
const
26 const auto cp_raw =
static_cast<value_type
>(cp);
27 return (m_bits & cp_raw) == cp_raw;
30bool CamPermissions::has(
const std::initializer_list<CamPermission>& cps)
const
32 for (CamPermission cp : cps) {
33 if (!has(cp))
return false;
38bool CamPermissions::has(
const CamPermissions& required)
const
40 return (m_bits & required.m_bits) == required.m_bits;
43bool CamPermissions::none()
const
48std::set<CamPermission> CamPermissions::permissions()
const
50 std::set<CamPermission> perms;
52 std::underlying_type<CamPermission>::type bit = 1;
53 for (
unsigned i = 1; i <
sizeof(bit) * 8; ++i) {
54 CamPermission permission =
static_cast<CamPermission
>(bit);
55 if (has(permission)) {
56 perms.insert(permission);
66 m_bits |=
static_cast<value_type
>(cp);
70CamPermissions& CamPermissions::remove(CamPermission cp)
72 m_bits &= ~static_cast<value_type>(cp);
76ByteBuffer CamPermissions::encode()
const
78 return ByteBuffer({1,
static_cast<uint8_t
>(m_bits),
static_cast<uint8_t
>(m_bits >> 8) });
81CamPermissions CamPermissions::decode(
const ByteBuffer& buffer)
83 CamPermissions permissions;
84 if (buffer.size() == 3 && buffer[0] == 1) {
85 permissions.m_bits = buffer[2];
86 permissions.m_bits <<= 8;
87 permissions.m_bits |= buffer[1];
92std::string stringify(CamPermission permission)
96 case CamPermission::CEN_DSRC_Tolling_Zone:
97 result =
"CEN DSRC Tolling Zone";
99 case CamPermission::Public_Transport:
100 result =
"Public Transport";
102 case CamPermission::Special_Transport:
103 result =
"Special Transport";
105 case CamPermission::Dangerous_Goods:
106 result =
"Dangerous Goods";
108 case CamPermission::Roadwork:
111 case CamPermission::Rescue:
114 case CamPermission::Emergency:
115 result =
"Emergency";
117 case CamPermission::Safety_Car:
119 result =
"Safety Car";
121 case CamPermission::Closed_Lanes:
122 result =
"Closed Lanes";
124 case CamPermission::Request_For_Right_Of_Way:
125 result =
"Request for Right of Way";
127 case CamPermission::Request_For_Free_Crossing_At_Traffic_Light:
128 result =
"Request for Free Crossing at Traffic Light";
130 case CamPermission::No_Passing:
131 result =
"No Passing";
133 case CamPermission::No_Passing_For_Trucks:
134 result =
"No Passing for Trucks";
136 case CamPermission::Speed_Limit:
137 result =
"Speed Limit";
140 static_assert(
sizeof(CamPermission) == 2,
"Expected CamPermission to be 2 bytes wide");
141 result = str(boost::format(
"Reserved (%0#6x)") %
static_cast<uint16_t
>(permission));