| 1 | /* |
| 2 | Copyright (c) 2005-2019 Intel Corporation |
| 3 | |
| 4 | Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | you may not use this file except in compliance with the License. |
| 6 | You may obtain a copy of the License at |
| 7 | |
| 8 | http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | |
| 10 | Unless required by applicable law or agreed to in writing, software |
| 11 | distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | See the License for the specific language governing permissions and |
| 14 | limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | // tbb::flow::tuple (implementation used in tbb::flow) |
| 18 | // if <tuple> is available on the compiler/platform, that version should be the |
| 19 | // one tested. |
| 20 | |
| 21 | #include "harness.h" |
| 22 | // this test should match that in graph.h, so we test whatever tuple is |
| 23 | // being used by the join_node. |
| 24 | #if __TBB_CPP11_TUPLE_PRESENT |
| 25 | #define __TESTING_STD_TUPLE__ 1 |
| 26 | #include <tuple> |
| 27 | using namespace std; |
| 28 | #else |
| 29 | #define __TESTING_STD_TUPLE__ 0 |
| 30 | #include "tbb/compat/tuple" |
| 31 | using namespace tbb::flow; |
| 32 | #endif /*!__TBB_CPP11_TUPLE_PRESENT*/ |
| 33 | #include <string> |
| 34 | #include <iostream> |
| 35 | |
| 36 | class non_trivial { |
| 37 | public: |
| 38 | non_trivial() {} |
| 39 | ~non_trivial() {} |
| 40 | non_trivial(const non_trivial& other) : my_int(other.my_int), my_float(other.my_float) { } |
| 41 | int get_int() const { return my_int; } |
| 42 | float get_float() const { return my_float; } |
| 43 | void set_int(int newval) { my_int = newval; } |
| 44 | void set_float(float newval) { my_float = newval; } |
| 45 | private: |
| 46 | int my_int; |
| 47 | float my_float; |
| 48 | }; |
| 49 | |
| 50 | template<typename T1, typename T2, typename T3, typename U1, typename U2, typename U3> |
| 51 | void RunOneComparisonTest() { |
| 52 | typedef tuple<T1,T2,T3> t_tuple; |
| 53 | typedef tuple<U1,U2,U3> u_tuple; |
| 54 | |
| 55 | ASSERT(t_tuple((T1)1,(T2)1,(T3)1) == u_tuple((U1)1,(U2)1,(U3)1),NULL); |
| 56 | ASSERT(t_tuple((T1)1,(T2)0,(T3)1) < u_tuple((U1)1,(U2)1,(U3)1),NULL); |
| 57 | ASSERT(t_tuple((T1)1,(T2)1,(T3)1) > u_tuple((U1)1,(U2)1,(U3)0),NULL); |
| 58 | ASSERT(t_tuple((T1)1,(T2)0,(T3)1) != u_tuple((U1)1,(U2)1,(U3)1),NULL); |
| 59 | ASSERT(t_tuple((T1)1,(T2)0,(T3)1) <= u_tuple((U1)1,(U2)1,(U3)0),NULL); |
| 60 | ASSERT(t_tuple((T1)1,(T2)0,(T3)0) <= u_tuple((U1)1,(U2)0,(U3)0),NULL); |
| 61 | ASSERT(t_tuple((T1)1,(T2)1,(T3)1) >= u_tuple((U1)1,(U2)0,(U3)1),NULL); |
| 62 | ASSERT(t_tuple((T1)0,(T2)1,(T3)1) >= u_tuple((U1)0,(U2)1,(U3)1),NULL); |
| 63 | |
| 64 | ASSERT(!(t_tuple((T1)2,(T2)1,(T3)1) == u_tuple((U1)1,(U2)1,(U3)1)),NULL); |
| 65 | ASSERT(!(t_tuple((T1)1,(T2)2,(T3)1) == u_tuple((U1)1,(U2)1,(U3)1)),NULL); |
| 66 | ASSERT(!(t_tuple((T1)1,(T2)1,(T3)2) == u_tuple((U1)1,(U2)1,(U3)1)),NULL); |
| 67 | |
| 68 | ASSERT(!(t_tuple((T1)1,(T2)1,(T3)1) < u_tuple((U1)1,(U2)1,(U3)1)),NULL); |
| 69 | ASSERT(!(t_tuple((T1)1,(T2)1,(T3)1) > u_tuple((U1)1,(U2)1,(U3)1)),NULL); |
| 70 | ASSERT(!(t_tuple((T1)1,(T2)1,(T3)1) != u_tuple((U1)1,(U2)1,(U3)1)),NULL); |
| 71 | |
| 72 | ASSERT(t_tuple((T1)1,(T2)1,(T3)1) <= u_tuple((U1)1,(U2)1,(U3)1),NULL); |
| 73 | ASSERT(t_tuple((T1)1,(T2)1,(T3)1) >= u_tuple((U1)1,(U2)1,(U3)1),NULL); |
| 74 | |
| 75 | } |
| 76 | |
| 77 | #include "harness_defs.h" |
| 78 | |
| 79 | void RunTests() { |
| 80 | |
| 81 | #if __TESTING_STD_TUPLE__ |
| 82 | REMARK("Testing platform tuple\n" ); |
| 83 | #else |
| 84 | REMARK("Testing compat/tuple\n" ); |
| 85 | #endif |
| 86 | tuple<int> ituple1(3); |
| 87 | tuple<int> ituple2(5); |
| 88 | tuple<double> ftuple2(4.1); |
| 89 | |
| 90 | ASSERT(!(ituple1 == ituple2), NULL); |
| 91 | ASSERT(ituple1 != ituple2, NULL); |
| 92 | ASSERT(!(ituple1 > ituple2), NULL); |
| 93 | ASSERT(ituple1 < ituple2, NULL); |
| 94 | ASSERT(ituple1 <= ituple2, NULL); |
| 95 | ASSERT(!(ituple1 >= ituple2), NULL); |
| 96 | ASSERT(ituple1 < ftuple2, NULL); |
| 97 | |
| 98 | typedef tuple<int,double,float> tuple_type1; |
| 99 | typedef tuple<int,int,int> int_tuple_type; |
| 100 | typedef tuple<int,non_trivial,int> non_trivial_tuple_type; |
| 101 | typedef tuple<double,std::string,char> stringy_tuple_type; |
| 102 | const tuple_type1 tup1(42,3.14159,2.0f); |
| 103 | int_tuple_type int_tup(4, 5, 6); |
| 104 | non_trivial_tuple_type nti; |
| 105 | stringy_tuple_type stv; |
| 106 | get<1>(stv) = "hello" ; |
| 107 | get<2>(stv) = 'x'; |
| 108 | |
| 109 | ASSERT(get<0>(stv) == 0.0, NULL); |
| 110 | ASSERT(get<1>(stv) == "hello" , NULL); |
| 111 | ASSERT(get<2>(stv) == 'x', NULL); |
| 112 | |
| 113 | ASSERT(tuple_size<tuple_type1>::value == 3, NULL); |
| 114 | ASSERT(get<0>(tup1) == 42, NULL); |
| 115 | ASSERT(get<1>(tup1) == 3.14159, NULL); |
| 116 | ASSERT(get<2>(tup1) == 2.0, NULL); |
| 117 | |
| 118 | get<1>(nti).set_float(1.0); |
| 119 | get<1>(nti).set_int(32); |
| 120 | ASSERT(get<1>(nti).get_int() == 32, NULL); |
| 121 | ASSERT(get<1>(nti).get_float() == 1.0, NULL); |
| 122 | |
| 123 | // converting constructor |
| 124 | tuple<double,double,double> tup2(1,2.0,3.0f); |
| 125 | tuple<double,double,double> tup3(9,4.0,7.0f); |
| 126 | ASSERT(tup2 != tup3, NULL); |
| 127 | |
| 128 | ASSERT(tup2 < tup3, NULL); |
| 129 | |
| 130 | // assignment |
| 131 | tup2 = tup3; |
| 132 | ASSERT(tup2 == tup3, NULL); |
| 133 | |
| 134 | tup2 = int_tup; |
| 135 | ASSERT(get<0>(tup2) == 4, NULL); |
| 136 | ASSERT(get<1>(tup2) == 5, NULL); |
| 137 | ASSERT(get<2>(tup2) == 6, NULL); |
| 138 | |
| 139 | // increment component of tuple |
| 140 | get<0>(tup2) += 1; |
| 141 | ASSERT(get<0>(tup2) == 5, NULL); |
| 142 | |
| 143 | std::pair<int,int> two_pair( 4, 8); |
| 144 | tuple<int,int> two_pair_tuple; |
| 145 | two_pair_tuple = two_pair; |
| 146 | ASSERT(get<0>(two_pair_tuple) == 4, NULL); |
| 147 | ASSERT(get<1>(two_pair_tuple) == 8, NULL); |
| 148 | |
| 149 | //relational ops |
| 150 | ASSERT(int_tuple_type(1,1,0) == int_tuple_type(1,1,0),NULL); |
| 151 | ASSERT(int_tuple_type(1,0,1) < int_tuple_type(1,1,1),NULL); |
| 152 | ASSERT(int_tuple_type(1,0,0) > int_tuple_type(0,1,0),NULL); |
| 153 | ASSERT(int_tuple_type(0,0,0) != int_tuple_type(1,0,1),NULL); |
| 154 | ASSERT(int_tuple_type(0,1,0) <= int_tuple_type(0,1,1),NULL); |
| 155 | ASSERT(int_tuple_type(0,0,1) <= int_tuple_type(0,0,1),NULL); |
| 156 | ASSERT(int_tuple_type(1,1,1) >= int_tuple_type(1,0,0),NULL); |
| 157 | ASSERT(int_tuple_type(0,1,1) >= int_tuple_type(0,1,1),NULL); |
| 158 | |
| 159 | #if !__TBB_TUPLE_COMPARISON_COMPILATION_BROKEN |
| 160 | typedef tuple<int,float,double,char> mixed_tuple_left; |
| 161 | typedef tuple<float,int,char,double> mixed_tuple_right; |
| 162 | |
| 163 | ASSERT(mixed_tuple_left(1,1.f,1,char(1)) == mixed_tuple_right(1.f,1,char(1),1),NULL); |
| 164 | ASSERT(mixed_tuple_left(1,0.f,1,char(1)) < mixed_tuple_right(1.f,1,char(1),1),NULL); |
| 165 | ASSERT(mixed_tuple_left(1,1.f,1,char(1)) > mixed_tuple_right(1.f,1,char(0),1),NULL); |
| 166 | ASSERT(mixed_tuple_left(1,1.f,1,char(0)) != mixed_tuple_right(1.f,1,char(1),1),NULL); |
| 167 | ASSERT(mixed_tuple_left(1,0.f,1,char(1)) <= mixed_tuple_right(1.f,1,char(0),1),NULL); |
| 168 | ASSERT(mixed_tuple_left(1,0.f,0,char(1)) <= mixed_tuple_right(1.f,0,char(0),1),NULL); |
| 169 | ASSERT(mixed_tuple_left(1,1.f,1,char(0)) >= mixed_tuple_right(1.f,0,char(1),1),NULL); |
| 170 | ASSERT(mixed_tuple_left(0,1.f,1,char(0)) >= mixed_tuple_right(0.f,1,char(1),0),NULL); |
| 171 | |
| 172 | ASSERT(!(mixed_tuple_left(2,1.f,1,char(1)) == mixed_tuple_right(1.f,1,char(1),1)),NULL); |
| 173 | ASSERT(!(mixed_tuple_left(1,2.f,1,char(1)) == mixed_tuple_right(1.f,1,char(1),1)),NULL); |
| 174 | ASSERT(!(mixed_tuple_left(1,1.f,2,char(1)) == mixed_tuple_right(1.f,1,char(1),1)),NULL); |
| 175 | ASSERT(!(mixed_tuple_left(1,1.f,1,char(2)) == mixed_tuple_right(1.f,1,char(1),1)),NULL); |
| 176 | |
| 177 | ASSERT(!(mixed_tuple_left(1,1.f,1,char(1)) < mixed_tuple_right(1.f,1,char(1),1)),NULL); |
| 178 | ASSERT(!(mixed_tuple_left(1,1.f,1,char(1)) > mixed_tuple_right(1.f,1,char(1),1)),NULL); |
| 179 | ASSERT(!(mixed_tuple_left(1,1.f,1,char(1)) != mixed_tuple_right(1.f,1,char(1),1)),NULL); |
| 180 | |
| 181 | ASSERT(mixed_tuple_left(1,1.f,1,char(1)) <= mixed_tuple_right(1.f,1,char(1),1),NULL); |
| 182 | ASSERT(mixed_tuple_left(1,1.f,1,char(1)) >= mixed_tuple_right(1.f,1,char(1),1),NULL); |
| 183 | |
| 184 | RunOneComparisonTest<int,float,char,float,char,int>(); |
| 185 | RunOneComparisonTest<double,float,char,float,double,int>(); |
| 186 | RunOneComparisonTest<int,float,char,short,char,short>(); |
| 187 | RunOneComparisonTest<double,float,short,float,char,int>(); |
| 188 | #endif /* __TBB_TUPLE_COMPARISON_COMPILATION_BROKEN */ |
| 189 | |
| 190 | |
| 191 | // the following should result in a syntax error |
| 192 | // typedef tuple<float,float> mixed_short_tuple; |
| 193 | // ASSERT(mixed_tuple_left(1,1.f,1,1) != mixed_short_tuple(1.f,1.f),NULL); |
| 194 | |
| 195 | } |
| 196 | |
| 197 | int TestMain() { |
| 198 | RunTests(); |
| 199 | return Harness::Done; |
| 200 | } |
| 201 | |