| 1 | // Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) | 
|---|
| 2 | // | 
|---|
| 3 | // Distributed under the Boost Software License, Version 1.0. (See | 
|---|
| 4 | // accompanying file LICENSE_1_0.txt or copy at | 
|---|
| 5 | // http://www.boost.org/LICENSE_1_0.txt) | 
|---|
| 6 |  | 
|---|
| 7 | // For more information, see http://www.boost.org | 
|---|
| 8 |  | 
|---|
| 9 | //  tuple_test_bench.cpp  -------------------------------- | 
|---|
| 10 |  | 
|---|
| 11 | #define BOOST_INCLUDE_MAIN  // for testing, include rather than link | 
|---|
| 12 | #include <boost/test/test_tools.hpp>    // see "Header Implementation Option" | 
|---|
| 13 |  | 
|---|
| 14 | #include "boost/tuple/tuple.hpp" | 
|---|
| 15 |  | 
|---|
| 16 | #include "boost/tuple/tuple_comparison.hpp" | 
|---|
| 17 |  | 
|---|
| 18 | #include "boost/type_traits/is_const.hpp" | 
|---|
| 19 |  | 
|---|
| 20 | #include "boost/ref.hpp" | 
|---|
| 21 | #include <string> | 
|---|
| 22 | #include <utility> | 
|---|
| 23 |  | 
|---|
| 24 | using namespace std; | 
|---|
| 25 | using namespace boost; | 
|---|
| 26 |  | 
|---|
| 27 | // ---------------------------------------------------------------------------- | 
|---|
| 28 | // helpers  | 
|---|
| 29 | // ---------------------------------------------------------------------------- | 
|---|
| 30 |  | 
|---|
| 31 | class A {};  | 
|---|
| 32 | class B {};  | 
|---|
| 33 | class C {}; | 
|---|
| 34 |  | 
|---|
| 35 | // classes with different kinds of conversions | 
|---|
| 36 | class AA {}; | 
|---|
| 37 | class BB : public AA {};  | 
|---|
| 38 | struct CC { CC() {} CC(const BB&) {} }; | 
|---|
| 39 | struct DD { operator CC() const { return CC(); }; }; | 
|---|
| 40 |  | 
|---|
| 41 | // something to prevent warnings for unused variables | 
|---|
| 42 | template<class T> void dummy(const T&) {} | 
|---|
| 43 |  | 
|---|
| 44 | // no public default constructor | 
|---|
| 45 | class foo { | 
|---|
| 46 | public: | 
|---|
| 47 |   explicit foo(int v) : val(v) {} | 
|---|
| 48 |  | 
|---|
| 49 |   bool operator==(const foo& other) const  { | 
|---|
| 50 |     return val == other.val; | 
|---|
| 51 |   } | 
|---|
| 52 |  | 
|---|
| 53 | private: | 
|---|
| 54 |   foo() {} | 
|---|
| 55 |   int val; | 
|---|
| 56 | }; | 
|---|
| 57 |  | 
|---|
| 58 | // another class without a public default constructor | 
|---|
| 59 | class no_def_constructor { | 
|---|
| 60 |   no_def_constructor() {} | 
|---|
| 61 | public: | 
|---|
| 62 |   no_def_constructor(std::string) {} | 
|---|
| 63 | }; | 
|---|
| 64 |  | 
|---|
| 65 | // A non-copyable class  | 
|---|
| 66 | class no_copy { | 
|---|
| 67 |   no_copy(const no_copy&) {} | 
|---|
| 68 | public: | 
|---|
| 69 |   no_copy() {}; | 
|---|
| 70 | }; | 
|---|
| 71 |  | 
|---|
| 72 |  | 
|---|
| 73 | // ---------------------------------------------------------------------------- | 
|---|
| 74 | // Testing different element types -------------------------------------------- | 
|---|
| 75 | // ---------------------------------------------------------------------------- | 
|---|
| 76 |  | 
|---|
| 77 |  | 
|---|
| 78 | typedef tuple<int> t1; | 
|---|
| 79 |  | 
|---|
| 80 | typedef tuple<double&, const double&, const double, double*, const double*> t2; | 
|---|
| 81 | typedef tuple<A, int(*)(char, int), C> t3; | 
|---|
| 82 | typedef tuple<std::string, std::pair<A, B> > t4; | 
|---|
| 83 | typedef tuple<A*, tuple<const A*, const B&, C>, bool, void*> t5; | 
|---|
| 84 | typedef tuple<volatile int, const volatile char&, int(&)(float) > t6; | 
|---|
| 85 |  | 
|---|
| 86 | # if !defined(__BORLANDC__) || __BORLAND__ > 0x0551 | 
|---|
| 87 | typedef tuple<B(A::*)(C&), A&> t7; | 
|---|
| 88 | #endif | 
|---|
| 89 |  | 
|---|
| 90 | // ----------------------------------------------------------------------- | 
|---|
| 91 | // -tuple construction tests --------------------------------------------- | 
|---|
| 92 | // ----------------------------------------------------------------------- | 
|---|
| 93 |  | 
|---|
| 94 |  | 
|---|
| 95 | no_copy y; | 
|---|
| 96 | tuple<no_copy&> x = tuple<no_copy&>(y); // ok | 
|---|
| 97 |  | 
|---|
| 98 | char cs[10]; | 
|---|
| 99 | tuple<char(&)[10]> v2(cs);  // ok | 
|---|
| 100 |  | 
|---|
| 101 | void | 
|---|
| 102 | construction_test() | 
|---|
| 103 | { | 
|---|
| 104 |  | 
|---|
| 105 |   // Note, the get function can be called without the tuples:: qualifier, | 
|---|
| 106 |   // as it is lifted to namespace boost with a "using tuples::get" but | 
|---|
| 107 |   // MSVC 6.0 just cannot find get without the namespace qualifier | 
|---|
| 108 |  | 
|---|
| 109 |   tuple<int> t1; | 
|---|
| 110 |   BOOST_CHECK(get<0>(t1) == int()); | 
|---|
| 111 |  | 
|---|
| 112 |   tuple<float> t2(5.5f); | 
|---|
| 113 |   BOOST_CHECK(get<0>(t2) > 5.4f && get<0>(t2) < 5.6f); | 
|---|
| 114 |  | 
|---|
| 115 |   tuple<foo> t3(foo(12)); | 
|---|
| 116 |   BOOST_CHECK(get<0>(t3) == foo(12)); | 
|---|
| 117 |  | 
|---|
| 118 |   tuple<double> t4(t2); | 
|---|
| 119 |   BOOST_CHECK(get<0>(t4) > 5.4 && get<0>(t4) < 5.6); | 
|---|
| 120 |  | 
|---|
| 121 |   tuple<int, float> t5; | 
|---|
| 122 |   BOOST_CHECK(get<0>(t5) == int()); | 
|---|
| 123 |   BOOST_CHECK(get<1>(t5) == float()); | 
|---|
| 124 |  | 
|---|
| 125 |   tuple<int, float> t6(12, 5.5f); | 
|---|
| 126 |   BOOST_CHECK(get<0>(t6) == 12); | 
|---|
| 127 |   BOOST_CHECK(get<1>(t6) > 5.4f && get<1>(t6) < 5.6f); | 
|---|
| 128 |  | 
|---|
| 129 |   tuple<int, float> t7(t6); | 
|---|
| 130 |   BOOST_CHECK(get<0>(t7) == 12); | 
|---|
| 131 |   BOOST_CHECK(get<1>(t7) > 5.4f && get<1>(t7) < 5.6f); | 
|---|
| 132 |  | 
|---|
| 133 |   tuple<long, double> t8(t6); | 
|---|
| 134 |   BOOST_CHECK(get<0>(t8) == 12); | 
|---|
| 135 |   BOOST_CHECK(get<1>(t8) > 5.4f && get<1>(t8) < 5.6f); | 
|---|
| 136 |  | 
|---|
| 137 |   dummy( | 
|---|
| 138 |     tuple<no_def_constructor, no_def_constructor, no_def_constructor>( | 
|---|
| 139 |        std::string("Jaba"),   // ok, since the default | 
|---|
| 140 |        std::string("Daba"),   // constructor is not used | 
|---|
| 141 |        std::string("Doo") | 
|---|
| 142 |     ) | 
|---|
| 143 |   ); | 
|---|
| 144 |  | 
|---|
| 145 | // testing default values | 
|---|
| 146 |   dummy(tuple<int, double>()); | 
|---|
| 147 |   dummy(tuple<int, double>(1)); | 
|---|
| 148 |   dummy(tuple<int, double>(1,3.14)); | 
|---|
| 149 |  | 
|---|
| 150 |  | 
|---|
| 151 |   //  dummy(tuple<double&>()); // should fail, not defaults for references | 
|---|
| 152 |   //  dummy(tuple<const double&>()); // likewise | 
|---|
| 153 |  | 
|---|
| 154 |   double dd = 5; | 
|---|
| 155 |   dummy(tuple<double&>(dd)); // ok | 
|---|
| 156 |  | 
|---|
| 157 |   dummy(tuple<const double&>(dd+3.14)); // ok, but dangerous | 
|---|
| 158 |  | 
|---|
| 159 |   //  dummy(tuple<double&>(dd+3.14)); // should fail, | 
|---|
| 160 |   //                                  // temporary to non-const reference | 
|---|
| 161 | } | 
|---|
| 162 |  | 
|---|
| 163 |  | 
|---|
| 164 | // ---------------------------------------------------------------------------- | 
|---|
| 165 | // - testing element access --------------------------------------------------- | 
|---|
| 166 | // ---------------------------------------------------------------------------- | 
|---|
| 167 |  | 
|---|
| 168 | void element_access_test() | 
|---|
| 169 | { | 
|---|
| 170 |   double d = 2.7; | 
|---|
| 171 |   A a; | 
|---|
| 172 |   tuple<int, double&, const A&, int> t(1, d, a, 2); | 
|---|
| 173 |   const tuple<int, double&, const A, int> ct = t; | 
|---|
| 174 |  | 
|---|
| 175 |   int i  = get<0>(t); | 
|---|
| 176 |   int i2 = get<3>(t); | 
|---|
| 177 |  | 
|---|
| 178 |   BOOST_CHECK(i == 1 && i2 == 2); | 
|---|
| 179 |  | 
|---|
| 180 |   int j  = get<0>(ct); | 
|---|
| 181 |   BOOST_CHECK(j == 1); | 
|---|
| 182 |     | 
|---|
| 183 |   get<0>(t) = 5; | 
|---|
| 184 |   BOOST_CHECK(t.head == 5); | 
|---|
| 185 |     | 
|---|
| 186 |   //  get<0>(ct) = 5; // can't assign to const | 
|---|
| 187 |  | 
|---|
| 188 |   double e = get<1>(t); | 
|---|
| 189 |   BOOST_CHECK(e > 2.69 && e < 2.71); | 
|---|
| 190 |       | 
|---|
| 191 |   get<1>(t) = 3.14+i; | 
|---|
| 192 |   BOOST_CHECK(get<1>(t) > 4.13 && get<1>(t) < 4.15); | 
|---|
| 193 |  | 
|---|
| 194 |   //  get<4>(t) = A(); // can't assign to const | 
|---|
| 195 |   //  dummy(get<5>(ct)); // illegal index | 
|---|
| 196 |  | 
|---|
| 197 |   ++get<0>(t); | 
|---|
| 198 |   BOOST_CHECK(get<0>(t) == 6); | 
|---|
| 199 |  | 
|---|
| 200 |   BOOST_STATIC_ASSERT((boost::is_const<boost::tuples::element<0, tuple<int, float> >::type>::value != true)); | 
|---|
| 201 | #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION | 
|---|
| 202 |   BOOST_STATIC_ASSERT((boost::is_const<boost::tuples::element<0, const tuple<int, float> >::type>::value)); | 
|---|
| 203 | #endif  | 
|---|
| 204 |  | 
|---|
| 205 |   BOOST_STATIC_ASSERT((boost::is_const<boost::tuples::element<1, tuple<int, float> >::type>::value != true)); | 
|---|
| 206 | #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION | 
|---|
| 207 |   BOOST_STATIC_ASSERT((boost::is_const<boost::tuples::element<1, const tuple<int, float> >::type>::value)); | 
|---|
| 208 | #endif  | 
|---|
| 209 |  | 
|---|
| 210 |  | 
|---|
| 211 |   dummy(i); dummy(i2); dummy(j); dummy(e); // avoid warns for unused variables | 
|---|
| 212 | } | 
|---|
| 213 |  | 
|---|
| 214 |  | 
|---|
| 215 | // ---------------------------------------------------------------------------- | 
|---|
| 216 | // - copying tuples ----------------------------------------------------------- | 
|---|
| 217 | // ---------------------------------------------------------------------------- | 
|---|
| 218 |  | 
|---|
| 219 |  | 
|---|
| 220 |  | 
|---|
| 221 | void | 
|---|
| 222 | copy_test() | 
|---|
| 223 | { | 
|---|
| 224 |   tuple<int, char> t1(4, 'a'); | 
|---|
| 225 |   tuple<int, char> t2(5, 'b'); | 
|---|
| 226 |   t2 = t1; | 
|---|
| 227 |   BOOST_CHECK(get<0>(t1) == get<0>(t2)); | 
|---|
| 228 |   BOOST_CHECK(get<1>(t1) == get<1>(t2)); | 
|---|
| 229 |  | 
|---|
| 230 |   tuple<long, std::string> t3(2, "a"); | 
|---|
| 231 |   t3 = t1; | 
|---|
| 232 |   BOOST_CHECK((double)get<0>(t1) == get<0>(t3)); | 
|---|
| 233 |   BOOST_CHECK(get<1>(t1) == get<1>(t3)[0]); | 
|---|
| 234 |  | 
|---|
| 235 | // testing copy and assignment with implicit conversions between elements | 
|---|
| 236 | // testing tie | 
|---|
| 237 |  | 
|---|
| 238 |   tuple<char, BB*, BB, DD> t; | 
|---|
| 239 |   tuple<int, AA*, CC, CC> a(t); | 
|---|
| 240 |   a = t; | 
|---|
| 241 |  | 
|---|
| 242 |   int i; char c; double d; | 
|---|
| 243 |   tie(i, c, d) = make_tuple(1, 'a', 5.5); | 
|---|
| 244 |    | 
|---|
| 245 |   BOOST_CHECK(i==1); | 
|---|
| 246 |   BOOST_CHECK(c=='a'); | 
|---|
| 247 |   BOOST_CHECK(d>5.4 && d<5.6); | 
|---|
| 248 | } | 
|---|
| 249 |  | 
|---|
| 250 | void | 
|---|
| 251 | mutate_test() | 
|---|
| 252 | { | 
|---|
| 253 |   tuple<int, float, bool, foo> t1(5, 12.2f, true, foo(4)); | 
|---|
| 254 |   get<0>(t1) = 6; | 
|---|
| 255 |   get<1>(t1) = 2.2f; | 
|---|
| 256 |   get<2>(t1) = false; | 
|---|
| 257 |   get<3>(t1) = foo(5); | 
|---|
| 258 |  | 
|---|
| 259 |   BOOST_CHECK(get<0>(t1) == 6); | 
|---|
| 260 |   BOOST_CHECK(get<1>(t1) > 2.1f && get<1>(t1) < 2.3f); | 
|---|
| 261 |   BOOST_CHECK(get<2>(t1) == false); | 
|---|
| 262 |   BOOST_CHECK(get<3>(t1) == foo(5)); | 
|---|
| 263 | } | 
|---|
| 264 |  | 
|---|
| 265 | // ---------------------------------------------------------------------------- | 
|---|
| 266 | // make_tuple tests ----------------------------------------------------------- | 
|---|
| 267 | // ---------------------------------------------------------------------------- | 
|---|
| 268 |  | 
|---|
| 269 | void | 
|---|
| 270 | make_tuple_test() | 
|---|
| 271 | { | 
|---|
| 272 |   tuple<int, char> t1 = make_tuple(5, 'a'); | 
|---|
| 273 |   BOOST_CHECK(get<0>(t1) == 5); | 
|---|
| 274 |   BOOST_CHECK(get<1>(t1) == 'a'); | 
|---|
| 275 |  | 
|---|
| 276 |   tuple<int, std::string> t2; | 
|---|
| 277 |   t2 = make_tuple((short int)2, std::string("Hi")); | 
|---|
| 278 |   BOOST_CHECK(get<0>(t2) == 2); | 
|---|
| 279 |   BOOST_CHECK(get<1>(t2) == "Hi"); | 
|---|
| 280 |  | 
|---|
| 281 |  | 
|---|
| 282 |     A a = A(); B b; | 
|---|
| 283 |     const A ca = a; | 
|---|
| 284 |     make_tuple(boost::cref(a), b); | 
|---|
| 285 |     make_tuple(boost::ref(a), b); | 
|---|
| 286 |     make_tuple(boost::ref(a), boost::cref(b)); | 
|---|
| 287 |  | 
|---|
| 288 |     make_tuple(boost::ref(ca)); | 
|---|
| 289 |       | 
|---|
| 290 | // the result of make_tuple is assignable: | 
|---|
| 291 |    BOOST_CHECK(make_tuple(2, 4, 6) ==  | 
|---|
| 292 |              (make_tuple(1, 2, 3) = make_tuple(2, 4, 6))); | 
|---|
| 293 |  | 
|---|
| 294 | #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION | 
|---|
| 295 |     make_tuple("Donald", "Daisy"); // should work; | 
|---|
| 296 | #endif  | 
|---|
| 297 |     //    std::make_pair("Doesn't","Work"); // fails | 
|---|
| 298 |  | 
|---|
| 299 | // You can store a reference to a function in a tuple | 
|---|
| 300 |     tuple<void(&)()> adf(make_tuple_test); | 
|---|
| 301 |  | 
|---|
| 302 |     dummy(adf); // avoid warning for unused variable | 
|---|
| 303 |   | 
|---|
| 304 | // But make_tuple doesn't work  | 
|---|
| 305 | // with function references, since it creates a const qualified function type | 
|---|
| 306 |  | 
|---|
| 307 | //   make_tuple(make_tuple_test); | 
|---|
| 308 |    | 
|---|
| 309 | // With function pointers, make_tuple works just fine | 
|---|
| 310 |  | 
|---|
| 311 | #if !defined(__BORLANDC__) || __BORLAND__ > 0x0551 | 
|---|
| 312 |    make_tuple(&make_tuple_test); | 
|---|
| 313 | #endif | 
|---|
| 314 |        | 
|---|
| 315 | // NOTE: | 
|---|
| 316 | // | 
|---|
| 317 | // wrapping it the function reference with ref helps on gcc 2.95.2. | 
|---|
| 318 | // on edg 2.43. it results in a catastrophic error? | 
|---|
| 319 |  | 
|---|
| 320 | // make_tuple(ref(foo3)); | 
|---|
| 321 |  | 
|---|
| 322 | // It seems that edg can't use implicitly the ref's conversion operator, e.g.: | 
|---|
| 323 | // typedef void (&func_t) (void); | 
|---|
| 324 | // func_t fref = static_cast<func_t>(ref(make_tuple_test)); // works fine  | 
|---|
| 325 | // func_t fref = ref(make_tuple_test);                        // error | 
|---|
| 326 |  | 
|---|
| 327 | // This is probably not a very common situation, so currently | 
|---|
| 328 | // I don't know how which compiler is right (JJ) | 
|---|
| 329 | } | 
|---|
| 330 |  | 
|---|
| 331 | void | 
|---|
| 332 | tie_test() | 
|---|
| 333 | { | 
|---|
| 334 |   int a; | 
|---|
| 335 |   char b; | 
|---|
| 336 |   foo c(5); | 
|---|
| 337 |  | 
|---|
| 338 |   tie(a, b, c) = make_tuple(2, 'a', foo(3)); | 
|---|
| 339 |   BOOST_CHECK(a == 2); | 
|---|
| 340 |   BOOST_CHECK(b == 'a'); | 
|---|
| 341 |   BOOST_CHECK(c == foo(3)); | 
|---|
| 342 |  | 
|---|
| 343 |   tie(a, tuples::ignore, c) = make_tuple((short int)5, false, foo(5)); | 
|---|
| 344 |   BOOST_CHECK(a == 5); | 
|---|
| 345 |   BOOST_CHECK(b == 'a'); | 
|---|
| 346 |   BOOST_CHECK(c == foo(5)); | 
|---|
| 347 |  | 
|---|
| 348 | // testing assignment from std::pair | 
|---|
| 349 |    int i, j;  | 
|---|
| 350 |    tie (i, j) = std::make_pair(1, 2); | 
|---|
| 351 |    BOOST_CHECK(i == 1 && j == 2); | 
|---|
| 352 |  | 
|---|
| 353 |    tuple<int, int, float> ta; | 
|---|
| 354 | #ifdef E11 | 
|---|
| 355 |    ta = std::make_pair(1, 2); // should fail, tuple is of length 3, not 2 | 
|---|
| 356 | #endif | 
|---|
| 357 |  | 
|---|
| 358 |    dummy(ta); | 
|---|
| 359 | } | 
|---|
| 360 |  | 
|---|
| 361 |  | 
|---|
| 362 | // ---------------------------------------------------------------------------- | 
|---|
| 363 | // - testing tuple equality   ------------------------------------------------- | 
|---|
| 364 | // ---------------------------------------------------------------------------- | 
|---|
| 365 |  | 
|---|
| 366 | void | 
|---|
| 367 | equality_test() | 
|---|
| 368 | { | 
|---|
| 369 |   tuple<int, char> t1(5, 'a'); | 
|---|
| 370 |   tuple<int, char> t2(5, 'a'); | 
|---|
| 371 |   BOOST_CHECK(t1 == t2); | 
|---|
| 372 |  | 
|---|
| 373 |   tuple<int, char> t3(5, 'b'); | 
|---|
| 374 |   tuple<int, char> t4(2, 'a'); | 
|---|
| 375 |   BOOST_CHECK(t1 != t3); | 
|---|
| 376 |   BOOST_CHECK(t1 != t4); | 
|---|
| 377 |   BOOST_CHECK(!(t1 != t2)); | 
|---|
| 378 | } | 
|---|
| 379 |  | 
|---|
| 380 |  | 
|---|
| 381 | // ---------------------------------------------------------------------------- | 
|---|
| 382 | // - testing tuple comparisons  ----------------------------------------------- | 
|---|
| 383 | // ---------------------------------------------------------------------------- | 
|---|
| 384 |  | 
|---|
| 385 | void | 
|---|
| 386 | ordering_test() | 
|---|
| 387 | { | 
|---|
| 388 |   tuple<int, float> t1(4, 3.3f); | 
|---|
| 389 |   tuple<short, float> t2(5, 3.3f); | 
|---|
| 390 |   tuple<long, double> t3(5, 4.4); | 
|---|
| 391 |   BOOST_CHECK(t1 < t2); | 
|---|
| 392 |   BOOST_CHECK(t1 <= t2); | 
|---|
| 393 |   BOOST_CHECK(t2 > t1); | 
|---|
| 394 |   BOOST_CHECK(t2 >= t1); | 
|---|
| 395 |   BOOST_CHECK(t2 < t3); | 
|---|
| 396 |   BOOST_CHECK(t2 <= t3); | 
|---|
| 397 |   BOOST_CHECK(t3 > t2); | 
|---|
| 398 |   BOOST_CHECK(t3 >= t2); | 
|---|
| 399 |  | 
|---|
| 400 | } | 
|---|
| 401 |  | 
|---|
| 402 |  | 
|---|
| 403 | // ---------------------------------------------------------------------------- | 
|---|
| 404 | // - testing cons lists ------------------------------------------------------- | 
|---|
| 405 | // ---------------------------------------------------------------------------- | 
|---|
| 406 | void cons_test() | 
|---|
| 407 | { | 
|---|
| 408 |   using tuples::cons; | 
|---|
| 409 |   using tuples::null_type; | 
|---|
| 410 |  | 
|---|
| 411 |   cons<volatile float, null_type> a(1, null_type()); | 
|---|
| 412 |   cons<const int, cons<volatile float, null_type> > b(2,a); | 
|---|
| 413 |   int i = 3; | 
|---|
| 414 |   cons<int&, cons<const int, cons<volatile float, null_type> > > c(i, b); | 
|---|
| 415 |   BOOST_CHECK(make_tuple(3,2,1)==c); | 
|---|
| 416 |  | 
|---|
| 417 |   cons<char, cons<int, cons<float, null_type> > > x; | 
|---|
| 418 |   dummy(x); | 
|---|
| 419 | } | 
|---|
| 420 |  | 
|---|
| 421 | // ---------------------------------------------------------------------------- | 
|---|
| 422 | // - testing const tuples ----------------------------------------------------- | 
|---|
| 423 | // ---------------------------------------------------------------------------- | 
|---|
| 424 | void const_tuple_test() | 
|---|
| 425 | { | 
|---|
| 426 |   const tuple<int, float> t1(5, 3.3f); | 
|---|
| 427 |   BOOST_CHECK(get<0>(t1) == 5); | 
|---|
| 428 |   BOOST_CHECK(get<1>(t1) == 3.3f); | 
|---|
| 429 | } | 
|---|
| 430 |  | 
|---|
| 431 | // ---------------------------------------------------------------------------- | 
|---|
| 432 | // - testing length ----------------------------------------------------------- | 
|---|
| 433 | // ---------------------------------------------------------------------------- | 
|---|
| 434 | void tuple_length_test() | 
|---|
| 435 | { | 
|---|
| 436 |   typedef tuple<int, float, double> t1; | 
|---|
| 437 |   using tuples::cons; | 
|---|
| 438 |   typedef cons<int, cons< float, cons <double, tuples::null_type> > > t1_cons; | 
|---|
| 439 |   typedef tuple<> t2; | 
|---|
| 440 |   typedef tuples::null_type t3;   | 
|---|
| 441 |  | 
|---|
| 442 |   BOOST_STATIC_ASSERT(tuples::length<t1>::value == 3); | 
|---|
| 443 |   BOOST_STATIC_ASSERT(tuples::length<t1_cons>::value == 3); | 
|---|
| 444 |   BOOST_STATIC_ASSERT(tuples::length<t2>::value == 0); | 
|---|
| 445 |   BOOST_STATIC_ASSERT(tuples::length<t3>::value == 0); | 
|---|
| 446 |  | 
|---|
| 447 | } | 
|---|
| 448 |  | 
|---|
| 449 |  | 
|---|
| 450 |  | 
|---|
| 451 |  | 
|---|
| 452 | // ---------------------------------------------------------------------------- | 
|---|
| 453 | // - main --------------------------------------------------------------------- | 
|---|
| 454 | // ---------------------------------------------------------------------------- | 
|---|
| 455 |  | 
|---|
| 456 | int test_main(int, char *[]) { | 
|---|
| 457 |  | 
|---|
| 458 |   construction_test(); | 
|---|
| 459 |   element_access_test(); | 
|---|
| 460 |   copy_test(); | 
|---|
| 461 |   mutate_test(); | 
|---|
| 462 |   make_tuple_test(); | 
|---|
| 463 |   tie_test(); | 
|---|
| 464 |   equality_test(); | 
|---|
| 465 |   ordering_test(); | 
|---|
| 466 |   cons_test(); | 
|---|
| 467 |   const_tuple_test(); | 
|---|
| 468 |   tuple_length_test(); | 
|---|
| 469 |   return 0; | 
|---|
| 470 | } | 
|---|
| 471 |  | 
|---|
| 472 |  | 
|---|
| 473 |  | 
|---|
| 474 |  | 
|---|
| 475 |  | 
|---|
| 476 |  | 
|---|
| 477 |  | 
|---|