123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- /*=============================================================================
- Copyright (c) 1999-2003 Jaakko Jarvi
- Copyright (c) 2001-2013 Joel de Guzman
- Copyright (c) 2006 Dan Marsden
- 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/fusion/container/map/map.hpp>
- #include <boost/fusion/container/map/convert.hpp>
- #include <boost/detail/lightweight_test.hpp>
- #include <boost/fusion/sequence/intrinsic.hpp>
- #include <boost/fusion/support/is_sequence.hpp>
- #include <boost/fusion/mpl.hpp>
- #include <boost/mpl/find.hpp>
- #include <boost/mpl/equal.hpp>
- #include <boost/mpl/int.hpp>
- #include <boost/mpl/integral_c.hpp>
- #include <boost/mpl/is_sequence.hpp>
- #include <boost/type_traits/is_same.hpp>
- #include <string>
- struct k1 {};
- struct k2 {};
- struct k3 {};
- struct k4 {};
- template <typename S1, typename S2>
- struct is_same
- {
- };
- namespace fn = boost::fusion;
- struct test_intrinsics1
- {
- // test at, begin, end, next, prior, advance, size, deref, etc.
- typedef fn::map<
- fn::pair<k1, int>, fn::pair<k2, float>,
- fn::pair<k3, bool>, fn::pair<k3, char> >
- sequence;
- typedef boost::mpl::begin<sequence>::type first;
- typedef boost::mpl::next<first>::type second;
- typedef boost::mpl::next<second>::type third;
- typedef boost::mpl::next<third>::type fourth;
- typedef boost::mpl::end<sequence>::type last;
- BOOST_STATIC_ASSERT((boost::is_same<
- boost::mpl::deref<first>::type, fn::pair<k1, int> >::value));
- BOOST_STATIC_ASSERT((boost::is_same<
- boost::mpl::deref<second>::type, fn::pair<k2, float> >::value));
- BOOST_STATIC_ASSERT((boost::is_same<
- boost::mpl::deref<third>::type, fn::pair<k3, bool> >::value));
- BOOST_STATIC_ASSERT((boost::is_same<
- boost::mpl::deref<fourth>::type, fn::pair<k3, char> >::value));
- BOOST_STATIC_ASSERT((boost::is_same<
- boost::mpl::at_c<sequence, 2>::type, fn::pair<k3, bool> >::value));
- BOOST_STATIC_ASSERT((boost::is_same<
- boost::mpl::front<sequence>::type, fn::pair<k1, int> >::value));
- BOOST_STATIC_ASSERT((boost::is_same<
- boost::mpl::deref<
- boost::mpl::advance_c<second, 2>::type>::type, fn::pair<k3, char> >::value));
- BOOST_STATIC_ASSERT((boost::mpl::size<sequence>::value == 4));
- BOOST_STATIC_ASSERT(!(boost::mpl::empty<sequence>::value));
- BOOST_STATIC_ASSERT((boost::mpl::distance<second, fourth>::value == 2));
- typedef boost::mpl::prior<last>::type fourth_;
- typedef boost::mpl::prior<fourth_>::type third_;
- typedef boost::mpl::prior<third_>::type second_;
- typedef boost::mpl::prior<second_>::type first_;
- BOOST_STATIC_ASSERT((boost::is_same<
- boost::mpl::deref<first_>::type, fn::pair<k1, int> >::value));
- BOOST_STATIC_ASSERT((boost::is_same<
- boost::mpl::deref<second_>::type, fn::pair<k2, float> >::value));
- BOOST_STATIC_ASSERT((boost::is_same<
- boost::mpl::deref<third_>::type, fn::pair<k3, bool> >::value));
- BOOST_STATIC_ASSERT((boost::is_same<
- boost::mpl::deref<fourth_>::type, fn::pair<k3, char> >::value));
- BOOST_STATIC_ASSERT((boost::is_same<
- boost::mpl::back<sequence>::type, fn::pair<k3, char> >::value));
- };
- void
- test()
- {
- using namespace boost::fusion;
- { // testing const sequences
- const map<pair<k1, int>, pair<k2, float> > t1(5, 3.3f);
- BOOST_TEST(at_c<0>(t1).second == 5);
- BOOST_TEST(at_c<1>(t1).second == 3.3f);
- }
- { // testing at<N> works with MPL integral constants
- const map<pair<k1, int>, pair<k2, char> > t1(101, 'z');
- BOOST_TEST(boost::fusion::at<boost::mpl::int_<0> >(t1).second == 101);
- BOOST_TEST(boost::fusion::at<boost::mpl::int_<1> >(t1).second == 'z');
- // explicitly try something other than mpl::int_
- BOOST_TEST((boost::fusion::at<boost::mpl::integral_c<long, 0> >(t1).second == 101));
- BOOST_TEST((boost::fusion::at<boost::mpl::integral_c<long, 1> >(t1).second == 'z'));
- }
- { // testing size & empty
- typedef map<pair<k1, int>, pair<k2, float>, pair<k3, double> > t1;
- typedef map<> t2;
- BOOST_STATIC_ASSERT(boost::fusion::result_of::size<t1>::value == 3);
- BOOST_STATIC_ASSERT(boost::fusion::result_of::size<t2>::value == 0);
- BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<t1>::value);
- BOOST_STATIC_ASSERT(boost::fusion::result_of::empty<t2>::value);
- }
- { // testing front & back
- typedef map<pair<k1, int>, pair<k2, float>, pair<k3, std::string> > tup;
- tup t(1, 2.2f, std::string("Kimpo"));
- BOOST_TEST(front(t).second == 1);
- BOOST_TEST(back(t).second == "Kimpo");
- }
- { // testing is_sequence
- typedef map<pair<k1, int>, pair<k2, float>, pair<k3, double> > t1;
- typedef map<> t2;
- typedef map<pair<k1, char> > t3;
- BOOST_STATIC_ASSERT(traits::is_sequence<t1>::value);
- BOOST_STATIC_ASSERT(traits::is_sequence<t2>::value);
- BOOST_STATIC_ASSERT(traits::is_sequence<t3>::value);
- BOOST_STATIC_ASSERT(!traits::is_sequence<int>::value);
- BOOST_STATIC_ASSERT(!traits::is_sequence<char>::value);
- }
- { // testing mpl::is_sequence
- typedef map<pair<k1, int>, pair<k2, float>, pair<k3, double> > t1;
- typedef map<> t2;
- typedef map<pair<k1, char> > t3;
- BOOST_STATIC_ASSERT(boost::mpl::is_sequence<t1>::value);
- BOOST_STATIC_ASSERT(boost::mpl::is_sequence<t2>::value);
- BOOST_STATIC_ASSERT(boost::mpl::is_sequence<t3>::value);
- }
- { // testing mpl compatibility
- // test an algorithm
- typedef map<pair<k1, int>, pair<k2, float>, pair<k3, double> > t1;
- typedef boost::mpl::find<t1, pair<k2, float> >::type iter;
- typedef boost::mpl::deref<iter>::type type;
- BOOST_STATIC_ASSERT((boost::is_same<type, pair<k2, float> >::value));
- }
- }
- int
- main()
- {
- test();
- return boost::report_errors();
- }
|