1 //
2 // Copyright © 2020 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 : public std::iterator<Category, T, Distance, Pointer, Reference>
22 {
23
24 public:
25
26 TransformIterator() = default;
27 TransformIterator(TransformIterator const& transformIterator) = default;
28 TransformIterator(TransformIterator&& transformIterator) = default;
29
TransformIterator(Iterator & it,Function fn)30 TransformIterator(Iterator& it, Function fn) : m_it(it), m_fn(fn) {}
TransformIterator(Iterator && it,Function fn)31 TransformIterator(Iterator&& it, Function fn) : m_it(it), m_fn(fn) {}
32
33 ~TransformIterator() = default;
34
operator =(TransformIterator const & transformIterator)35 TransformIterator operator=(TransformIterator const& transformIterator)
36 {
37 return{ transformIterator.it, transformIterator.fn};
38 }
39
operator =(TransformIterator && transformIterator)40 TransformIterator operator=(TransformIterator&& transformIterator)
41 {
42 return{ transformIterator.it, transformIterator.fn};
43 }
44
operator ++()45 TransformIterator operator++() {++m_it; return *this;}
operator --()46 TransformIterator operator--() {--m_it; return *this;}
47
operator ++() const48 TransformIterator operator++() const {++m_it; return *this;}
operator --() const49 TransformIterator operator--() const {--m_it; return *this;}
50
operator ++(int n) const51 TransformIterator operator++(int n) const {m_it += n; return *this;}
operator --(int n) const52 TransformIterator operator--(int n) const {m_it -= n; return *this;}
53
operator [](Distance n) const54 TransformIterator operator[](Distance n) const {m_it[n]; return *this;};
55
operator -(const TransformIterator & other)56 Distance operator-(const TransformIterator& other) {return m_it - other.m_it;}
57
operator -(const Distance n)58 TransformIterator operator-(const Distance n) {return {m_it - n, m_fn};}
operator +(const Distance n)59 TransformIterator operator+(const Distance n) {return {m_it + n, m_fn};}
60
operator >(const TransformIterator & rhs) const61 bool operator>(const TransformIterator& rhs) const {return m_it > rhs.m_it;}
operator <(const TransformIterator & rhs) const62 bool operator<(const TransformIterator& rhs) const {return m_it < rhs.m_it;}
operator >=(const TransformIterator & rhs) const63 bool operator>=(const TransformIterator& rhs) const {return m_it >= rhs.m_it;}
operator <=(const TransformIterator & rhs) const64 bool operator<=(const TransformIterator& rhs) const {return m_it <= rhs.m_it;}
65
operator ==(TransformIterator other) const66 bool operator==(TransformIterator other) const {return (m_it == other.m_it);}
operator !=(TransformIterator other) const67 bool operator!=(TransformIterator other) const {return !(m_it == other.m_it);}
68
operator *() const69 Reference operator*() const {return m_fn(*m_it);}
70
71 private:
72 Iterator m_it;
73 const Function m_fn;
74 };
75
76 template<typename Function, typename Iterator>
MakeTransformIterator(Iterator i,Function f)77 constexpr TransformIterator<Function, Iterator> MakeTransformIterator(Iterator i, Function f)
78 {
79 return TransformIterator<Function, Iterator>(i, f);
80 }
81
82 }