COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
ArrayView.h
Go to the documentation of this file.
1//
2// Copyright 2017 - 2025 (C). Alex Robenko. All rights reserved.
3//
4// This Source Code Form is subject to the terms of the Mozilla Public
5// License, v. 2.0. If a copy of the MPL was not distributed with this
6// file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
10
11
12#pragma once
13
14#include <algorithm>
15#include <iterator>
16
17#include "comms/Assert.h"
18
19namespace comms
20{
21
22namespace util
23{
24
29template <typename T>
31{
32public:
34 using value_type = T;
35
38
40 using pointer = T*;
41
44
46 using const_pointer = const T*;
47
50
52 using reference = T&;
53
56
58 using const_reference = const T&;
59
62
64 using size_type = std::size_t;
65
68
72
75
78
81
83 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
84
87
90
93
95 ArrayView() noexcept = default;
96
98 ArrayView(const ArrayView&) noexcept = default;
99
102 : data_(data),
103 len_(len)
104 {
105 }
106
108 template <typename TIter>
109 ArrayView(TIter iter, size_type len) noexcept
110 : data_(reinterpret_cast<const_pointer>(&(*iter))),
111 len_(len)
112 {
113 }
114
116 template <std::size_t TN>
117 ArrayView(const T (&data)[TN]) noexcept
118 : data_(data),
119 len_(TN)
120 {
121 }
122
124 template <std::size_t TN>
125 ArrayView(T (&data)[TN]) noexcept
126 : data_(data),
127 len_(TN)
128 {
129 }
130
132 template <typename TIter>
133 ArrayView(TIter first, TIter last) noexcept
134 : data_(reinterpret_cast<const_pointer>(&(*first))),
135 len_(static_cast<std::size_t>(std::distance(first, last)))
136 {
137 COMMS_ASSERT(0 <= std::distance(first, last));
138 }
139
141 ~ArrayView() noexcept = default;
142
144 ArrayView& operator=(const ArrayView&) = default;
145
147 template <std::size_t TN>
148 ArrayView& operator=(const T (&data)[TN])
149 {
150 data_ = data;
151 len_ = TN;
152 return *this;
153 }
154
156 template <std::size_t TN>
157 ArrayView& operator=(T (&data)[TN])
158 {
159 data_ = data;
160 len_ = TN;
161 return *this;
162 }
163
165 constexpr const_iterator begin() const noexcept
166 {
167 return data_;
168 }
169
171 constexpr const_iterator cbegin() const noexcept
172 {
173 return begin();
174 }
175
177 constexpr const_iterator end() const noexcept
178 {
179 return begin() + len_;
180 }
181
183 constexpr const_iterator cend() const noexcept
184 {
185 return end();
186 }
187
190 {
191 return std::reverse_iterator<const_iterator>(end());
192 }
193
196 {
197 return rbegin();
198 }
199
201 reverse_iterator rend() const noexcept
202 {
203 return std::reverse_iterator<const_iterator>(begin());
204 }
205
208 {
209 return rend();
210 }
211
214 {
215 return data_[pos];
216 }
217
221 {
222 COMMS_ASSERT(pos < len_);
223 return data_[pos];
224 }
225
228 constexpr const_reference front() const
229 {
230 return data_[0];
231 }
232
235 constexpr const_reference back() const
236 {
237 return data_[len_ - 1U];
238 }
239
241 constexpr size_type size() const noexcept
242 {
243 return len_;
244 }
245
247 constexpr size_type length() const noexcept
248 {
249 return size();
250 }
251
254 constexpr bool empty() const noexcept
255 {
256 return size() == 0U;
257 }
258
262 {
263 std::advance(data_, n);
264 len_ -= n;
265 }
266
270 {
271 len_ -= n;
272 }
273
275 void swap(ArrayView& other) noexcept
276 {
277 std::swap(data_, other.data_);
278 std::swap(len_, other.len_);
279 }
280
281
282private:
283 const_pointer data_ = nullptr;
284 size_type len_ = 0;
285};
286
289template<typename T>
290bool operator<(const ArrayView<T>& view1, const ArrayView<T>& view2) noexcept
291{
292 return std::lexicographical_compare(view1.begin(), view1.end(), view2.begin(), view2.end());
293}
294
297template<typename T>
298bool operator<=(const ArrayView<T>& view1, const ArrayView<T>& view2) noexcept
299{
300 return !(view2 < view1);
301}
302
305template<typename T>
306bool operator>(const ArrayView<T>& view1, const ArrayView<T>& view2) noexcept
307{
308 return (view2 < view1);
309}
310
313template<typename T>
314bool operator>=(const ArrayView<T>& view1, const ArrayView<T>& view2) noexcept
315{
316 return !(view1 < view2);
317}
318
321template<typename T>
322bool operator==(const ArrayView<T>& view1, const ArrayView<T>& view2) noexcept
323{
324 return
325 (view1.size() == view2.size()) &&
326 std::equal(view1.begin(), view1.end(), view2.begin());
327}
328
331template<typename T>
332bool operator!=(const ArrayView<T>& view1, const ArrayView<T>& view2) noexcept
333{
334 return !(view1 == view2);
335}
336
337
338} // namespace util
339
340} // namespace comms
341
342namespace std
343{
344
347template <typename T>
349{
350 view1.swap(view2);
351}
352
353} // namespace std
This file contains classes required for generic custom assertion functionality.
#define COMMS_ASSERT(expr)
Generic assert macro.
Definition Assert.h:170
Describes an object that can refer to a constant contiguous sequence of other objects.
Definition ArrayView.h:31
const_iterator ConstIterator
Same as const_iterator.
Definition ArrayView.h:74
~ArrayView() noexcept=default
Destructor.
const_reference at(size_type pos) const
Element access with range check.
Definition ArrayView.h:220
bool operator!=(const ArrayView< T > &view1, const ArrayView< T > &view2) noexcept
Inequality compare between the views.
Definition ArrayView.h:332
constexpr const_iterator begin() const noexcept
Iterator to begining of the sequence.
Definition ArrayView.h:165
pointer Pointer
Same as pointer.
Definition ArrayView.h:43
reverse_iterator ReverseIterator
Same as reverse_iterator.
Definition ArrayView.h:92
void remove_prefix(size_type n)
Narrow the view by skipping number of elements at the beginning.
Definition ArrayView.h:261
bool operator<(const ArrayView< T > &view1, const ArrayView< T > &view2) noexcept
Lexicographical compare between the views.
Definition ArrayView.h:290
bool operator<=(const ArrayView< T > &view1, const ArrayView< T > &view2) noexcept
Lexicographical compare between the views.
Definition ArrayView.h:298
ArrayView & operator=(T(&data)[TN])
Assign array of elements with known size.
Definition ArrayView.h:157
const_reverse_iterator crend() const noexcept
Reverse iterator to the beginning of the sequence.
Definition ArrayView.h:207
const_iterator iterator
Same as const_iterator.
Definition ArrayView.h:77
constexpr const_iterator end() const noexcept
Iterator to the end of the sequence.
Definition ArrayView.h:177
ArrayView() noexcept=default
Default constructor.
value_type ValueType
Same as value_type.
Definition ArrayView.h:37
bool operator>=(const ArrayView< T > &view1, const ArrayView< T > &view2) noexcept
Lexicographical compare between the views.
Definition ArrayView.h:314
constexpr size_type size() const noexcept
Get number of element in the view.
Definition ArrayView.h:241
std::reverse_iterator< const_iterator > const_reverse_iterator
Same as std::reverse_iterator<const_iterator>
Definition ArrayView.h:83
iterator Iterator
Same as iterator.
Definition ArrayView.h:80
std::size_t size_type
Equal to std::size_t.
Definition ArrayView.h:64
T * pointer
Pointer to the single element (T*)
Definition ArrayView.h:40
reverse_iterator rend() const noexcept
Reverse iterator to the beginning of the sequence.
Definition ArrayView.h:201
void remove_suffix(size_type n)
Narrow the view by dropping number of elements at the end.
Definition ArrayView.h:269
constexpr const_reference operator[](size_type pos) const
Element access operator.
Definition ArrayView.h:213
ArrayView(TIter iter, size_type len) noexcept
Constructor.
Definition ArrayView.h:109
const_reverse_iterator ConstReverseIterator
Same as const_reverse_iterator.
Definition ArrayView.h:86
reference Reference
Same as reference.
Definition ArrayView.h:55
bool operator>(const ArrayView< T > &view1, const ArrayView< T > &view2) noexcept
Lexicographical compare between the views.
Definition ArrayView.h:306
constexpr size_type length() const noexcept
Same as ref size()
Definition ArrayView.h:247
const_reference ConstReference
Same as const_reference.
Definition ArrayView.h:61
constexpr bool empty() const noexcept
Check the view is empty.
Definition ArrayView.h:254
ArrayView(const T(&data)[TN]) noexcept
Construct out of array of elements with known size.
Definition ArrayView.h:117
constexpr const_iterator cend() const noexcept
Iterator to the end of the sequence.
Definition ArrayView.h:183
bool operator==(const ArrayView< T > &view1, const ArrayView< T > &view2) noexcept
Equality compare between the views.
Definition ArrayView.h:322
void swap(ArrayView &other) noexcept
Swap contents of two views.
Definition ArrayView.h:275
const_reverse_iterator reverse_iterator
Same as const_reverse_iterator.
Definition ArrayView.h:89
size_type SizeType
Same as size_type;.
Definition ArrayView.h:67
const_pointer const_iterator
Implementation defined constant RandomAccessIterator and ContiguousIterator whose value_type is T.
Definition ArrayView.h:71
const_pointer ConstPointer
Same as const_pointer.
Definition ArrayView.h:49
ArrayView(TIter first, TIter last) noexcept
Construct out of iterators rande.
Definition ArrayView.h:133
T & reference
Reference to an element (T&)
Definition ArrayView.h:52
ArrayView(T(&data)[TN]) noexcept
Construct out of array of elements with known size.
Definition ArrayView.h:125
T value_type
Type of the single element.
Definition ArrayView.h:34
constexpr const_iterator cbegin() const noexcept
Iterator to begining of the sequence.
Definition ArrayView.h:171
const_reverse_iterator crbegin() const noexcept
Reverse iterator to the end of the sequence.
Definition ArrayView.h:195
const T & const_reference
Reference to a const element (const T&)
Definition ArrayView.h:58
const_reverse_iterator rbegin() const noexcept
Reverse iterator to the end of the sequence.
Definition ArrayView.h:189
const T * const_pointer
Pointer to the constant element (const T*)
Definition ArrayView.h:46
constexpr const_reference front() const
Access the first element.
Definition ArrayView.h:228
constexpr const_reference back() const
Access the last element.
Definition ArrayView.h:235
Main namespace for all classes / functions of COMMS library.
STL namespace.