1 //
2 // Copyright © 2020,2023 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6
7 #include <iterator>
8
9 namespace armnn
10 {
11
12 template<typename Function,
13 typename Iterator,
14 typename Category = typename std::iterator_traits<Iterator>::iterator_category,
15 typename T = typename std::iterator_traits<Iterator>::value_type,
16 typename Distance = typename std::iterator_traits<Iterator>::difference_type,
17 typename Pointer = typename std::iterator_traits<Iterator>::pointer,
18 typename Reference =
19 typename std::result_of<const Function(typename std::iterator_traits<Iterator>::reference)>::type
20 >
21 class TransformIterator
22 {
23 public:
24 using iterator_category = Category;
25 using value_type = T;
26 using difference_type = Distance;
27 using pointer = Pointer;
28 using reference = Reference;
29
30
31 TransformIterator() = default;
32 TransformIterator(TransformIterator const& transformIterator) = default;
33 TransformIterator(TransformIterator&& transformIterator) = default;
34
TransformIterator(Iterator & it,Function fn)35 TransformIterator(Iterator& it, Function fn) : m_it(it), m_fn(fn) {}
TransformIterator(Iterator && it,Function fn)36 TransformIterator(Iterator&& it, Function fn) : m_it(it), m_fn(fn) {}
37
38 ~TransformIterator() = default;
39
operator =(TransformIterator const & rhs)40 TransformIterator& operator=(TransformIterator const& rhs)
41 {
42 m_fn = rhs.m_fn;
43 m_it = rhs.m_it;
44 return *this;
45 }
46
operator =(TransformIterator && rhs)47 TransformIterator& operator=(TransformIterator&& rhs)
48 {
49 m_fn = std::move(rhs.m_fn);
50 m_it = std::move(rhs.m_it);
51 return *this;
52 }
53
operator ++()54 TransformIterator operator++() {++m_it; return *this;}
operator --()55 TransformIterator operator--() {--m_it; return *this;}
56
operator ++() const57 TransformIterator operator++() const {++m_it; return *this;}
operator --() const58 TransformIterator operator--() const {--m_it; return *this;}
59
operator ++(int n) const60 TransformIterator operator++(int n) const {m_it += n; return *this;}
operator --(int n) const61 TransformIterator operator--(int n) const {m_it -= n; return *this;}
62
operator [](Distance n) const63 TransformIterator operator[](Distance n) const {m_it[n]; return *this;};
64
operator -(const TransformIterator & other)65 Distance operator-(const TransformIterator& other) {return m_it - other.m_it;}
66
operator -(const Distance n)67 TransformIterator operator-(const Distance n) {return {m_it - n, m_fn};}
operator +(const Distance n)68 TransformIterator operator+(const Distance n) {return {m_it + n, m_fn};}
69
operator >(const TransformIterator & rhs) const70 bool operator>(const TransformIterator& rhs) const {return m_it > rhs.m_it;}
operator <(const TransformIterator & rhs) const71 bool operator<(const TransformIterator& rhs) const {return m_it < rhs.m_it;}
operator >=(const TransformIterator & rhs) const72 bool operator>=(const TransformIterator& rhs) const {return m_it >= rhs.m_it;}
operator <=(const TransformIterator & rhs) const73 bool operator<=(const TransformIterator& rhs) const {return m_it <= rhs.m_it;}
74
operator ==(TransformIterator other) const75 bool operator==(TransformIterator other) const {return (m_it == other.m_it);}
operator !=(TransformIterator other) const76 bool operator!=(TransformIterator other) const {return !(m_it == other.m_it);}
77
operator *() const78 Reference operator*() const {return m_fn(*m_it);}
79
80 private:
81 Iterator m_it;
82 Function m_fn;
83 };
84
85 template<typename Function, typename Iterator>
MakeTransformIterator(Iterator i,Function f)86 constexpr TransformIterator<Function, Iterator> MakeTransformIterator(Iterator i, Function f)
87 {
88 return TransformIterator<Function, Iterator>(i, f);
89 }
90
91 }
92