Vanetza
 
Loading...
Searching...
No Matches
byte_view.hpp
1#ifndef BYTE_VIEW_HPP_TXN2ISMB
2#define BYTE_VIEW_HPP_TXN2ISMB
3
4#include <vanetza/common/byte_buffer.hpp>
5#include <boost/range/iterator_range.hpp>
6#include <iterator>
7#include <memory>
8
9namespace vanetza
10{
11
12// forward declaration
13class ByteBufferConvertible;
14
16{
17public:
18 using iterator_category = std::random_access_iterator_tag;
19 using difference_type = std::ptrdiff_t;
20 using value_type = std::uint8_t;
21 using pointer = const value_type*;
22 using reference = const value_type&;
23
24 byte_view_iterator() = default;
25 explicit byte_view_iterator(pointer p) : m_iterator(p) {}
26 explicit byte_view_iterator(const ByteBuffer::const_iterator& it) : m_iterator(&*it) {}
27
28 constexpr value_type operator*() const
29 {
30 return *m_iterator;
31 }
32
33 constexpr byte_view_iterator& operator++()
34 {
35 ++m_iterator;
36 return *this;
37 }
38
39 constexpr byte_view_iterator operator++(int)
40 {
41 byte_view_iterator it = *this;
42 ++m_iterator;
43 return it;
44 }
45
46 constexpr byte_view_iterator& operator--()
47 {
48 --m_iterator;
49 return *this;
50 }
51
52 constexpr byte_view_iterator operator--(int)
53 {
54 byte_view_iterator it = *this;
55 --m_iterator;
56 return it;
57 }
58
59 constexpr byte_view_iterator& operator+=(difference_type n)
60 {
61 m_iterator += n;
62 return *this;
63 }
64
65 constexpr byte_view_iterator& operator-=(difference_type n)
66 {
67 m_iterator -= n;
68 return *this;
69 }
70
71 constexpr difference_type operator-(const byte_view_iterator& o) const
72 {
73 return m_iterator - o.m_iterator;
74 }
75
76 constexpr reference operator[](difference_type n)
77 {
78 return m_iterator[n];
79 }
80
81 constexpr bool operator==(const byte_view_iterator& o) const
82 {
83 return m_iterator == o.m_iterator;
84 }
85
86 constexpr bool operator!=(const byte_view_iterator& o) const
87 {
88 return m_iterator != o.m_iterator;
89 }
90
91 constexpr bool operator>(const byte_view_iterator& o) const
92 {
93 return m_iterator > o.m_iterator;
94 }
95
96 constexpr bool operator<(const byte_view_iterator& o) const
97 {
98 return m_iterator < o.m_iterator;
99 }
100
101 constexpr bool operator>=(const byte_view_iterator& o) const
102 {
103 return m_iterator >= o.m_iterator;
104 }
105
106 constexpr bool operator<=(const byte_view_iterator& o) const
107 {
108 return m_iterator <= o.m_iterator;
109 }
110
111 constexpr pointer raw() const
112 {
113 return m_iterator;
114 }
115
116private:
117 pointer m_iterator = nullptr;
118};
119
120constexpr byte_view_iterator operator+(byte_view_iterator::difference_type n, byte_view_iterator it)
121{
122 return it += n;
123}
124
125constexpr byte_view_iterator operator+(byte_view_iterator it, byte_view_iterator::difference_type n)
126{
127 return it += n;
128}
129
130/**
131 * byte_view_range fulfills the range concept and provides a view of contiguous bytes
132 * \note private inheritance is used to prevent object slicing
133 */
134class byte_view_range : private boost::iterator_range<byte_view_iterator>
135{
136 using range_type = boost::iterator_range<byte_view_iterator>;
137
138public:
139 using value_type = byte_view_iterator::value_type;
140 using pointer = byte_view_iterator::pointer;
141
142 /**
143 * Construct new view from iterator pair.
144 * \param begin begin iterator of view
145 * \param end end iterator of view
146 * \note View is valid as long as passed iterators are valid
147 */
148 byte_view_range(const ByteBuffer::const_iterator&, const ByteBuffer::const_iterator&);
150
151 /**
152 * Create new view and take ownership of passed buffer
153 * \param buffer pass buffer via rvalue
154 * \note View is valid without limitation
155 */
156 byte_view_range(ByteBuffer&&);
157
158 /**
159 * Get pointer to start of contiguous buffer memory
160 * \return pointer (can be nullptr)
161 */
162 ByteBuffer::const_pointer data() const;
163
164 /**
165 * Access a certain byte within range
166 * \param pos byte position within [0; size()[
167 * \note Override implementation by boost::iterator_range
168 * \return byte value
169 */
170 value_type operator[](size_type) const;
171
172 // make several funtions from boost::iterator_range accessible
173 using range_type::size;
174 using range_type::begin;
175 using range_type::end;
176
177private:
178 ByteBuffer buffer;
179};
180
181/**
182 * Create a byte view based on various byte buffer representations.
183 * View is valid at least as long as passed arguments are valid
184 * \param byte buffer or byte buffer convertible
185 * \return byte view representing passed byte buffer
186 */
187byte_view_range create_byte_view(ByteBuffer&&);
188byte_view_range create_byte_view(const ByteBuffer&);
189byte_view_range create_byte_view(const ByteBufferConvertible&);
190
191} // namespace vanetza
192
193#endif /* BYTE_VIEW_HPP_TXN2ISMB */
194
value_type operator[](size_type) const
Definition: byte_view.cpp:32
ByteBuffer::const_pointer data() const
Definition: byte_view.cpp:26