Sacado Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
MPLTests.cpp
Go to the documentation of this file.
1// @HEADER
2// ***********************************************************************
3//
4// Sacado Package
5// Copyright (2006) Sandia Corporation
6//
7// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8// the U.S. Government retains certain rights in this software.
9//
10// This library is free software; you can redistribute it and/or modify
11// it under the terms of the GNU Lesser General Public License as
12// published by the Free Software Foundation; either version 2.1 of the
13// License, or (at your option) any later version.
14//
15// This library is distributed in the hope that it will be useful, but
16// WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18// Lesser General Public License for more details.
19//
20// You should have received a copy of the GNU Lesser General Public
21// License along with this library; if not, write to the Free Software
22// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
23// USA
24// Questions? Contact David M. Gay (dmgay@sandia.gov) or Eric T. Phipps
25// (etphipp@sandia.gov).
26//
27// ***********************************************************************
28// @HEADER
29
30// This test requires C++11 (for static_assert), so why not use the
31// standard type traits
32#include <type_traits>
33#include <utility>
34#include "Teuchos_UnitTestHarness.hpp"
35#include "Teuchos_UnitTestRepository.hpp"
36#include "Teuchos_GlobalMPISession.hpp"
37#include "Teuchos_TestingHelpers.hpp"
38
39#include "Sacado_mpl_vector.hpp"
40#include "Sacado_mpl_find.hpp"
41#include "Sacado_mpl_size.hpp"
42
43// These tests are all compile-time tests, so if the test compiles,
44// it passes...
45
46TEUCHOS_UNIT_TEST( MPL, Vector )
47{
48 using std::is_same;
49 using Sacado::mpl::vector;
52 using Sacado::mpl::at;
54
55 // Some types to stick into a vector -- make some of these non-class types
56 struct T1 {};
57 typedef int T2;
58 struct T3 {};
59 struct T4 {};
60 typedef char T5;
61
62 // length-0 vector
63 typedef vector<> vec0;
64 static_assert( size<vec0>::value == 0, "" );
65
66 // length-1 vector -- test push_back, at, size
67 typedef typename push_back<vec0,T1>::type vec1;
68 static_assert( is_same< vec1, vector<T1> >::value, "");
69 static_assert( is_same< at<vec1,0>::type, T1>::value, "");
70 static_assert( size<vec1>::value == 1, "" );
71
72 // length-2 vector -- test push_back, at, size
73 typedef typename push_back<vec1,T2>::type vec2;
74 static_assert( is_same< vec2, vector<T1,T2> >::value, "");
75 static_assert( is_same< at<vec2,0>::type, T1>::value, "");
76 static_assert( is_same< at<vec2,1>::type, T2>::value, "");
77 static_assert( size<vec2>::value == 2, "" );
78
79 // length-3 vector -- test push_back, at, size
80 typedef typename push_back<vec2,T3>::type vec3;
81 static_assert( is_same< vec3, vector<T1,T2,T3> >::value, "");
82 static_assert( is_same< at<vec3,0>::type, T1>::value, "");
83 static_assert( is_same< at<vec3,1>::type, T2>::value, "");
84 static_assert( is_same< at<vec3,2>::type, T3>::value, "");
85 static_assert( size<vec3>::value == 3, "" );
86
87 // length-4 vector -- test push_back, at, size
88 typedef typename push_back<vec3,T4>::type vec4;
89 static_assert( is_same< vec4, vector<T1,T2,T3,T4> >::value, "");
90 static_assert( is_same< at<vec4,0>::type, T1>::value, "");
91 static_assert( is_same< at<vec4,1>::type, T2>::value, "");
92 static_assert( is_same< at<vec4,2>::type, T3>::value, "");
93 static_assert( is_same< at<vec4,3>::type, T4>::value, "");
94 static_assert( size<vec4>::value == 4, "" );
95
96 // length-5 vector -- test push_back, at, size
97 typedef typename push_back<vec4,T5>::type vec5;
98 static_assert( is_same< vec5, vector<T1,T2,T3,T4,T5> >::value, "");
99 static_assert( is_same< at<vec5,0>::type, T1>::value, "");
100 static_assert( is_same< at<vec5,1>::type, T2>::value, "");
101 static_assert( is_same< at<vec5,2>::type, T3>::value, "");
102 static_assert( is_same< at<vec5,3>::type, T4>::value, "");
103 static_assert( is_same< at<vec5,4>::type, T5>::value, "");
104 static_assert( size<vec5>::value == 5, "" );
105
106 // length-6 vector -- test push_back, at, size
107 typedef typename push_back<vec5,T5>::type vec6;
108 static_assert( is_same< vec6, vector<T1,T2,T3,T4,T5,T5> >::value, "");
109 static_assert( is_same< at<vec6,0>::type, T1>::value, "");
110 static_assert( is_same< at<vec6,1>::type, T2>::value, "");
111 static_assert( is_same< at<vec6,2>::type, T3>::value, "");
112 static_assert( is_same< at<vec6,3>::type, T4>::value, "");
113 static_assert( is_same< at<vec6,4>::type, T5>::value, "");
114 static_assert( is_same< at<vec6,5>::type, T5>::value, "");
115 static_assert( size<vec6>::value == 6, "" );
116
117 // length-7 vector -- test push_back, at, size
118 typedef typename push_back<vec6,T4>::type vec7;
119 static_assert( is_same< vec7, vector<T1,T2,T3,T4,T5,T5,T4> >::value, "");
120 static_assert( is_same< at<vec7,0>::type, T1>::value, "");
121 static_assert( is_same< at<vec7,1>::type, T2>::value, "");
122 static_assert( is_same< at<vec7,2>::type, T3>::value, "");
123 static_assert( is_same< at<vec7,3>::type, T4>::value, "");
124 static_assert( is_same< at<vec7,4>::type, T5>::value, "");
125 static_assert( is_same< at<vec7,5>::type, T5>::value, "");
126 static_assert( is_same< at<vec7,6>::type, T4>::value, "");
127 static_assert( size<vec7>::value == 7, "" );
128
129 // length-8 vector -- test push_back, at, size
130 typedef typename push_back<vec7,T3>::type vec8;
131 static_assert( is_same< vec8, vector<T1,T2,T3,T4,T5,T5,T4,T3> >::value, "");
132 static_assert( is_same< vec7, vector<T1,T2,T3,T4,T5,T5,T4> >::value, "");
133 static_assert( is_same< at<vec8,0>::type, T1>::value, "");
134 static_assert( is_same< at<vec8,1>::type, T2>::value, "");
135 static_assert( is_same< at<vec8,2>::type, T3>::value, "");
136 static_assert( is_same< at<vec8,3>::type, T4>::value, "");
137 static_assert( is_same< at<vec8,4>::type, T5>::value, "");
138 static_assert( is_same< at<vec8,5>::type, T5>::value, "");
139 static_assert( is_same< at<vec8,6>::type, T4>::value, "");
140 static_assert( is_same< at<vec8,7>::type, T3>::value, "");
141 static_assert( size<vec8>::value == 8, "" );
142
143 // length-9 vector -- test push_back, at, size
144 typedef typename push_back<vec8,T2>::type vec9;
145 static_assert( is_same< vec9, vector<T1,T2,T3,T4,T5,T5,T4,T3,T2> >::value, "");
146 static_assert( is_same< at<vec9,0>::type, T1>::value, "");
147 static_assert( is_same< at<vec9,1>::type, T2>::value, "");
148 static_assert( is_same< at<vec9,2>::type, T3>::value, "");
149 static_assert( is_same< at<vec9,3>::type, T4>::value, "");
150 static_assert( is_same< at<vec9,4>::type, T5>::value, "");
151 static_assert( is_same< at<vec9,5>::type, T5>::value, "");
152 static_assert( is_same< at<vec9,6>::type, T4>::value, "");
153 static_assert( is_same< at<vec9,7>::type, T3>::value, "");
154 static_assert( is_same< at<vec9,8>::type, T2>::value, "");
155 static_assert( size<vec9>::value == 9, "" );
156
157 // length-10 vector -- test push_back, at, size
158 typedef typename push_back<vec9,T1>::type vec10;
159 static_assert( is_same< vec10, vector<T1,T2,T3,T4,T5,T5,T4,T3,T2,T1> >::value, "");
160 static_assert( is_same< at<vec10,0>::type, T1>::value, "");
161 static_assert( is_same< at<vec10,1>::type, T2>::value, "");
162 static_assert( is_same< at<vec10,2>::type, T3>::value, "");
163 static_assert( is_same< at<vec10,3>::type, T4>::value, "");
164 static_assert( is_same< at<vec10,4>::type, T5>::value, "");
165 static_assert( is_same< at<vec10,5>::type, T5>::value, "");
166 static_assert( is_same< at<vec10,6>::type, T4>::value, "");
167 static_assert( is_same< at<vec10,7>::type, T3>::value, "");
168 static_assert( is_same< at<vec10,8>::type, T2>::value, "");
169 static_assert( is_same< at<vec10,9>::type, T1>::value, "");
170 static_assert( size<vec10>::value == 10, "" );
171
172 // length-11 vector -- test push_back, at, size
173 typedef typename push_back<vec10,T1>::type vec11;
174 static_assert( is_same< vec11, vector<T1,T2,T3,T4,T5,T5,T4,T3,T2,T1,T1> >::value, "");
175 static_assert( is_same< at<vec11,0>::type, T1>::value, "");
176 static_assert( is_same< at<vec11,1>::type, T2>::value, "");
177 static_assert( is_same< at<vec11,2>::type, T3>::value, "");
178 static_assert( is_same< at<vec11,3>::type, T4>::value, "");
179 static_assert( is_same< at<vec11,4>::type, T5>::value, "");
180 static_assert( is_same< at<vec11,5>::type, T5>::value, "");
181 static_assert( is_same< at<vec11,6>::type, T4>::value, "");
182 static_assert( is_same< at<vec11,7>::type, T3>::value, "");
183 static_assert( is_same< at<vec11,8>::type, T2>::value, "");
184 static_assert( is_same< at<vec11,9>::type, T1>::value, "");
185 static_assert( is_same< at<vec11,10>::type, T1>::value, "");
186 static_assert( size<vec11>::value == 11, "" );
187
188 // length-12 vector -- test push_back, at, size
189 typedef typename push_back<vec11,T2>::type vec12;
190 static_assert( is_same< vec12, vector<T1,T2,T3,T4,T5,T5,T4,T3,T2,T1,T1,T2> >::value, "");
191 static_assert( is_same< at<vec12,0>::type, T1>::value, "");
192 static_assert( is_same< at<vec12,1>::type, T2>::value, "");
193 static_assert( is_same< at<vec12,2>::type, T3>::value, "");
194 static_assert( is_same< at<vec12,3>::type, T4>::value, "");
195 static_assert( is_same< at<vec12,4>::type, T5>::value, "");
196 static_assert( is_same< at<vec12,5>::type, T5>::value, "");
197 static_assert( is_same< at<vec12,6>::type, T4>::value, "");
198 static_assert( is_same< at<vec12,7>::type, T3>::value, "");
199 static_assert( is_same< at<vec12,8>::type, T2>::value, "");
200 static_assert( is_same< at<vec12,9>::type, T1>::value, "");
201 static_assert( is_same< at<vec12,10>::type, T1>::value, "");
202 static_assert( is_same< at<vec12,11>::type, T2>::value, "");
203 static_assert( size<vec12>::value == 12, "" );
204
205 // length-13 vector -- test push_back, at, size
206 typedef typename push_back<vec12,T3>::type vec13;
207 static_assert( is_same< vec13, vector<T1,T2,T3,T4,T5,T5,T4,T3,T2,T1,T1,T2,T3> >::value, "");
208 static_assert( is_same< at<vec13,0>::type, T1>::value, "");
209 static_assert( is_same< at<vec13,1>::type, T2>::value, "");
210 static_assert( is_same< at<vec13,2>::type, T3>::value, "");
211 static_assert( is_same< at<vec13,3>::type, T4>::value, "");
212 static_assert( is_same< at<vec13,4>::type, T5>::value, "");
213 static_assert( is_same< at<vec13,5>::type, T5>::value, "");
214 static_assert( is_same< at<vec13,6>::type, T4>::value, "");
215 static_assert( is_same< at<vec13,7>::type, T3>::value, "");
216 static_assert( is_same< at<vec13,8>::type, T2>::value, "");
217 static_assert( is_same< at<vec13,9>::type, T1>::value, "");
218 static_assert( is_same< at<vec13,10>::type, T1>::value, "");
219 static_assert( is_same< at<vec13,11>::type, T2>::value, "");
220 static_assert( is_same< at<vec13,12>::type, T3>::value, "");
221 static_assert( size<vec13>::value == 13, "" );
222
223 // length-14 vector -- test push_back, at, size
224 typedef typename push_back<vec13,T4>::type vec14;
225 static_assert( is_same< vec14, vector<T1,T2,T3,T4,T5,T5,T4,T3,T2,T1,T1,T2,T3,T4> >::value, "");
226 static_assert( is_same< at<vec14,0>::type, T1>::value, "");
227 static_assert( is_same< at<vec14,1>::type, T2>::value, "");
228 static_assert( is_same< at<vec14,2>::type, T3>::value, "");
229 static_assert( is_same< at<vec14,3>::type, T4>::value, "");
230 static_assert( is_same< at<vec14,4>::type, T5>::value, "");
231 static_assert( is_same< at<vec14,5>::type, T5>::value, "");
232 static_assert( is_same< at<vec14,6>::type, T4>::value, "");
233 static_assert( is_same< at<vec14,7>::type, T3>::value, "");
234 static_assert( is_same< at<vec14,8>::type, T2>::value, "");
235 static_assert( is_same< at<vec14,9>::type, T1>::value, "");
236 static_assert( is_same< at<vec14,10>::type, T1>::value, "");
237 static_assert( is_same< at<vec14,11>::type, T2>::value, "");
238 static_assert( is_same< at<vec14,12>::type, T3>::value, "");
239 static_assert( is_same< at<vec14,13>::type, T4>::value, "");
240 static_assert( size<vec14>::value == 14, "" );
241
242 // length-15 vector -- test push_back, at, size
243 typedef typename push_back<vec14,T5>::type vec15;
244 static_assert( is_same< vec15, vector<T1,T2,T3,T4,T5,T5,T4,T3,T2,T1,T1,T2,T3,T4,T5> >::value, "");
245 static_assert( is_same< at<vec15,0>::type, T1>::value, "");
246 static_assert( is_same< at<vec15,1>::type, T2>::value, "");
247 static_assert( is_same< at<vec15,2>::type, T3>::value, "");
248 static_assert( is_same< at<vec15,3>::type, T4>::value, "");
249 static_assert( is_same< at<vec15,4>::type, T5>::value, "");
250 static_assert( is_same< at<vec15,5>::type, T5>::value, "");
251 static_assert( is_same< at<vec15,6>::type, T4>::value, "");
252 static_assert( is_same< at<vec15,7>::type, T3>::value, "");
253 static_assert( is_same< at<vec15,8>::type, T2>::value, "");
254 static_assert( is_same< at<vec15,9>::type, T1>::value, "");
255 static_assert( is_same< at<vec15,10>::type, T1>::value, "");
256 static_assert( is_same< at<vec15,11>::type, T2>::value, "");
257 static_assert( is_same< at<vec15,12>::type, T3>::value, "");
258 static_assert( is_same< at<vec15,13>::type, T4>::value, "");
259 static_assert( is_same< at<vec15,14>::type, T5>::value, "");
260 static_assert( size<vec15>::value == 15, "" );
261
262 // The implementation now uses variatic templates, so there
263 // is no hard limit on the length of mpl::vector. However
264 // sizes up to 15 still seems like a good length to test.
265
266 // Check find
267 static_assert( Sacado::mpl::find<vec5, T1>::value == 0, "" );
268 static_assert( Sacado::mpl::find<vec5, T2>::value == 1, "" );
269 static_assert( Sacado::mpl::find<vec5, T3>::value == 2, "" );
270 static_assert( Sacado::mpl::find<vec5, T4>::value == 3, "" );
271 static_assert( Sacado::mpl::find<vec5, T5>::value == 4, "" );
272 static_assert( Sacado::mpl::find<vec10, T1>::value == 0, "" );
273 static_assert( Sacado::mpl::find<vec10, T2>::value == 1, "" );
274 static_assert( Sacado::mpl::find<vec10, T3>::value == 2, "" );
275 static_assert( Sacado::mpl::find<vec10, T4>::value == 3, "" );
276 static_assert( Sacado::mpl::find<vec10, T5>::value == 4, "" );
277 static_assert( Sacado::mpl::find<vec15, T1>::value == 0, "" );
278 static_assert( Sacado::mpl::find<vec15, T2>::value == 1, "" );
279 static_assert( Sacado::mpl::find<vec15, T3>::value == 2, "" );
280 static_assert( Sacado::mpl::find<vec15, T4>::value == 3, "" );
281 static_assert( Sacado::mpl::find<vec15, T5>::value == 4, "" );
282
283 success = true;
284}
285
286int main( int argc, char* argv[] ) {
287 Teuchos::GlobalMPISession mpiSession(&argc, &argv);
288 return Teuchos::UnitTestRepository::runUnitTestsFromMain(argc, argv);
289}
TEUCHOS_UNIT_TEST(MPL, Vector)
Definition: MPLTests.cpp:46
#define T1(r, f)
Definition: Sacado_rad.hpp:603
#define T2(r, f)
Definition: Sacado_rad.hpp:578
int main()
Definition: ad_example.cpp:191
int value