1// This file is part of Eigen, a lightweight C++ template library 2// for linear algebra. 3// 4// Copyright (C) 2013 Christian Seiler <christian@iwakd.de> 5// 6// This Source Code Form is subject to the terms of the Mozilla 7// Public License v. 2.0. If a copy of the MPL was not distributed 8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9 10#include "main.h" 11 12#include <array> 13#include <Eigen/CXX11/src/util/CXX11Meta.h> 14 15using Eigen::internal::is_same; 16using Eigen::internal::type_list; 17using Eigen::internal::numeric_list; 18using Eigen::internal::gen_numeric_list; 19using Eigen::internal::gen_numeric_list_reversed; 20using Eigen::internal::gen_numeric_list_swapped_pair; 21using Eigen::internal::gen_numeric_list_repeated; 22using Eigen::internal::concat; 23using Eigen::internal::mconcat; 24using Eigen::internal::take; 25using Eigen::internal::skip; 26using Eigen::internal::slice; 27using Eigen::internal::get; 28using Eigen::internal::id_numeric; 29using Eigen::internal::id_type; 30using Eigen::internal::is_same_gf; 31using Eigen::internal::apply_op_from_left; 32using Eigen::internal::apply_op_from_right; 33using Eigen::internal::contained_in_list; 34using Eigen::internal::contained_in_list_gf; 35using Eigen::internal::arg_prod; 36using Eigen::internal::arg_sum; 37using Eigen::internal::sum_op; 38using Eigen::internal::product_op; 39using Eigen::internal::array_reverse; 40using Eigen::internal::array_sum; 41using Eigen::internal::array_prod; 42using Eigen::internal::array_reduce; 43using Eigen::internal::array_zip; 44using Eigen::internal::array_zip_and_reduce; 45using Eigen::internal::array_apply; 46using Eigen::internal::array_apply_and_reduce; 47using Eigen::internal::repeat; 48using Eigen::internal::instantiate_by_c_array; 49 50struct dummy_a {}; 51struct dummy_b {}; 52struct dummy_c {}; 53struct dummy_d {}; 54struct dummy_e {}; 55 56// dummy operation for testing apply 57template<typename A, typename B> struct dummy_op; 58template<> struct dummy_op<dummy_a, dummy_b> { typedef dummy_c type; }; 59template<> struct dummy_op<dummy_b, dummy_a> { typedef dummy_d type; }; 60template<> struct dummy_op<dummy_b, dummy_c> { typedef dummy_a type; }; 61template<> struct dummy_op<dummy_c, dummy_b> { typedef dummy_d type; }; 62template<> struct dummy_op<dummy_c, dummy_a> { typedef dummy_b type; }; 63template<> struct dummy_op<dummy_a, dummy_c> { typedef dummy_d type; }; 64template<> struct dummy_op<dummy_a, dummy_a> { typedef dummy_e type; }; 65template<> struct dummy_op<dummy_b, dummy_b> { typedef dummy_e type; }; 66template<> struct dummy_op<dummy_c, dummy_c> { typedef dummy_e type; }; 67 68template<typename A, typename B> struct dummy_test { constexpr static bool value = false; constexpr static int global_flags = 0; }; 69template<> struct dummy_test<dummy_a, dummy_a> { constexpr static bool value = true; constexpr static int global_flags = 1; }; 70template<> struct dummy_test<dummy_b, dummy_b> { constexpr static bool value = true; constexpr static int global_flags = 2; }; 71template<> struct dummy_test<dummy_c, dummy_c> { constexpr static bool value = true; constexpr static int global_flags = 4; }; 72 73struct times2_op { template<typename A> static A run(A v) { return v * 2; } }; 74 75struct dummy_inst 76{ 77 int c; 78 79 dummy_inst() : c(0) {} 80 explicit dummy_inst(int) : c(1) {} 81 dummy_inst(int, int) : c(2) {} 82 dummy_inst(int, int, int) : c(3) {} 83 dummy_inst(int, int, int, int) : c(4) {} 84 dummy_inst(int, int, int, int, int) : c(5) {} 85}; 86 87static void test_gen_numeric_list() 88{ 89 VERIFY((is_same<typename gen_numeric_list<int, 0>::type, numeric_list<int>>::value)); 90 VERIFY((is_same<typename gen_numeric_list<int, 1>::type, numeric_list<int, 0>>::value)); 91 VERIFY((is_same<typename gen_numeric_list<int, 2>::type, numeric_list<int, 0, 1>>::value)); 92 VERIFY((is_same<typename gen_numeric_list<int, 5>::type, numeric_list<int, 0, 1, 2, 3, 4>>::value)); 93 VERIFY((is_same<typename gen_numeric_list<int, 10>::type, numeric_list<int, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9>>::value)); 94 95 VERIFY((is_same<typename gen_numeric_list<int, 0, 42>::type, numeric_list<int>>::value)); 96 VERIFY((is_same<typename gen_numeric_list<int, 1, 42>::type, numeric_list<int, 42>>::value)); 97 VERIFY((is_same<typename gen_numeric_list<int, 2, 42>::type, numeric_list<int, 42, 43>>::value)); 98 VERIFY((is_same<typename gen_numeric_list<int, 5, 42>::type, numeric_list<int, 42, 43, 44, 45, 46>>::value)); 99 VERIFY((is_same<typename gen_numeric_list<int, 10, 42>::type, numeric_list<int, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51>>::value)); 100 101 VERIFY((is_same<typename gen_numeric_list_reversed<int, 0>::type, numeric_list<int>>::value)); 102 VERIFY((is_same<typename gen_numeric_list_reversed<int, 1>::type, numeric_list<int, 0>>::value)); 103 VERIFY((is_same<typename gen_numeric_list_reversed<int, 2>::type, numeric_list<int, 1, 0>>::value)); 104 VERIFY((is_same<typename gen_numeric_list_reversed<int, 5>::type, numeric_list<int, 4, 3, 2, 1, 0>>::value)); 105 VERIFY((is_same<typename gen_numeric_list_reversed<int, 10>::type, numeric_list<int, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0>>::value)); 106 107 VERIFY((is_same<typename gen_numeric_list_reversed<int, 0, 42>::type, numeric_list<int>>::value)); 108 VERIFY((is_same<typename gen_numeric_list_reversed<int, 1, 42>::type, numeric_list<int, 42>>::value)); 109 VERIFY((is_same<typename gen_numeric_list_reversed<int, 2, 42>::type, numeric_list<int, 43, 42>>::value)); 110 VERIFY((is_same<typename gen_numeric_list_reversed<int, 5, 42>::type, numeric_list<int, 46, 45, 44, 43, 42>>::value)); 111 VERIFY((is_same<typename gen_numeric_list_reversed<int, 10, 42>::type, numeric_list<int, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42>>::value)); 112 113 VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 0, 2, 3>::type, numeric_list<int>>::value)); 114 VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 1, 2, 3>::type, numeric_list<int, 0>>::value)); 115 VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 2, 2, 3>::type, numeric_list<int, 0, 1>>::value)); 116 VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 5, 2, 3>::type, numeric_list<int, 0, 1, 3, 2, 4>>::value)); 117 VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 10, 2, 3>::type, numeric_list<int, 0, 1, 3, 2, 4, 5, 6, 7, 8, 9>>::value)); 118 119 VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 0, 44, 45, 42>::type, numeric_list<int>>::value)); 120 VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 1, 44, 45, 42>::type, numeric_list<int, 42>>::value)); 121 VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 2, 44, 45, 42>::type, numeric_list<int, 42, 43>>::value)); 122 VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 5, 44, 45, 42>::type, numeric_list<int, 42, 43, 45, 44, 46>>::value)); 123 VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 10, 44, 45, 42>::type, numeric_list<int, 42, 43, 45, 44, 46, 47, 48, 49, 50, 51>>::value)); 124 125 VERIFY((is_same<typename gen_numeric_list_repeated<int, 0, 0>::type, numeric_list<int>>::value)); 126 VERIFY((is_same<typename gen_numeric_list_repeated<int, 1, 0>::type, numeric_list<int, 0>>::value)); 127 VERIFY((is_same<typename gen_numeric_list_repeated<int, 2, 0>::type, numeric_list<int, 0, 0>>::value)); 128 VERIFY((is_same<typename gen_numeric_list_repeated<int, 5, 0>::type, numeric_list<int, 0, 0, 0, 0, 0>>::value)); 129 VERIFY((is_same<typename gen_numeric_list_repeated<int, 10, 0>::type, numeric_list<int, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0>>::value)); 130} 131 132static void test_concat() 133{ 134 VERIFY((is_same<typename concat<type_list<dummy_a, dummy_a>, type_list<>>::type, type_list<dummy_a, dummy_a>>::value)); 135 VERIFY((is_same<typename concat<type_list<>, type_list<dummy_a, dummy_a>>::type, type_list<dummy_a, dummy_a>>::value)); 136 VERIFY((is_same<typename concat<type_list<dummy_a, dummy_a>, type_list<dummy_a, dummy_a>>::type, type_list<dummy_a, dummy_a, dummy_a, dummy_a>>::value)); 137 VERIFY((is_same<typename concat<type_list<dummy_a, dummy_a>, type_list<dummy_b, dummy_c>>::type, type_list<dummy_a, dummy_a, dummy_b, dummy_c>>::value)); 138 VERIFY((is_same<typename concat<type_list<dummy_a>, type_list<dummy_b, dummy_c>>::type, type_list<dummy_a, dummy_b, dummy_c>>::value)); 139 140 VERIFY((is_same<typename concat<numeric_list<int, 0, 0>, numeric_list<int>>::type, numeric_list<int, 0, 0>>::value)); 141 VERIFY((is_same<typename concat<numeric_list<int>, numeric_list<int, 0, 0>>::type, numeric_list<int, 0, 0>>::value)); 142 VERIFY((is_same<typename concat<numeric_list<int, 0, 0>, numeric_list<int, 0, 0>>::type, numeric_list<int, 0, 0, 0, 0>>::value)); 143 VERIFY((is_same<typename concat<numeric_list<int, 0, 0>, numeric_list<int, 1, 2>>::type, numeric_list<int, 0, 0, 1, 2>>::value)); 144 VERIFY((is_same<typename concat<numeric_list<int, 0>, numeric_list<int, 1, 2>>::type, numeric_list<int, 0, 1, 2>>::value)); 145 146 VERIFY((is_same<typename mconcat<type_list<dummy_a>>::type, type_list<dummy_a>>::value)); 147 VERIFY((is_same<typename mconcat<type_list<dummy_a>, type_list<dummy_b>>::type, type_list<dummy_a, dummy_b>>::value)); 148 VERIFY((is_same<typename mconcat<type_list<dummy_a>, type_list<dummy_b>, type_list<dummy_c>>::type, type_list<dummy_a, dummy_b, dummy_c>>::value)); 149 VERIFY((is_same<typename mconcat<type_list<dummy_a>, type_list<dummy_b, dummy_c>>::type, type_list<dummy_a, dummy_b, dummy_c>>::value)); 150 VERIFY((is_same<typename mconcat<type_list<dummy_a, dummy_b>, type_list<dummy_c>>::type, type_list<dummy_a, dummy_b, dummy_c>>::value)); 151 152 VERIFY((is_same<typename mconcat<numeric_list<int, 0>>::type, numeric_list<int, 0>>::value)); 153 VERIFY((is_same<typename mconcat<numeric_list<int, 0>, numeric_list<int, 1>>::type, numeric_list<int, 0, 1>>::value)); 154 VERIFY((is_same<typename mconcat<numeric_list<int, 0>, numeric_list<int, 1>, numeric_list<int, 2>>::type, numeric_list<int, 0, 1, 2>>::value)); 155 VERIFY((is_same<typename mconcat<numeric_list<int, 0>, numeric_list<int, 1, 2>>::type, numeric_list<int, 0, 1, 2>>::value)); 156 VERIFY((is_same<typename mconcat<numeric_list<int, 0, 1>, numeric_list<int, 2>>::type, numeric_list<int, 0, 1, 2>>::value)); 157} 158 159static void test_slice() 160{ 161 typedef type_list<dummy_a, dummy_a, dummy_b, dummy_b, dummy_c, dummy_c> tl; 162 typedef numeric_list<int, 0, 1, 2, 3, 4, 5> il; 163 164 VERIFY((is_same<typename take<0, tl>::type, type_list<>>::value)); 165 VERIFY((is_same<typename take<1, tl>::type, type_list<dummy_a>>::value)); 166 VERIFY((is_same<typename take<2, tl>::type, type_list<dummy_a, dummy_a>>::value)); 167 VERIFY((is_same<typename take<3, tl>::type, type_list<dummy_a, dummy_a, dummy_b>>::value)); 168 VERIFY((is_same<typename take<4, tl>::type, type_list<dummy_a, dummy_a, dummy_b, dummy_b>>::value)); 169 VERIFY((is_same<typename take<5, tl>::type, type_list<dummy_a, dummy_a, dummy_b, dummy_b, dummy_c>>::value)); 170 VERIFY((is_same<typename take<6, tl>::type, type_list<dummy_a, dummy_a, dummy_b, dummy_b, dummy_c, dummy_c>>::value)); 171 172 VERIFY((is_same<typename take<0, il>::type, numeric_list<int>>::value)); 173 VERIFY((is_same<typename take<1, il>::type, numeric_list<int, 0>>::value)); 174 VERIFY((is_same<typename take<2, il>::type, numeric_list<int, 0, 1>>::value)); 175 VERIFY((is_same<typename take<3, il>::type, numeric_list<int, 0, 1, 2>>::value)); 176 VERIFY((is_same<typename take<4, il>::type, numeric_list<int, 0, 1, 2, 3>>::value)); 177 VERIFY((is_same<typename take<5, il>::type, numeric_list<int, 0, 1, 2, 3, 4>>::value)); 178 VERIFY((is_same<typename take<6, il>::type, numeric_list<int, 0, 1, 2, 3, 4, 5>>::value)); 179 180 VERIFY((is_same<typename skip<0, tl>::type, type_list<dummy_a, dummy_a, dummy_b, dummy_b, dummy_c, dummy_c>>::value)); 181 VERIFY((is_same<typename skip<1, tl>::type, type_list<dummy_a, dummy_b, dummy_b, dummy_c, dummy_c>>::value)); 182 VERIFY((is_same<typename skip<2, tl>::type, type_list<dummy_b, dummy_b, dummy_c, dummy_c>>::value)); 183 VERIFY((is_same<typename skip<3, tl>::type, type_list<dummy_b, dummy_c, dummy_c>>::value)); 184 VERIFY((is_same<typename skip<4, tl>::type, type_list<dummy_c, dummy_c>>::value)); 185 VERIFY((is_same<typename skip<5, tl>::type, type_list<dummy_c>>::value)); 186 VERIFY((is_same<typename skip<6, tl>::type, type_list<>>::value)); 187 188 VERIFY((is_same<typename skip<0, il>::type, numeric_list<int, 0, 1, 2, 3, 4, 5>>::value)); 189 VERIFY((is_same<typename skip<1, il>::type, numeric_list<int, 1, 2, 3, 4, 5>>::value)); 190 VERIFY((is_same<typename skip<2, il>::type, numeric_list<int, 2, 3, 4, 5>>::value)); 191 VERIFY((is_same<typename skip<3, il>::type, numeric_list<int, 3, 4, 5>>::value)); 192 VERIFY((is_same<typename skip<4, il>::type, numeric_list<int, 4, 5>>::value)); 193 VERIFY((is_same<typename skip<5, il>::type, numeric_list<int, 5>>::value)); 194 VERIFY((is_same<typename skip<6, il>::type, numeric_list<int>>::value)); 195 196 VERIFY((is_same<typename slice<0, 3, tl>::type, typename take<3, tl>::type>::value)); 197 VERIFY((is_same<typename slice<0, 3, il>::type, typename take<3, il>::type>::value)); 198 VERIFY((is_same<typename slice<1, 3, tl>::type, type_list<dummy_a, dummy_b, dummy_b>>::value)); 199 VERIFY((is_same<typename slice<1, 3, il>::type, numeric_list<int, 1, 2, 3>>::value)); 200} 201 202static void test_get() 203{ 204 typedef type_list<dummy_a, dummy_a, dummy_b, dummy_b, dummy_c, dummy_c> tl; 205 typedef numeric_list<int, 4, 8, 15, 16, 23, 42> il; 206 207 VERIFY((is_same<typename get<0, tl>::type, dummy_a>::value)); 208 VERIFY((is_same<typename get<1, tl>::type, dummy_a>::value)); 209 VERIFY((is_same<typename get<2, tl>::type, dummy_b>::value)); 210 VERIFY((is_same<typename get<3, tl>::type, dummy_b>::value)); 211 VERIFY((is_same<typename get<4, tl>::type, dummy_c>::value)); 212 VERIFY((is_same<typename get<5, tl>::type, dummy_c>::value)); 213 214 VERIFY_IS_EQUAL(((int)get<0, il>::value), 4); 215 VERIFY_IS_EQUAL(((int)get<1, il>::value), 8); 216 VERIFY_IS_EQUAL(((int)get<2, il>::value), 15); 217 VERIFY_IS_EQUAL(((int)get<3, il>::value), 16); 218 VERIFY_IS_EQUAL(((int)get<4, il>::value), 23); 219 VERIFY_IS_EQUAL(((int)get<5, il>::value), 42); 220} 221 222static void test_id_helper(dummy_a a, dummy_a b, dummy_a c) 223{ 224 (void)a; 225 (void)b; 226 (void)c; 227} 228 229template<int... ii> 230static void test_id_numeric() 231{ 232 test_id_helper(typename id_numeric<int, ii, dummy_a>::type()...); 233} 234 235template<typename... tt> 236static void test_id_type() 237{ 238 test_id_helper(typename id_type<tt, dummy_a>::type()...); 239} 240 241static void test_id() 242{ 243 // don't call VERIFY here, just assume it works if it compiles 244 // (otherwise it will complain that it can't find the function) 245 test_id_numeric<1, 4, 6>(); 246 test_id_type<dummy_a, dummy_b, dummy_c>(); 247} 248 249static void test_is_same_gf() 250{ 251 VERIFY((!is_same_gf<dummy_a, dummy_b>::value)); 252 VERIFY((!!is_same_gf<dummy_a, dummy_a>::value)); 253 VERIFY_IS_EQUAL((!!is_same_gf<dummy_a, dummy_b>::global_flags), false); 254 VERIFY_IS_EQUAL((!!is_same_gf<dummy_a, dummy_a>::global_flags), false); 255} 256 257static void test_apply_op() 258{ 259 typedef type_list<dummy_a, dummy_b, dummy_c> tl; 260 VERIFY((!!is_same<typename apply_op_from_left<dummy_op, dummy_a, tl>::type, type_list<dummy_e, dummy_c, dummy_d>>::value)); 261 VERIFY((!!is_same<typename apply_op_from_right<dummy_op, dummy_a, tl>::type, type_list<dummy_e, dummy_d, dummy_b>>::value)); 262} 263 264static void test_contained_in_list() 265{ 266 typedef type_list<dummy_a, dummy_b, dummy_c> tl; 267 268 VERIFY((!!contained_in_list<is_same, dummy_a, tl>::value)); 269 VERIFY((!!contained_in_list<is_same, dummy_b, tl>::value)); 270 VERIFY((!!contained_in_list<is_same, dummy_c, tl>::value)); 271 VERIFY((!contained_in_list<is_same, dummy_d, tl>::value)); 272 VERIFY((!contained_in_list<is_same, dummy_e, tl>::value)); 273 274 VERIFY((!!contained_in_list_gf<dummy_test, dummy_a, tl>::value)); 275 VERIFY((!!contained_in_list_gf<dummy_test, dummy_b, tl>::value)); 276 VERIFY((!!contained_in_list_gf<dummy_test, dummy_c, tl>::value)); 277 VERIFY((!contained_in_list_gf<dummy_test, dummy_d, tl>::value)); 278 VERIFY((!contained_in_list_gf<dummy_test, dummy_e, tl>::value)); 279 280 VERIFY_IS_EQUAL(((int)contained_in_list_gf<dummy_test, dummy_a, tl>::global_flags), 1); 281 VERIFY_IS_EQUAL(((int)contained_in_list_gf<dummy_test, dummy_b, tl>::global_flags), 2); 282 VERIFY_IS_EQUAL(((int)contained_in_list_gf<dummy_test, dummy_c, tl>::global_flags), 4); 283 VERIFY_IS_EQUAL(((int)contained_in_list_gf<dummy_test, dummy_d, tl>::global_flags), 0); 284 VERIFY_IS_EQUAL(((int)contained_in_list_gf<dummy_test, dummy_e, tl>::global_flags), 0); 285} 286 287static void test_arg_reductions() 288{ 289 VERIFY_IS_EQUAL(arg_sum(1,2,3,4), 10); 290 VERIFY_IS_EQUAL(arg_prod(1,2,3,4), 24); 291 VERIFY_IS_APPROX(arg_sum(0.5, 2, 5), 7.5); 292 VERIFY_IS_APPROX(arg_prod(0.5, 2, 5), 5.0); 293} 294 295static void test_array_reverse_and_reduce() 296{ 297 array<int, 6> a{{4, 8, 15, 16, 23, 42}}; 298 array<int, 6> b{{42, 23, 16, 15, 8, 4}}; 299 300 // there is no operator<< for std::array, so VERIFY_IS_EQUAL will 301 // not compile 302 VERIFY((array_reverse(a) == b)); 303 VERIFY((array_reverse(b) == a)); 304 VERIFY_IS_EQUAL((array_sum(a)), 108); 305 VERIFY_IS_EQUAL((array_sum(b)), 108); 306 VERIFY_IS_EQUAL((array_prod(a)), 7418880); 307 VERIFY_IS_EQUAL((array_prod(b)), 7418880); 308} 309 310static void test_array_zip_and_apply() 311{ 312 array<int, 6> a{{4, 8, 15, 16, 23, 42}}; 313 array<int, 6> b{{0, 1, 2, 3, 4, 5}}; 314 array<int, 6> c{{4, 9, 17, 19, 27, 47}}; 315 array<int, 6> d{{0, 8, 30, 48, 92, 210}}; 316 array<int, 6> e{{0, 2, 4, 6, 8, 10}}; 317 318 VERIFY((array_zip<sum_op>(a, b) == c)); 319 VERIFY((array_zip<product_op>(a, b) == d)); 320 VERIFY((array_apply<times2_op>(b) == e)); 321 VERIFY_IS_EQUAL((array_apply_and_reduce<sum_op, times2_op>(a)), 216); 322 VERIFY_IS_EQUAL((array_apply_and_reduce<sum_op, times2_op>(b)), 30); 323 VERIFY_IS_EQUAL((array_zip_and_reduce<product_op, sum_op>(a, b)), 14755932); 324 VERIFY_IS_EQUAL((array_zip_and_reduce<sum_op, product_op>(a, b)), 388); 325} 326 327static void test_array_misc() 328{ 329 array<int, 3> a3{{1, 1, 1}}; 330 array<int, 6> a6{{2, 2, 2, 2, 2, 2}}; 331 VERIFY((repeat<3, int>(1) == a3)); 332 VERIFY((repeat<6, int>(2) == a6)); 333 334 int data[5] = { 0, 1, 2, 3, 4 }; 335 VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 0>(data).c), 0); 336 VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 1>(data).c), 1); 337 VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 2>(data).c), 2); 338 VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 3>(data).c), 3); 339 VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 4>(data).c), 4); 340 VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 5>(data).c), 5); 341} 342 343void test_cxx11_meta() 344{ 345 CALL_SUBTEST(test_gen_numeric_list()); 346 CALL_SUBTEST(test_concat()); 347 CALL_SUBTEST(test_slice()); 348 CALL_SUBTEST(test_get()); 349 CALL_SUBTEST(test_id()); 350 CALL_SUBTEST(test_is_same_gf()); 351 CALL_SUBTEST(test_apply_op()); 352 CALL_SUBTEST(test_contained_in_list()); 353 CALL_SUBTEST(test_arg_reductions()); 354 CALL_SUBTEST(test_array_reverse_and_reduce()); 355 CALL_SUBTEST(test_array_zip_and_apply()); 356 CALL_SUBTEST(test_array_misc()); 357} 358