/*=============================================================================
    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/container/map.hpp>
#include <boost/fusion/container/set.hpp>
#include <boost/fusion/container/vector/vector.hpp>
#include <boost/fusion/view/joint_view/joint_view.hpp>
#include <boost/fusion/sequence/io/out.hpp>
#include <boost/fusion/sequence/comparison/equal_to.hpp>
#include <boost/fusion/container/generation/make_vector.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp>
#include <boost/fusion/sequence/intrinsic/has_key.hpp>
#include <boost/fusion/sequence/intrinsic/begin.hpp>
#include <boost/fusion/iterator/next.hpp>
#include <boost/fusion/iterator/key_of.hpp>
#include <boost/fusion/iterator/value_of.hpp>
#include <boost/fusion/iterator/deref_data.hpp>
#include <boost/mpl/assert.hpp>
#include <string>

struct X
{
    operator char const*() const
    {
        return "<X-object>";
    }
};

int
main()
{
    using namespace boost::fusion;
    namespace fusion = boost::fusion;

    std::cout << tuple_open('[');
    std::cout << tuple_close(']');
    std::cout << tuple_delimiter(", ");

/// Testing joint_view

    {
        vector<int> t1(3);
        vector<X> t2;
        typedef joint_view<vector<int>, vector<X> > view_type;
        view_type view(t1, t2);

        std::cout << view << std::endl;
        BOOST_TEST((view == make_vector(3, X())));
    }

    {
        vector<int, char> t1(3, 'x');
        vector<X> t2;
        typedef joint_view<vector<int, char>, vector<X> > view_type;
        view_type view(t1, t2);
        std::cout << view << std::endl;
        BOOST_TEST((view == make_vector(3, 'x', X())));

        *begin(view) = 4;
        BOOST_TEST(at_c<0>(t1) == 4);
    }

    {
        vector<int, char> t1(3, 'x');
        vector<X, int> t2;
        typedef joint_view<vector<int, char>, vector<X, int> > view_type;
        view_type view(t1, t2);
        std::cout << view << std::endl;
        BOOST_TEST((view == make_vector(3, 'x', X(), 0)));
    }

    {
        typedef vector<int> t1_type;
        t1_type t1(777);
        typedef vector<int, char, double> t2_type;
        t2_type t2(1, 'x', 3.3);

        {
            typedef joint_view<t1_type, t2_type> view_type;
            view_type view(t1, t2);
            std::cout << view << std::endl;
            BOOST_TEST((view == make_vector(777, 1, 'x', 3.3)));
        }

        {
            typedef joint_view<t2_type, t1_type> view_type;
            view_type view(t2, t1);
            std::cout << view << std::endl;
            BOOST_TEST((view == make_vector(1, 'x', 3.3, 777)));
        }

        {
            typedef joint_view<t2_type, t1_type> jv_type;
            typedef joint_view<jv_type, jv_type> jv2_type;

            jv_type jv(t2, t1);
            jv2_type jv2(jv, jv);

            std::cout << jv << std::endl;
            std::cout << jv2 << std::endl;

            BOOST_TEST(jv2
                == make_vector(1, 'x', 3.3, 777, 1, 'x', 3.3, 777));
        }

        {
            typedef joint_view<t2_type, t1_type> jt_type;
            typedef joint_view<t1_type, t2_type> jv2_type;
            typedef joint_view<jt_type, jv2_type> jv3_type;

            jt_type jt(t2, t1);
            jv2_type jv2(t1, t2);
            jv3_type jv3(jt, jv2);

            std::cout << jt << std::endl;
            std::cout << jv2 << std::endl;
            std::cout << jv3 << std::endl;

            BOOST_TEST(jv3
                == make_vector(1, 'x', 3.3, 777, 777, 1, 'x', 3.3));
        }

        {
            typedef joint_view<vector<>, t1_type> jt_type;
            vector<> empty;
            jt_type jt(empty, t1);
            std::cout << jt << std::endl;
            BOOST_TEST(jt == make_vector(777));
        }

        {
            typedef joint_view<t1_type, vector<> > jt_type;
            vector<> empty;
            jt_type jt(t1, empty);
            std::cout << jt << std::endl;
            BOOST_TEST(jt == make_vector(777));
        }

        {
            typedef joint_view<vector<>, vector<> > jt_type;
            vector<> empty;
            jt_type jt(empty, empty);
            std::cout << jt << std::endl;
            BOOST_TEST(jt == make_vector());
        }
    }

    {
        typedef map<pair<void,int> > map_type;
        map_type m(make_pair<void>(0));

        typedef set<std::string, float> set_type;
        set_type s("foo", 1.3f);

        typedef joint_view<map_type, set_type> joint_view_type;
        joint_view_type j(m,s);

        BOOST_MPL_ASSERT((result_of::has_key<joint_view_type, void>::type));
        BOOST_MPL_ASSERT((result_of::has_key<joint_view_type, std::string>::type));
        BOOST_MPL_ASSERT((result_of::has_key<joint_view_type, float>::type));

        BOOST_MPL_ASSERT((boost::is_same<result_of::key_of<result_of::begin<joint_view_type>::type>::type, void>));
        BOOST_MPL_ASSERT((boost::is_same<result_of::key_of<result_of::next<result_of::begin<joint_view_type>::type>::type>::type, std::string>));
        BOOST_MPL_ASSERT((boost::is_same<
                result_of::key_of<result_of::next<result_of::next<result_of::begin<joint_view_type>::type>::type>::type>::type
              , float>));

        BOOST_MPL_ASSERT((boost::is_same<result_of::value_of_data<result_of::begin<joint_view_type>::type>::type, int>));
        BOOST_MPL_ASSERT((boost::is_same<result_of::value_of_data<result_of::next<result_of::begin<joint_view_type>::type>::type>::type, std::string>));
        BOOST_MPL_ASSERT((boost::is_same<
                result_of::value_of_data<result_of::next<result_of::next<result_of::begin<joint_view_type>::type>::type>::type>::type
              , float>));

        std::cout << deref_data(begin(j)) << std::endl;
        std::cout << deref_data(fusion::next(begin(j))) << std::endl;
        std::cout << deref_data(fusion::next(fusion::next(begin(j)))) << std::endl;
        BOOST_TEST((deref_data(begin(j)) == 0));
        BOOST_TEST((deref_data(fusion::next(begin(j))) == "foo"));
        BOOST_TEST((deref_data(fusion::next(fusion::next(begin(j)))) == 1.3f));
    }

    return boost::report_errors();
}

