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>
27using namespace std;
28#else
29#define __TESTING_STD_TUPLE__ 0
30#include "tbb/compat/tuple"
31using namespace tbb::flow;
32#endif /*!__TBB_CPP11_TUPLE_PRESENT*/
33#include <string>
34#include <iostream>
35
36class non_trivial {
37public:
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; }
45private:
46 int my_int;
47 float my_float;
48};
49
50template<typename T1, typename T2, typename T3, typename U1, typename U2, typename U3>
51void 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
79void 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
197int TestMain() {
198 RunTests();
199 return Harness::Done;
200}
201