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 IteratorType begin() const noexcept(std::is_nothrow_copy_constructible_v<IteratorType>) { return beginIterator_; }
102 IteratorType end() const noexcept(std::is_nothrow_copy_constructible_v<IteratorType>) { return endIterator_; }
103
104private:
105 LockType<MutexType> lock_;
106 IteratorType beginIterator_;
107 IteratorType endIterator_;
108};
109
125template <template <typename> typename LockType, typename IteratorType, typename MutexType>
126auto makeLockedRange(IteratorType begin, IteratorType end, MutexType& m)
127{
129}
130
145template <template <typename> typename LockType, typename ContainerType, typename MutexType>
146auto makeLockedRange(ContainerType& container, MutexType& m)
147{
148 if constexpr (std::is_const_v<ContainerType>)
149 {
151 }
152 else
153 {
155 }
156}
157
158//===--------------------------------------------------------------------------------------------------------------===//
159// Iterator Adapters
160//===--------------------------------------------------------------------------------------------------------------===//
161
177template <typename IteratorType>
179{
180 explicit SmartPtrIteratorAdapter(IteratorType iter): iter_(iter) {}
181
182 // NOLINTBEGIN(readability-identifier-naming): iterator tags
183 using iterator_category = typename IteratorType::iterator_category;
184 using difference_type = std::ptrdiff_t;
185 using value_type = typename IteratorType::value_type::element_type;
188 // NOLINTEND(readability-identifier-naming)
189
190 pointer operator*() const { return iter_->get(); }
191 reference operator->() const { return operator*(); }
192
194 {
195 ++iter_;
196 return *this;
197 }
199 {
200 auto old = *this;
201 operator++();
202 return old;
203 }
204
206 {
207 return lhs.iter_ == rhs.iter_;
208 }
210 {
211 return !(lhs == rhs);
212 }
213
214private:
215 IteratorType iter_;
216};
217
218} // namespace sen::util
219
220#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:102
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:126
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:190
typename IteratorType::iterator_category iterator_category
Definition iterator_adapters.h:183
std::ptrdiff_t difference_type
Definition iterator_adapters.h:184
SmartPtrIteratorAdapter & operator++()
Definition iterator_adapters.h:193
friend bool operator!=(const SmartPtrIteratorAdapter &lhs, const SmartPtrIteratorAdapter &rhs)
Definition iterator_adapters.h:209
friend bool operator==(const SmartPtrIteratorAdapter &lhs, const SmartPtrIteratorAdapter &rhs)
Definition iterator_adapters.h:205
SmartPtrIteratorAdapter(IteratorType iter)
Definition iterator_adapters.h:180
typename IteratorType::value_type::element_type value_type
Definition iterator_adapters.h:185
reference operator->() const
Definition iterator_adapters.h:191
value_type & reference
Definition iterator_adapters.h:187
value_type * pointer
Definition iterator_adapters.h:186
SmartPtrIteratorAdapter operator++(int)
Definition iterator_adapters.h:198