xref: /aosp_15_r20/external/armnn/include/armnn/utility/TransformIterator.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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