• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }