/*=============================================================================
    Copyright (c) 2001-2007 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)
==============================================================================*/
#ifndef PHOENIX_CORE_ARGUMENT_HPP
#define PHOENIX_CORE_ARGUMENT_HPP

#include <boost/preprocessor/repetition/repeat_from_to.hpp>
#include <boost/preprocessor/inc.hpp>
#include <boost/spirit/home/phoenix/core/actor.hpp>
#include <boost/fusion/include/at.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/mpl/less.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/size.hpp>
#include <boost/type_traits/add_reference.hpp>

#define PHOENIX_DECLARE_ARG(z, n, data)                                         \
    actor<argument<n> > const                                                   \
        BOOST_PP_CAT(arg, BOOST_PP_INC(n)) = argument<n>();                     \
    actor<argument<n> > const                                                   \
        BOOST_PP_CAT(_, BOOST_PP_INC(n)) = argument<n>();

namespace boost { namespace phoenix
{
    namespace detail
    {
        template <typename Arg>
        struct error_argument_not_found {};
        inline void test_invalid_argument(int) {}
    }

    template <int N>
    struct argument
    {
        typedef mpl::true_ no_nullary;

        template <typename Env>
        struct result
        {
            typedef typename
                fusion::result_of::at<typename Env::tie_type, mpl::int_<N> >::type
            type;
        };

        template <typename Env>
        typename result<Env>::type
        eval(Env const& env) const
        {
            typedef typename
                mpl::if_<
                    mpl::less<mpl::int_<N>, mpl::size<typename Env::args_type> >
                  , int
                  , detail::error_argument_not_found<argument<N> >
                >::type
            check_out_of_bounds;

            detail::test_invalid_argument(check_out_of_bounds());
            return fusion::at_c<N>(env.args());
        }
    };

    namespace arg_names
    {
    //  Phoenix style names
        actor<argument<0> > const arg1 = argument<0>();
        actor<argument<1> > const arg2 = argument<1>();
        actor<argument<2> > const arg3 = argument<2>();

    //  BLL style names
        actor<argument<0> > const _1 = argument<0>();
        actor<argument<1> > const _2 = argument<1>();
        actor<argument<2> > const _3 = argument<2>();

    //  Bring in the rest or the Phoenix style arguments (arg4 .. argN+1)
    //  and BLL style arguments (_4 .. _N+1), using PP
        BOOST_PP_REPEAT_FROM_TO(
            3, PHOENIX_ARG_LIMIT, PHOENIX_DECLARE_ARG, _)
    }
}}

#undef PHOENIX_DECLARE_ARG
#endif
