1#ifndef ASN1C_WRAPPER_HPP_ZCNDO8E5
2#define ASN1C_WRAPPER_HPP_ZCNDO8E5
4#include <vanetza/asn1/support/asn_system.h>
5#include <vanetza/asn1/support/constr_TYPE.h>
6#include <vanetza/asn1/type_traits.hpp>
7#include <vanetza/common/byte_buffer.hpp>
18void* allocate(std::size_t);
19void free(asn_TYPE_descriptor_t&,
void*);
20void* copy(asn_TYPE_descriptor_t&,
const void*);
21bool validate(asn_TYPE_descriptor_t&,
const void*);
22bool validate(asn_TYPE_descriptor_t&,
const void*, std::string&);
23int compare(asn_TYPE_descriptor_t&,
const void*,
const void*);
24int print(FILE* stream, asn_TYPE_descriptor_t&,
const void*);
25std::size_t size_per(asn_TYPE_descriptor_t&,
const void*);
26std::size_t size_oer(asn_TYPE_descriptor_t&,
const void*);
27std::size_t size_xer(asn_TYPE_descriptor_t&,
const void*);
28ByteBuffer encode_per(asn_TYPE_descriptor_t&,
const void*);
29bool decode_per(asn_TYPE_descriptor_t&,
void**,
const ByteBuffer&);
30bool decode_per(asn_TYPE_descriptor_t&,
void**,
const void* buffer, std::size_t size);
31ByteBuffer encode_oer(asn_TYPE_descriptor_t&,
const void*);
32bool decode_oer(asn_TYPE_descriptor_t&,
void**,
const ByteBuffer&);
33bool decode_oer(asn_TYPE_descriptor_t&,
void**,
const void* buffer, std::size_t size);
34ByteBuffer encode_xer(asn_TYPE_descriptor_t&,
const void*);
35bool decode_xer(asn_TYPE_descriptor_t&,
void**,
const ByteBuffer&);
36bool decode_xer(asn_TYPE_descriptor_t&,
void**,
const void* buffer, std::size_t size);
41 return static_cast<T*>(allocate(
sizeof(T)));
47 asn_TYPE_descriptor_t* descriptor =
nullptr;
49 void operator()(
void* ptr)
const;
53
54
55
56
58std::unique_ptr<T,
deleter> make_unique(asn_TYPE_descriptor_t& descriptor)
60 return std::unique_ptr<T,
deleter> { allocate<T>(),
deleter { &descriptor } };
64
65
66
67
69std::unique_ptr<T,
deleter> make_unique()
81 asn1c_wrapper_common(asn_TYPE_descriptor_t& desc) :
82 m_struct(vanetza::asn1::allocate<asn1c_type>()), m_type(desc) {}
83 asn1c_wrapper_common(asn_TYPE_descriptor_t& desc,
const T* ptr) :
84 m_struct(
static_cast<T*>(copy(desc, ptr))), m_type(desc) {}
85 ~asn1c_wrapper_common() { vanetza::asn1::free(m_type, m_struct); }
89 m_struct(
static_cast<asn1c_type*>(copy(other.m_type, other.m_struct))), m_type(other.m_type) {}
99 m_struct(
nullptr), m_type(other.m_type) {
swap(other
); }
107 asn1c_type& operator*() {
return *m_struct; }
108 asn1c_type* operator->() {
return m_struct; }
109 const asn1c_type& operator*()
const {
return *m_struct; }
110 const asn1c_type* operator->()
const {
return m_struct; }
113 const asn1c_type* content()
const {
return m_struct; }
114 asn1c_type* content() {
return m_struct; }
119 return vanetza::asn1::compare(m_type, m_struct, rhs.m_struct) == 0;
123 return vanetza::asn1::compare(m_type, m_struct, rhs.m_struct) != 0;
127
128
129
130
133 return vanetza::asn1::validate(m_type, m_struct);
137
138
139
140
143 return vanetza::asn1::validate(m_type, m_struct, error);
147
148
149
150
153 return vanetza::asn1::compare(m_type, m_struct, other.m_struct);
157
158
159
162 return vanetza::asn1::print(stdout, m_type, m_struct);
166
167
168
169
172 return vanetza::asn1::print(stream, m_type, m_struct);
176
177
178
181 std::swap(m_struct, other.m_struct);
182 std::swap(m_type, other.m_type);
186 asn1c_type* m_struct;
187 asn_TYPE_descriptor_t& m_type;
205
206
207
210 return vanetza::asn1::encode_per(base::m_type, base::m_struct);
214
215
216
217
220 return vanetza::asn1::decode_per(base::m_type, (
void**)&(base::m_struct), buffer);
223 bool decode(ByteBuffer::const_iterator begin, ByteBuffer::const_iterator end)
225 return vanetza::asn1::decode_per(base::m_type, (
void**)&(base::m_struct), &(*begin), std::distance(begin, end));
228 bool decode(
const void* buffer, std::size_t len)
230 return vanetza::asn1::decode_per(base::m_type, (
void**)&(base::m_struct), buffer, len);
234
235
236
239 return vanetza::asn1::size_per(base::m_type, base::m_struct);
255
256
257
260 return vanetza::asn1::encode_oer(base::m_type, base::m_struct);
264
265
266
267
268
271 return vanetza::asn1::decode_oer(base::m_type, (
void**)&(base::m_struct), buffer);
274 bool decode(ByteBuffer::const_iterator begin, ByteBuffer::const_iterator end)
276 return vanetza::asn1::decode_oer(base::m_type, (
void**)&(base::m_struct), &(*begin), std::distance(begin, end));
279 bool decode(
const void* buffer, std::size_t len)
281 return vanetza::asn1::decode_oer(base::m_type, (
void**)&(base::m_struct), buffer, len);
285
286
287
290 return vanetza::asn1::size_oer(base::m_type, base::m_struct);
302
303
304
307 return vanetza::asn1::encode_xer(base::m_type, base::m_struct);
311
312
313
314
317 return vanetza::asn1::decode_xer(base::m_type, (
void**)&(base::m_struct), buffer);
320 bool decode(ByteBuffer::const_iterator begin, ByteBuffer::const_iterator end)
322 return vanetza::asn1::decode_xer(base::m_type, (
void**)&(base::m_struct), &(*begin), std::distance(begin, end));
325 bool decode(
const void* buffer, std::size_t len)
327 return vanetza::asn1::decode_xer(base::m_type, (
void**)&(base::m_struct), buffer, len);
331
332
333
336 return vanetza::asn1::size_xer(base::m_type, base::m_struct);
ByteBuffer encode() const
bool decode(const ByteBuffer &buffer)
ByteBuffer encode() const
bool decode(const ByteBuffer &buffer)
void swap(asn1c_wrapper_common &other) noexcept
int compare(const asn1c_wrapper_common &other) const
bool validate(std::string &error) const
int print(FILE *stream) const
ByteBuffer encode() const
bool decode(const ByteBuffer &buffer)
Deleter freeing an asn1c struct through its ASN.1 type descriptor.