8namespace opcua::detail {
10template <
typename Iter,
typename F>
11class TransformIterator {
13 using iterator_type = Iter;
14 using iterator_category =
typename std::iterator_traits<Iter>::iterator_category;
16 typename std::invoke_result_t<F, typename std::iterator_traits<Iter>::value_type>;
17 using difference_type =
typename std::iterator_traits<Iter>::difference_type;
18 using pointer = value_type*;
19 using reference = value_type&;
21 constexpr TransformIterator(Iter it, F func)
23 func_(std::move(func)) {}
25 constexpr const Iter& base() const& noexcept {
29 constexpr Iter base() && {
33 constexpr value_type operator*()
const {
34 return std::invoke(func_, *it_);
37 constexpr value_type operator[](difference_type n)
const {
41 constexpr TransformIterator& operator++() {
46 constexpr TransformIterator operator++(
int) {
52 constexpr TransformIterator operator+(difference_type n)
const {
53 return {it_ + n, func_};
56 constexpr TransformIterator& operator+=(difference_type n) {
61 constexpr TransformIterator& operator--() {
66 constexpr TransformIterator operator--(
int) {
72 constexpr TransformIterator operator-(difference_type n)
const {
73 return {it_ - n, func_};
76 constexpr TransformIterator& operator-=(difference_type n) {
83 std::decay_t<F> func_;
86template <
typename Iter1,
typename F1,
typename Iter2,
typename F2>
87constexpr auto operator==(
88 const TransformIterator<Iter1, F1>& lhs,
const TransformIterator<Iter2, F2>& rhs
90 return lhs.base() == rhs.base();
93template <
typename Iter1,
typename F1,
typename Iter2,
typename F2>
94constexpr auto operator!=(
95 const TransformIterator<Iter1, F1>& lhs,
const TransformIterator<Iter2, F2>& rhs
97 return lhs.base() != rhs.base();
100template <
typename Iter1,
typename F1,
typename Iter2,
typename F2>
101constexpr auto operator<(
102 const TransformIterator<Iter1, F1>& lhs,
const TransformIterator<Iter2, F2>& rhs
104 return lhs.base() < rhs.base();
107template <
typename Iter1,
typename F1,
typename Iter2,
typename F2>
108constexpr auto operator<=(
109 const TransformIterator<Iter1, F1>& lhs,
const TransformIterator<Iter2, F2>& rhs
111 return lhs.base() <= rhs.base();
114template <
typename Iter1,
typename F1,
typename Iter2,
typename F2>
115constexpr auto operator>(
116 const TransformIterator<Iter1, F1>& lhs,
const TransformIterator<Iter2, F2>& rhs
118 return lhs.base() > rhs.base();
121template <
typename Iter1,
typename F1,
typename Iter2,
typename F2>
122constexpr auto operator>=(
123 const TransformIterator<Iter1, F1>& lhs,
const TransformIterator<Iter2, F2>& rhs
125 return lhs.base() >= rhs.base();
128template <
typename Iter,
typename F>
129constexpr TransformIterator<Iter, F> operator+(
130 const TransformIterator<Iter, F>& it,
typename TransformIterator<Iter, F>::difference_type n
132 return {it.base() + n, it.func_};
135template <
typename Iter1,
typename F1,
typename Iter2,
typename F2>
136constexpr auto operator-(
137 const TransformIterator<Iter1, F1>& lhs,
const TransformIterator<Iter2, F2>& rhs
139 return lhs.base() - rhs.base();