/*=============================================================================
    Copyright (c) 2010 Christopher Schmidt

    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/adapted/adt/adapt_assoc_adt.hpp>
#include <boost/fusion/sequence.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/type_traits/is_same.hpp>
#include <iostream>
#include <string>

namespace fusion=boost::fusion;

template<typename Name, typename Age>
struct employee
{
private:
    Name name;
    Age age;

public:
    template<typename OtherName>
    void
    set_name(OtherName const& n)
    {
        name=n;
    }

    template<typename OtherAge>
    void
    set_age(OtherAge const& a)
    {
        age=a;
    }

    Name& get_name()
    {
        return name;
    }

    Name const& get_name()const
    {
        return name;
    }

    Age& get_age()
    {
        return age;
    }

    Age const& get_age()const
    {
        return age;
    }
};

namespace keys
{
    struct name;
    struct age;
}

BOOST_FUSION_ADAPT_ASSOC_TPL_ADT(
    (Name)(Age),
    (employee) (Name)(Age),
    (Name&, Name const&, obj.get_name(), obj.template set_name<Val>(val), keys::name)
        (Age&, Age const&, obj.get_age(), obj.template set_age<Val>(val), keys::age))

int main()
{
    typedef employee<std::string, int> et;
    typedef et const etc;
    et e;
    etc& ec=e;

    fusion::at_key<keys::name>(e)="marshall mathers";
    fusion::at_key<keys::age>(e)=37;

    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::result_of::value_at_key<et, keys::name>::type,
            std::string
        >));
    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::result_of::value_at_key<et, keys::name>::type,
            fusion::result_of::value_at_c<et, 0>::type
        >));
    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::result_of::value_at_key<et, keys::age>::type,
            int
        >));
    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::result_of::value_at_key<et, keys::age>::type,
            fusion::result_of::value_at_c<et, 1>::type
        >));

    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::result_of::at_key<et, keys::name>::type,
            fusion::extension::adt_attribute_proxy<et, 0, false>
        >));
    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::result_of::at_key<et, keys::age>::type,
            fusion::extension::adt_attribute_proxy<et, 1, false>
        >));
    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::result_of::at_key<et, keys::name>::type,
            fusion::result_of::front<et>::type
        >));
    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::result_of::at_key<et, keys::age>::type,
            fusion::result_of::back<et>::type
        >));

    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::result_of::at_key<etc, keys::name>::type,
            fusion::extension::adt_attribute_proxy<et, 0, true>
        >));
    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::result_of::at_key<etc, keys::age>::type,
            fusion::extension::adt_attribute_proxy<et, 1, true>
        >));
    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::result_of::at_key<etc, keys::name>::type,
            fusion::result_of::front<etc>::type
        >));
    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::result_of::at_key<etc, keys::age>::type,
            fusion::result_of::back<etc>::type
        >));

    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::extension::adt_attribute_proxy<et, 0, false>::type,
            std::string&
        >));
    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::extension::adt_attribute_proxy<et, 0, true>::type,
            std::string const&
        >));
    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::extension::adt_attribute_proxy<et, 1, false>::type,
            int&
        >));
    BOOST_MPL_ASSERT((
        boost::is_same<
            fusion::extension::adt_attribute_proxy<et, 1, true>::type,
            int const&
        >));

    {
        std::string& name=fusion::at_key<keys::name>(e);
        int& age=fusion::at_key<keys::age>(e);
        BOOST_TEST(name=="marshall mathers");
        BOOST_TEST(age==37);
        BOOST_TEST(fusion::at_key<keys::name>(e).get()=="marshall mathers");
        BOOST_TEST(fusion::at_key<keys::age>(e).get()==37);
        BOOST_TEST(fusion::front(e).get()=="marshall mathers");
        BOOST_TEST(fusion::back(e).get()==37);
    }

    {
        std::string const& name=fusion::at_key<keys::name>(ec);
        int const& age=fusion::at_key<keys::age>(ec);
        BOOST_TEST(name=="marshall mathers");
        BOOST_TEST(age==37);
        BOOST_TEST(fusion::at_key<keys::name>(ec).get()=="marshall mathers");
        BOOST_TEST(fusion::at_key<keys::age>(ec).get()==37);
        BOOST_TEST(fusion::front(ec).get()=="marshall mathers");
        BOOST_TEST(fusion::back(ec).get()==37);
    }
}
