/*============================================================================= Copyright (c) 2022 Denis Mikhailov 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct abstract { virtual void foo() = 0; }; int main() { using namespace boost::fusion; std::cout << tuple_open('['); std::cout << tuple_close(']'); std::cout << tuple_delimiter(", "); /// Testing the identity_view { typedef boost::mpl::range_c sequence_type; sequence_type sequence; typedef identity_view xform_type; xform_type xform(sequence); std::cout << xform << std::endl; BOOST_TEST((xform == make_vector(5, 6, 7, 8))); typedef boost::fusion::result_of::begin::type first_type; first_type first_it(boost::fusion::begin(xform)); typedef boost::fusion::result_of::next::type next_type; next_type next_it(boost::fusion::next(first_it)); BOOST_TEST((*next_it == 6)); BOOST_TEST((*boost::fusion::prior(next_it) == 5)); BOOST_TEST((boost::fusion::distance(first_it, next_it) == 1)); BOOST_TEST((*boost::fusion::advance_c<3>(boost::fusion::begin(xform)) == 8)); BOOST_TEST((boost::fusion::at_c<2>(xform) == 7)); BOOST_MPL_ASSERT((boost::is_same::type, boost::mpl::integral_c >)); } { typedef vector sequence_type; sequence_type seq; identity_view ident(seq); copy(make_vector(1, 2, 3, 4, 5), ident); std::cout << seq << std::endl; BOOST_TEST((seq == make_vector(1, 2, 3, 4, 5))); } /// Associative { typedef map< pair , pair , pair > map_type; typedef identity_view transformed_type; BOOST_MPL_ASSERT((traits::is_associative)); BOOST_MPL_ASSERT((traits::is_random_access)); map_type m( make_pair('X') , make_pair("Men") , make_pair(2)); transformed_type t(m); std::cout << at_key(t) << std::endl; std::cout << at_key(t) << std::endl; std::cout << at_key(t) << std::endl; BOOST_TEST(at_key(t) == 'X'); BOOST_TEST(at_key(t) == "Men"); BOOST_TEST(at_key(t) == 2); BOOST_STATIC_ASSERT(( boost::is_same::type, char>::value)); BOOST_STATIC_ASSERT(( boost::is_same::type, std::string>::value)); BOOST_STATIC_ASSERT(( boost::is_same::type, int>::value)); std::cout << t << std::endl; BOOST_STATIC_ASSERT((boost::fusion::result_of::has_key::value)); BOOST_STATIC_ASSERT((boost::fusion::result_of::has_key::value)); BOOST_STATIC_ASSERT((boost::fusion::result_of::has_key::value)); BOOST_STATIC_ASSERT((!boost::fusion::result_of::has_key::value)); std::cout << deref_data(begin(t)) << std::endl; std::cout << deref_data(boost::fusion::next(begin(t))) << std::endl; BOOST_TEST(deref_data(begin(t)) == 'X'); BOOST_TEST(deref_data(boost::fusion::next(begin(t))) == "Men"); BOOST_TEST(deref_data(boost::fusion::next(next(begin(t)))) == 2); BOOST_STATIC_ASSERT((boost::is_same::type>::type, int>::value)); BOOST_STATIC_ASSERT((boost::is_same::type>::type>::type, double>::value)); BOOST_STATIC_ASSERT((boost::is_same::type>::type>::type>::type, abstract>::value)); BOOST_STATIC_ASSERT((boost::is_same::type>::type, char>::value)); BOOST_STATIC_ASSERT((boost::is_same::type>::type>::type, std::string>::value)); BOOST_STATIC_ASSERT((boost::is_same::type>::type>::type>::type, int>::value)); // Test random access interface. pair a = at_c<0>(t); (void) a; pair b = at_c<1>(t); pair c = at_c<2>(t); (void)c; typedef boost::fusion::result_of::begin::type first; typedef boost::fusion::result_of::next::type second; typedef boost::fusion::result_of::next::type third; BOOST_MPL_ASSERT((boost::is_same::type, boost::fusion::pair >)); BOOST_MPL_ASSERT((boost::is_same::type, boost::fusion::pair >)); BOOST_MPL_ASSERT((boost::is_same::type, boost::fusion::pair >)); } { // compile test only // make sure result_of::deref_data returns a reference typedef map > map_type; typedef identity_view transformed_type; typedef boost::fusion::result_of::begin::type i_type; typedef boost::fusion::result_of::deref_data::type r_type; BOOST_STATIC_ASSERT((boost::is_same::value)); } { // compile test only // make sure result_of::deref_data is const correct typedef map > const map_type; typedef identity_view transformed_type; typedef boost::fusion::result_of::begin::type i_type; typedef boost::fusion::result_of::deref_data::type r_type; BOOST_STATIC_ASSERT((boost::is_same::value)); } { // compile test only // make sure result_of::deref_data will not const for non-constant references typedef map > const map_type; typedef identity_view transformed_type; typedef boost::fusion::result_of::begin::type i_type; typedef boost::fusion::result_of::deref_data::type r_type; BOOST_STATIC_ASSERT((boost::is_same::value)); } return boost::report_errors(); }