aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorFinn Williams <Finn.Williams@arm.com>2020-10-22 16:53:35 +0100
committerFinn Williams <Finn.Williams@arm.com>2020-10-28 14:37:30 +0000
commit3e54d03115bc502aa85a346d68f50712ece10620 (patch)
tree40af2c15da48c33a16ddd4f45c01ff12d2577a88 /include
parentaaa54ae75100ddb5520698034f76d341bb036c99 (diff)
downloadarmnn-3e54d03115bc502aa85a346d68f50712ece10620.tar.gz
IVGCVSW-5433 Remove boost::transform_iterator and make_transform_iterator
Signed-off-by: Finn Williams <Finn.Williams@arm.com> Change-Id: I28aace7092cff5743353df1b1de8e7a4691554d3
Diffstat (limited to 'include')
-rw-r--r--include/armnn/utility/TransformIterator.hpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/include/armnn/utility/TransformIterator.hpp b/include/armnn/utility/TransformIterator.hpp
new file mode 100644
index 0000000000..d4f32c5d8a
--- /dev/null
+++ b/include/armnn/utility/TransformIterator.hpp
@@ -0,0 +1,82 @@
+//
+// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+#pragma once
+
+#include <iterator>
+
+namespace armnn
+{
+
+template<typename Function,
+ typename Iterator,
+ typename Category = typename std::iterator_traits<Iterator>::iterator_category,
+ typename T = typename std::iterator_traits<Iterator>::value_type,
+ typename Distance = typename std::iterator_traits<Iterator>::difference_type,
+ typename Pointer = typename std::iterator_traits<Iterator>::pointer,
+ typename Reference =
+ typename std::result_of<const Function(typename std::iterator_traits<Iterator>::reference)>::type
+>
+class TransformIterator : public std::iterator<Category, T, Distance, Pointer, Reference>
+{
+
+public:
+
+ TransformIterator() = default;
+ TransformIterator(TransformIterator const& transformIterator) = default;
+ TransformIterator(TransformIterator&& transformIterator) = default;
+
+ TransformIterator(Iterator& it, Function fn) : m_it(it), m_fn(fn) {}
+ TransformIterator(Iterator&& it, Function fn) : m_it(it), m_fn(fn) {}
+
+ ~TransformIterator() = default;
+
+ TransformIterator operator=(TransformIterator const& transformIterator)
+ {
+ return{ transformIterator.it, transformIterator.fn};
+ }
+
+ TransformIterator operator=(TransformIterator&& transformIterator)
+ {
+ return{ transformIterator.it, transformIterator.fn};
+ }
+
+ TransformIterator operator++() {++m_it; return *this;}
+ TransformIterator operator--() {--m_it; return *this;}
+
+ TransformIterator operator++() const {++m_it; return *this;}
+ TransformIterator operator--() const {--m_it; return *this;}
+
+ TransformIterator operator++(int n) const {m_it += n; return *this;}
+ TransformIterator operator--(int n) const {m_it -= n; return *this;}
+
+ TransformIterator operator[](Distance n) const {m_it[n]; return *this;};
+
+ Distance operator-(const TransformIterator& other) {return m_it - other.m_it;}
+
+ TransformIterator operator-(const Distance n) {return {m_it - n, m_fn};}
+ TransformIterator operator+(const Distance n) {return {m_it + n, m_fn};}
+
+ bool operator>(const TransformIterator& rhs) const {return m_it > rhs.m_it;}
+ bool operator<(const TransformIterator& rhs) const {return m_it < rhs.m_it;}
+ bool operator>=(const TransformIterator& rhs) const {return m_it >= rhs.m_it;}
+ bool operator<=(const TransformIterator& rhs) const {return m_it <= rhs.m_it;}
+
+ bool operator==(TransformIterator other) const {return (m_it == other.m_it);}
+ bool operator!=(TransformIterator other) const {return !(m_it == other.m_it);}
+
+ Reference operator*() const {return m_fn(*m_it);}
+
+private:
+ Iterator m_it;
+ const Function m_fn;
+};
+
+template<typename Function, typename Iterator>
+constexpr TransformIterator<Function, Iterator> MakeTransformIterator(Iterator i, Function f)
+{
+ return TransformIterator<Function, Iterator>(i, f);
+}
+
+} \ No newline at end of file