Vanetza
 
Loading...
Searching...
No Matches
asn1c_conversion.hpp
1#ifndef ASN1C_CONVERSION_HPP_9E5QN6UC
2#define ASN1C_CONVERSION_HPP_9E5QN6UC
3
4#include <vanetza/asn1/asn1c_wrapper.hpp>
5#include <vanetza/common/byte_buffer_convertible.hpp>
6#include <memory>
7#include <type_traits>
8
9namespace vanetza
10{
11namespace convertible
12{
13
14template<class T>
16{
17public:
18 using wrapper_type = T;
19 static_assert(
20 std::is_base_of<asn1::asn1c_wrapper_common<typename T::asn1c_type>, T>::value,
21 "Only asn1c_wrapper derivates are supported");
22
23 byte_buffer_impl(wrapper_type&& t) :
24 m_wrapper(new wrapper_type(std::move(t)))
25 {
26 }
27
28 byte_buffer_impl(std::shared_ptr<const wrapper_type> other) :
29 m_wrapper(other)
30 {
31 }
32
33 void convert(ByteBuffer& buffer) const override
34 {
35 buffer = m_wrapper->encode();
36 }
37
38 std::unique_ptr<byte_buffer> duplicate() const override
39 {
40 return std::unique_ptr<byte_buffer> {
41 new byte_buffer_impl { m_wrapper }
42 };
43 }
44
45 std::size_t size() const override
46 {
47 return m_wrapper->size();
48 }
49
50 std::shared_ptr<const wrapper_type> wrapper() const
51 {
52 return m_wrapper;
53 }
54
55private:
56 std::shared_ptr<const wrapper_type> m_wrapper;
57};
58
59} // namespace convertible
60} // namespace vanetza
61
62#endif /* ASN1C_CONVERSION_HPP_9E5QN6UC */
63