| /*============================================================================= |
| Copyright (c) 1999-2003 Jaakko Jarvi |
| Copyright (c) 2001-2006 Joel de Guzman |
| |
| Distributed under the Boost Software License, Version 1.0. (See accompanying |
| file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| ==============================================================================*/ |
| #include <boost/detail/lightweight_test.hpp> |
| #include <boost/fusion/sequence/intrinsic/at.hpp> |
| #include <boost/fusion/container/list/cons.hpp> |
| |
| #if !defined(FUSION_AT) |
| #define FUSION_AT at_c |
| #endif |
| |
| namespace test_detail |
| { |
| // something to prevent warnings for unused variables |
| template<class T> void dummy(const T&) {} |
| |
| // no public default constructor |
| class foo |
| { |
| public: |
| |
| explicit foo(int v) : val(v) {} |
| |
| bool operator==(const foo& other) const |
| { |
| return val == other.val; |
| } |
| |
| private: |
| |
| foo() {} |
| int val; |
| }; |
| |
| // another class without a public default constructor |
| class no_def_constructor |
| { |
| no_def_constructor() {} |
| |
| public: |
| |
| no_def_constructor(std::string) {} |
| }; |
| } |
| |
| inline void |
| test() |
| { |
| using namespace boost::fusion; |
| using namespace test_detail; |
| |
| nil empty; |
| |
| FUSION_SEQUENCE<> empty0; |
| |
| #ifndef TR1_TUPLE_TEST |
| FUSION_SEQUENCE<> empty1(empty); |
| #endif |
| |
| FUSION_SEQUENCE<int> t1; |
| BOOST_TEST(FUSION_AT<0>(t1) == int()); |
| |
| FUSION_SEQUENCE<float> t2(5.5f); |
| BOOST_TEST(FUSION_AT<0>(t2) > 5.4f && FUSION_AT<0>(t2) < 5.6f); |
| |
| FUSION_SEQUENCE<foo> t3(foo(12)); |
| BOOST_TEST(FUSION_AT<0>(t3) == foo(12)); |
| |
| FUSION_SEQUENCE<double> t4(t2); |
| BOOST_TEST(FUSION_AT<0>(t4) > 5.4 && FUSION_AT<0>(t4) < 5.6); |
| |
| FUSION_SEQUENCE<int, float> t5; |
| BOOST_TEST(FUSION_AT<0>(t5) == int()); |
| BOOST_TEST(FUSION_AT<1>(t5) == float()); |
| |
| FUSION_SEQUENCE<int, float> t6(12, 5.5f); |
| BOOST_TEST(FUSION_AT<0>(t6) == 12); |
| BOOST_TEST(FUSION_AT<1>(t6) > 5.4f && FUSION_AT<1>(t6) < 5.6f); |
| |
| FUSION_SEQUENCE<int, float> t7(t6); |
| BOOST_TEST(FUSION_AT<0>(t7) == 12); |
| BOOST_TEST(FUSION_AT<1>(t7) > 5.4f && FUSION_AT<1>(t7) < 5.6f); |
| |
| FUSION_SEQUENCE<long, double> t8(t6); |
| BOOST_TEST(FUSION_AT<0>(t8) == 12); |
| BOOST_TEST(FUSION_AT<1>(t8) > 5.4f && FUSION_AT<1>(t8) < 5.6f); |
| |
| dummy |
| ( |
| FUSION_SEQUENCE<no_def_constructor, no_def_constructor, no_def_constructor>( |
| std::string("Jaba"), // ok, since the default |
| std::string("Daba"), // constructor is not used |
| std::string("Doo") |
| ) |
| ); |
| |
| dummy(FUSION_SEQUENCE<int, double>()); |
| dummy(FUSION_SEQUENCE<int, double>(1,3.14)); |
| |
| #if defined(FUSION_TEST_FAIL) |
| dummy(FUSION_SEQUENCE<double&>()); // should fail, no defaults for references |
| dummy(FUSION_SEQUENCE<const double&>()); // likewise |
| #endif |
| |
| { |
| double dd = 5; |
| dummy(FUSION_SEQUENCE<double&>(dd)); // ok |
| dummy(FUSION_SEQUENCE<const double&>(dd+3.14)); // ok, but dangerous |
| } |
| |
| #if defined(FUSION_TEST_FAIL) |
| dummy(FUSION_SEQUENCE<double&>(dd+3.14)); // should fail, |
| // temporary to non-const reference |
| #endif |
| } |