Sacado Package Browser (Single Doxygen Collection)  Version of the Day
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 
46 TEUCHOS_UNIT_TEST( MPL, Vector )
47 {
48  using std::is_same;
49  using Sacado::mpl::vector;
50  using Sacado::mpl::size;
52  using Sacado::mpl::at;
53  using Sacado::mpl::find;
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 
286 int main( int argc, char* argv[] ) {
287  Teuchos::GlobalMPISession mpiSession(&argc, &argv);
288  return Teuchos::UnitTestRepository::runUnitTestsFromMain(argc, argv);
289 }
int main(int argc, char *argv[])
Definition: MPLTests.cpp:286
TEUCHOS_UNIT_TEST(MPL, Vector)
Definition: MPLTests.cpp:46
#define T2(r, f)
Definition: Sacado_rad.hpp:578
#define T1(r, f)
Definition: Sacado_rad.hpp:603
int value