blob: 2151153913686a3888a11cc0f65b5c75d60946dc [file] [log] [blame]
Finn Williams3e54d032020-10-22 16:53:35 +01001//
2// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include <armnn/utility/TransformIterator.hpp>
7
Sadik Armagan1625efc2021-06-10 18:24:34 +01008#include <doctest/doctest.h>
9#include <vector>
Finn Williams3e54d032020-10-22 16:53:35 +010010#include <iostream>
11
12using namespace armnn;
13
Sadik Armagan1625efc2021-06-10 18:24:34 +010014TEST_SUITE("TransformIteratorSuite")
15{
Finn Williams3e54d032020-10-22 16:53:35 +010016namespace
17{
18
19static int square(const int val)
20{
21 return val * val;
22}
23
24static std::string concat(const std::string val)
25{
26 return val + "a";
27}
28
Sadik Armagan1625efc2021-06-10 18:24:34 +010029TEST_CASE("TransformIteratorTest")
Finn Williams3e54d032020-10-22 16:53:35 +010030{
31 struct WrapperTestClass
32 {
33 TransformIterator<decltype(&square), std::vector<int>::const_iterator> begin() const
34 {
35 return { m_Vec.begin(), &square };
36 }
37
38 TransformIterator<decltype(&square), std::vector<int>::const_iterator> end() const
39 {
40 return { m_Vec.end(), &square };
41 }
42
43 const std::vector<int> m_Vec{1, 2, 3, 4, 5};
44 };
45
46 struct WrapperStringClass
47 {
48 TransformIterator<decltype(&concat), std::vector<std::string>::const_iterator> begin() const
49 {
50 return { m_Vec.begin(), &concat };
51 }
52
53 TransformIterator<decltype(&concat), std::vector<std::string>::const_iterator> end() const
54 {
55 return { m_Vec.end(), &concat };
56 }
57
58 const std::vector<std::string> m_Vec{"a", "b", "c"};
59 };
60
61 WrapperStringClass wrapperStringClass;
62 WrapperTestClass wrapperTestClass;
63 int i = 1;
64
65 for(auto val : wrapperStringClass)
66 {
Sadik Armagan1625efc2021-06-10 18:24:34 +010067 CHECK(val != "e");
Finn Williams3e54d032020-10-22 16:53:35 +010068 i++;
69 }
70
71 i = 1;
72 for(auto val : wrapperTestClass)
73 {
Sadik Armagan1625efc2021-06-10 18:24:34 +010074 CHECK(val == square(i));
Finn Williams3e54d032020-10-22 16:53:35 +010075 i++;
76 }
77
78 i = 1;
79 // Check original vector is unchanged
80 for(auto val : wrapperTestClass.m_Vec)
81 {
Sadik Armagan1625efc2021-06-10 18:24:34 +010082 CHECK(val == i);
Finn Williams3e54d032020-10-22 16:53:35 +010083 i++;
84 }
85
86 std::vector<int> originalVec{1, 2, 3, 4, 5};
87
88 auto transformBegin = MakeTransformIterator(originalVec.begin(), &square);
89 auto transformEnd = MakeTransformIterator(originalVec.end(), &square);
90
91 std::vector<int> transformedVec(transformBegin, transformEnd);
92
93 i = 1;
94 for(auto val : transformedVec)
95 {
Sadik Armagan1625efc2021-06-10 18:24:34 +010096 CHECK(val == square(i));
Finn Williams3e54d032020-10-22 16:53:35 +010097 i++;
98 }
99}
100
101}
102
Sadik Armagan1625efc2021-06-10 18:24:34 +0100103}