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/common/byte_buffer.hpp>
16void* allocate(std::size_t);
17void free(asn_TYPE_descriptor_t&,
void*);
18void* copy(asn_TYPE_descriptor_t&,
const void*);
19bool validate(asn_TYPE_descriptor_t&,
const void*);
20bool validate(asn_TYPE_descriptor_t&,
const void*, std::string&);
21int compare(asn_TYPE_descriptor_t&,
const void*,
const void*);
22int print(FILE* stream, asn_TYPE_descriptor_t&,
const void*);
23std::size_t size_per(asn_TYPE_descriptor_t&,
const void*);
24std::size_t size_oer(asn_TYPE_descriptor_t&,
const void*);
25std::size_t size_xer(asn_TYPE_descriptor_t&,
const void*);
26ByteBuffer encode_per(asn_TYPE_descriptor_t&,
const void*);
27bool decode_per(asn_TYPE_descriptor_t&,
void**,
const ByteBuffer&);
28bool decode_per(asn_TYPE_descriptor_t&,
void**,
const void* buffer, std::size_t size);
29ByteBuffer encode_oer(asn_TYPE_descriptor_t&,
const void*);
30bool decode_oer(asn_TYPE_descriptor_t&,
void**,
const ByteBuffer&);
31bool decode_oer(asn_TYPE_descriptor_t&,
void**,
const void* buffer, std::size_t size);
32ByteBuffer encode_xer(asn_TYPE_descriptor_t&,
const void*);
33bool decode_xer(asn_TYPE_descriptor_t&,
void**,
const ByteBuffer&);
34bool decode_xer(asn_TYPE_descriptor_t&,
void**,
const void* buffer, std::size_t size);
39 return static_cast<T*
>(allocate(
sizeof(T)));
43class asn1c_wrapper_common
49 asn1c_wrapper_common(asn_TYPE_descriptor_t& desc) :
50 m_struct(vanetza::asn1::allocate<asn1c_type>()), m_type(desc) {}
51 asn1c_wrapper_common(asn_TYPE_descriptor_t& desc,
const T* ptr) :
52 m_struct(
static_cast<T*
>(copy(desc, ptr))), m_type(desc) {}
53 ~asn1c_wrapper_common() { vanetza::asn1::free(m_type, m_struct); }
56 asn1c_wrapper_common(
const asn1c_wrapper_common& other) :
57 m_struct(
static_cast<asn1c_type*
>(copy(other.m_type, other.m_struct))), m_type(other.m_type) {}
58 asn1c_wrapper_common& operator=(
const asn1c_wrapper_common& other)
60 asn1c_wrapper_common tmp = other;
66 asn1c_wrapper_common(asn1c_wrapper_common&& other) noexcept :
67 m_struct(
nullptr), m_type(other.m_type) {
swap(other); }
68 asn1c_wrapper_common& operator=(asn1c_wrapper_common&& other)
noexcept
75 asn1c_type& operator*() {
return *m_struct; }
76 asn1c_type* operator->() {
return m_struct; }
77 const asn1c_type& operator*()
const {
return *m_struct; }
78 const asn1c_type* operator->()
const {
return m_struct; }
81 const asn1c_type* content()
const {
return m_struct; }
82 asn1c_type* content() {
return m_struct; }
85 bool operator==(
const asn1c_wrapper_common& rhs)
const
87 return vanetza::asn1::compare(m_type, m_struct, rhs.m_struct) == 0;
89 bool operator!=(
const asn1c_wrapper_common& rhs)
const
91 return vanetza::asn1::compare(m_type, m_struct, rhs.m_struct) != 0;
101 return vanetza::asn1::validate(m_type, m_struct);
111 return vanetza::asn1::validate(m_type, m_struct, error);
119 int compare(
const asn1c_wrapper_common& other)
const
121 return vanetza::asn1::compare(m_type, m_struct, other.m_struct);
130 return vanetza::asn1::print(stdout, m_type, m_struct);
140 return vanetza::asn1::print(stream, m_type, m_struct);
147 void swap(asn1c_wrapper_common& other)
noexcept
149 std::swap(m_struct, other.m_struct);
150 std::swap(m_type, other.m_type);
154 asn1c_type* m_struct;
155 asn_TYPE_descriptor_t& m_type;
159void swap(asn1c_wrapper_common<T>& lhs, asn1c_wrapper_common<T>& rhs)
169 using base = asn1c_wrapper_common<T>;
178 return vanetza::asn1::encode_per(base::m_type, base::m_struct);
188 return vanetza::asn1::decode_per(base::m_type, (
void**)&(base::m_struct), buffer);
191 bool decode(ByteBuffer::const_iterator begin, ByteBuffer::const_iterator end)
193 return vanetza::asn1::decode_per(base::m_type, (
void**)&(base::m_struct), &(*begin), std::distance(begin, end));
196 bool decode(
const void* buffer, std::size_t len)
198 return vanetza::asn1::decode_per(base::m_type, (
void**)&(base::m_struct), buffer, len);
207 return vanetza::asn1::size_per(base::m_type, base::m_struct);
212using asn1c_wrapper = asn1c_per_wrapper<T>;
219 using base = asn1c_wrapper_common<T>;
228 return vanetza::asn1::encode_oer(base::m_type, base::m_struct);
239 return vanetza::asn1::decode_oer(base::m_type, (
void**)&(base::m_struct), buffer);
242 bool decode(ByteBuffer::const_iterator begin, ByteBuffer::const_iterator end)
244 return vanetza::asn1::decode_oer(base::m_type, (
void**)&(base::m_struct), &(*begin), std::distance(begin, end));
247 bool decode(
const void* buffer, std::size_t len)
249 return vanetza::asn1::decode_oer(base::m_type, (
void**)&(base::m_struct), buffer, len);
258 return vanetza::asn1::size_oer(base::m_type, base::m_struct);
266 using base = asn1c_wrapper_common<T>;
275 return vanetza::asn1::encode_xer(base::m_type, base::m_struct);
285 return vanetza::asn1::decode_xer(base::m_type, (
void**)&(base::m_struct), buffer);
288 bool decode(ByteBuffer::const_iterator begin, ByteBuffer::const_iterator end)
290 return vanetza::asn1::decode_xer(base::m_type, (
void**)&(base::m_struct), &(*begin), std::distance(begin, end));
293 bool decode(
const void* buffer, std::size_t len)
295 return vanetza::asn1::decode_xer(base::m_type, (
void**)&(base::m_struct), buffer, len);
304 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)