Vanetza
 
Loading...
Searching...
No Matches
byte_buffer_convertible.hpp
1#ifndef BYTE_BUFFER_CONVERTIBLE_HPP_CFOQNR35
2#define BYTE_BUFFER_CONVERTIBLE_HPP_CFOQNR35
3
4#include <vanetza/common/byte_buffer.hpp>
5#include <cstddef>
6#include <memory>
7#include <string>
8#include <type_traits>
9
10namespace vanetza
11{
12namespace convertible
13{
14
16{
17 virtual void convert(ByteBuffer&) const = 0;
18 virtual std::size_t size() const = 0;
19 virtual std::unique_ptr<byte_buffer> duplicate() const;
20 virtual ~byte_buffer() {}
21};
22
23template<class T>
24struct byte_buffer_impl;
25
26template<>
27struct byte_buffer_impl<ByteBuffer> : public byte_buffer
28{
29 byte_buffer_impl(ByteBuffer&& buffer) : m_buffer(std::move(buffer)) {}
30 void convert(ByteBuffer& buf) const override { buf = m_buffer; }
31 std::size_t size() const override { return m_buffer.size(); }
32
33 ByteBuffer m_buffer;
34};
35
36template<>
37struct byte_buffer_impl<std::unique_ptr<ByteBuffer>> : public byte_buffer
38{
39 byte_buffer_impl(std::unique_ptr<ByteBuffer> buf) :
40 m_buffer(std::move(buf)) {}
41 void convert(ByteBuffer& buf) const override { buf = *m_buffer; }
42 std::size_t size() const override { return m_buffer->size(); }
43
44 std::unique_ptr<ByteBuffer> m_buffer;
45};
46
47template<>
48struct byte_buffer_impl<std::string> : public byte_buffer
49{
50 byte_buffer_impl(const std::string& str);
51 byte_buffer_impl(std::string&& str);
52 void convert(ByteBuffer& buffer) const override;
53 std::size_t size() const override;
54
55 std::string m_buffer;
56};
57
58template<>
59struct byte_buffer_impl<std::nullptr_t> : public byte_buffer
60{
61 void convert(ByteBuffer& buffer) const override { buffer.clear(); }
62 std::size_t size() const override { return 0; }
63 std::unique_ptr<byte_buffer> duplicate() const override;
64};
65
66} // namespace convertible
67
68/**
69 * ByteBufferConvertible is an extensible mechanism for providing
70 * ByteBuffer representations of various data structures and objects.
71 *
72 * ByteBufferConvertible utilizes type erasure and accesses byte buffer data
73 * through the convertible::byte_buffer interface.
74 * Extending ByteBufferConvertible is possible by providing specializations
75 * of convertible::byte_buffer_impl<T> implementing convertible::byte_buffer.
76 */
78{
79public:
82
83 ByteBufferConvertible(std::unique_ptr<convertible::byte_buffer> ptr) :
84 m_wrapper(std::move(ptr)) {}
85
86 template<class T>
88 m_wrapper(new convertible::byte_buffer_impl<typename std::decay<T>::type>(std::forward<T>(t))) {}
89
92
94 ByteBufferConvertible& operator=(ByteBufferConvertible&& other) = default;
95
96 void convert(ByteBuffer& destination) const { m_wrapper->convert(destination); }
97 std::size_t size() const { return m_wrapper->size(); }
98
99 const convertible::byte_buffer* ptr() const { return m_wrapper.get(); }
100 convertible::byte_buffer* ptr() { return m_wrapper.get(); }
101
102private:
103 std::unique_ptr<convertible::byte_buffer> m_wrapper;
104};
105
106} // namespace vanetza
107
108#endif /* BYTE_BUFFER_CONVERTIBLE_HPP_CFOQNR35 */
109
STL namespace.