Sen API
Sen Libraries
Loading...
Searching...
No Matches
iterator_adapters.h
Go to the documentation of this file.
1// === iterator_adapters.h =============================================================================================
2// Sen Infrastructure
3// Released under the Apache License v2.0 (SPDX-License-Identifier Apache-2.0).
4// See the LICENSE.txt file for more information.
5// © Airbus SAS, Airbus Helicopters, and Airbus Defence and Space SAU/GmbH/SAS.
6// =====================================================================================================================
7
8#ifndef SEN_CORE_BASE_ITERATOR_ADAPTERS_H
9#define SEN_CORE_BASE_ITERATOR_ADAPTERS_H
10
11// std
12#include <cstddef>
13#include <iterator>
14
15namespace sen::util
16{
17
18//===--------------------------------------------------------------------------------------------------------------===//
19// Base Definitions
20//===--------------------------------------------------------------------------------------------------------------===//
21
23template <typename IteratorType>
25{
26 IteratorRange(IteratorType begin, IteratorType end): begin_(std::move(begin)), end_(std::move(end)) {}
27
28 [[nodiscard]] IteratorType begin() const { return begin_; }
29 [[nodiscard]] IteratorType end() const { return end_; }
30 [[nodiscard]] bool empty() const { return begin_ == end_; }
31
32private:
33 IteratorType begin_;
34 IteratorType end_;
35};
36
51template <typename IteratorType>
52IteratorRange<IteratorType> makeRange(IteratorType begin, IteratorType end)
53{
54 return {std::move(begin), std::move(end)};
55}
56
70template <typename ContainerType>
71auto makeRange(ContainerType& container)
72{
73 return makeRange(std::begin(container), std::end(container));
74}
75
76//===--------------------------------------------------------------------------------------------------------------===//
77// Range Adapters
78//===--------------------------------------------------------------------------------------------------------------===//
79
86template <template <typename> typename LockType, typename IteratorType, typename MutexType>
88{
89public:
90 template <typename ContainerType>
91 LockedRangeAdapter(ContainerType& container, MutexType& m)
92 : lock_(m), beginIterator_(std::begin(container)), endIterator_(std::end(container))
93 {
94 }
95
96 LockedRangeAdapter(IteratorType begin, IteratorType end, MutexType& m)
97 : lock_(m), beginIterator_(begin), endIterator_(end)
98 {
99 }
100
101 [[nodiscard]] IteratorType begin() const noexcept(std::is_nothrow_copy_constructible_v<IteratorType>)
102 {
103 return beginIterator_;
104 }
105 [[nodiscard]] IteratorType end() const noexcept(std::is_nothrow_copy_constructible_v<IteratorType>)
106 {
107 return endIterator_;
108 }
109
110private:
111 LockType<MutexType> lock_;
112 IteratorType beginIterator_;
113 IteratorType endIterator_;
114};
115
131template <template <typename> typename LockType, typename IteratorType, typename MutexType>
132auto makeLockedRange(IteratorType begin, IteratorType end, MutexType& m)
133{
135}
136
151template <template <typename> typename LockType, typename ContainerType, typename MutexType>
152auto makeLockedRange(ContainerType& container, MutexType& m)
153{
154 if constexpr (std::is_const_v<ContainerType>)
155 {
157 }
158 else
159 {
161 }
162}
163
164//===--------------------------------------------------------------------------------------------------------------===//
165// Iterator Adapters
166//===--------------------------------------------------------------------------------------------------------------===//
167
183template <typename IteratorType>
185{
186 explicit SmartPtrIteratorAdapter(IteratorType iter): iter_(iter) {}
187
188 // NOLINTBEGIN(readability-identifier-naming): iterator tags
189 using iterator_category = typename IteratorType::iterator_category;
190 using difference_type = std::ptrdiff_t;
191 using value_type = typename IteratorType::value_type::element_type;
194 // NOLINTEND(readability-identifier-naming)
195
196 pointer operator*() const { return iter_->get(); }
197 reference operator->() const { return operator*(); }
198
200 {
201 ++iter_;
202 return *this;
203 }
205 {
206 auto old = *this;
207 operator++();
208 return old;
209 }
210
212 {
213 return lhs.iter_ == rhs.iter_;
214 }
216 {
217 return !(lhs == rhs);
218 }
219
220private:
221 IteratorType iter_;
222};
223
224} // namespace sen::util
225
226#endif // SEN_CORE_BASE_ITERATOR_ADAPTERS_H
A range adapter to combine a range with lock.
Definition iterator_adapters.h:88
LockedRangeAdapter(IteratorType begin, IteratorType end, MutexType &m)
Definition iterator_adapters.h:96
LockedRangeAdapter(ContainerType &container, MutexType &m)
Definition iterator_adapters.h:91
IteratorType begin() const noexcept(std::is_nothrow_copy_constructible_v< IteratorType >)
Definition iterator_adapters.h:101
IteratorType end() const noexcept(std::is_nothrow_copy_constructible_v< IteratorType >)
Definition iterator_adapters.h:105
Definition iterator_adapters.h:16
auto makeLockedRange(IteratorType begin, IteratorType end, MutexType &m)
Create a LockedRangeAdapter for the given iterator pair and lock the given mutex.
Definition iterator_adapters.h:132
IteratorRange< IteratorType > makeRange(IteratorType begin, IteratorType end)
Create a simple range for the two iterators.
Definition iterator_adapters.h:52
STL namespace.
Basic range abstraction to form a minimal range around two iterators.
Definition iterator_adapters.h:25
util::SmartPtrIteratorAdapter< UnitStorage::const_iterator > begin() const
Definition iterator_adapters.h:28
util::SmartPtrIteratorAdapter< UnitStorage::const_iterator > end() const
Definition iterator_adapters.h:29
bool empty() const
Definition iterator_adapters.h:30
IteratorRange(IteratorType begin, IteratorType end)
Definition iterator_adapters.h:26
pointer operator*() const
Definition iterator_adapters.h:196
typename IteratorType::iterator_category iterator_category
Definition iterator_adapters.h:189
std::ptrdiff_t difference_type
Definition iterator_adapters.h:190
SmartPtrIteratorAdapter & operator++()
Definition iterator_adapters.h:199
friend bool operator!=(const SmartPtrIteratorAdapter &lhs, const SmartPtrIteratorAdapter &rhs)
Definition iterator_adapters.h:215
friend bool operator==(const SmartPtrIteratorAdapter &lhs, const SmartPtrIteratorAdapter &rhs)
Definition iterator_adapters.h:211
SmartPtrIteratorAdapter(IteratorType iter)
Definition iterator_adapters.h:186
typename IteratorType::value_type::element_type value_type
Definition iterator_adapters.h:191
reference operator->() const
Definition iterator_adapters.h:197
value_type & reference
Definition iterator_adapters.h:193
value_type * pointer
Definition iterator_adapters.h:192
SmartPtrIteratorAdapter operator++(int)
Definition iterator_adapters.h:204