/*============================================================================= Copyright (c) 1999-2003 Jaakko Jarvi Copyright (c) 2001-2011 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 #include #include #if !defined(FUSION_AT) #define FUSION_AT at_c #endif namespace test_detail { // something to prevent warnings for unused variables template 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; (void)empty; FUSION_SEQUENCE<> empty0; (void)empty0; #ifndef NO_CONSTRUCT_FROM_NIL FUSION_SEQUENCE<> empty1(empty); (void)empty1; #endif FUSION_SEQUENCE t1; BOOST_TEST(FUSION_AT<0>(t1) == int()); FUSION_SEQUENCE t2(5.5f); BOOST_TEST(FUSION_AT<0>(t2) > 5.4f && FUSION_AT<0>(t2) < 5.6f); FUSION_SEQUENCE t3(foo(12)); BOOST_TEST(FUSION_AT<0>(t3) == foo(12)); FUSION_SEQUENCE t4(t2); BOOST_TEST(FUSION_AT<0>(t4) > 5.4 && FUSION_AT<0>(t4) < 5.6); FUSION_SEQUENCE t5; BOOST_TEST(FUSION_AT<0>(t5) == int()); BOOST_TEST(FUSION_AT<1>(t5) == float()); FUSION_SEQUENCE 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 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 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( std::string("Jaba"), // ok, since the default std::string("Daba"), // constructor is not used std::string("Doo") ) ); dummy(FUSION_SEQUENCE()); dummy(FUSION_SEQUENCE(1,3.14)); #if defined(FUSION_TEST_FAIL) dummy(FUSION_SEQUENCE()); // should fail, no defaults for references dummy(FUSION_SEQUENCE()); // likewise #endif { double dd = 5; dummy(FUSION_SEQUENCE(dd)); // ok dummy(FUSION_SEQUENCE(dd+3.14)); // ok, but dangerous } #if defined(FUSION_TEST_FAIL) dummy(FUSION_SEQUENCE(dd+3.14)); // should fail, // temporary to non-const reference #endif }