1 //
2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include <armnn/utility/TransformIterator.hpp>
7
8 #include <boost/test/unit_test.hpp>
9 #include <iostream>
10
11 using namespace armnn;
12
13 BOOST_AUTO_TEST_SUITE(TransformIteratorSuite)
14
15 namespace
16 {
17
square(const int val)18 static int square(const int val)
19 {
20 return val * val;
21 }
22
concat(const std::string val)23 static std::string concat(const std::string val)
24 {
25 return val + "a";
26 }
27
BOOST_AUTO_TEST_CASE(TransformIteratorTest)28 BOOST_AUTO_TEST_CASE(TransformIteratorTest)
29 {
30 struct WrapperTestClass
31 {
32 TransformIterator<decltype(&square), std::vector<int>::const_iterator> begin() const
33 {
34 return { m_Vec.begin(), &square };
35 }
36
37 TransformIterator<decltype(&square), std::vector<int>::const_iterator> end() const
38 {
39 return { m_Vec.end(), &square };
40 }
41
42 const std::vector<int> m_Vec{1, 2, 3, 4, 5};
43 };
44
45 struct WrapperStringClass
46 {
47 TransformIterator<decltype(&concat), std::vector<std::string>::const_iterator> begin() const
48 {
49 return { m_Vec.begin(), &concat };
50 }
51
52 TransformIterator<decltype(&concat), std::vector<std::string>::const_iterator> end() const
53 {
54 return { m_Vec.end(), &concat };
55 }
56
57 const std::vector<std::string> m_Vec{"a", "b", "c"};
58 };
59
60 WrapperStringClass wrapperStringClass;
61 WrapperTestClass wrapperTestClass;
62 int i = 1;
63
64 for(auto val : wrapperStringClass)
65 {
66 BOOST_CHECK(val != "e");
67 i++;
68 }
69
70 i = 1;
71 for(auto val : wrapperTestClass)
72 {
73 BOOST_CHECK(val == square(i));
74 i++;
75 }
76
77 i = 1;
78 // Check original vector is unchanged
79 for(auto val : wrapperTestClass.m_Vec)
80 {
81 BOOST_CHECK(val == i);
82 i++;
83 }
84
85 std::vector<int> originalVec{1, 2, 3, 4, 5};
86
87 auto transformBegin = MakeTransformIterator(originalVec.begin(), &square);
88 auto transformEnd = MakeTransformIterator(originalVec.end(), &square);
89
90 std::vector<int> transformedVec(transformBegin, transformEnd);
91
92 i = 1;
93 for(auto val : transformedVec)
94 {
95 BOOST_CHECK(val == square(i));
96 i++;
97 }
98 }
99
100 }
101
102 BOOST_AUTO_TEST_SUITE_END()
103