blob: f3d9beea7792896cbe00687f7ab134fc3ce9e847 [file] [log] [blame]
/*=============================================================================
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_BASIC_ENVIRONMENT_HPP
#define PHOENIX_CORE_BASIC_ENVIRONMENT_HPP
#include <boost/spirit/home/phoenix/core/limits.hpp>
#include <boost/mpl/remove.hpp>
#include <boost/mpl/transform.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
#include <boost/type_traits/add_reference.hpp>
#include <boost/fusion/include/as_vector.hpp>
#include <boost/fusion/include/mpl.hpp>
namespace boost { namespace phoenix
{
template <
BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
PHOENIX_ARG_LIMIT, typename T, fusion::void_)>
class basic_environment
{
typedef
mpl::BOOST_PP_CAT(vector, PHOENIX_ARG_LIMIT)<
BOOST_PP_ENUM_PARAMS(PHOENIX_ARG_LIMIT, T)>
args_with_void_type;
public:
// args_type: the list of types in an mpl::sequence
typedef typename
mpl::remove<args_with_void_type, fusion::void_>::type
args_type;
// tie_type: a fusion::tuple of references
typedef typename
fusion::result_of::as_vector<
typename mpl::transform<
args_type, boost::add_reference<mpl::_1>
>::type
>::type
tie_type;
basic_environment()
: args_() {}
template <typename U0>
explicit basic_environment(U0& _0)
: args_(_0) {}
template <typename U0, typename U1>
basic_environment(U0& _0, U1& _1)
: args_(_0, _1) {}
// Bring in the rest of the constructors
#include <boost/spirit/home/phoenix/core/detail/basic_environment.hpp>
tie_type const&
args() const
{
return args_;
}
tie_type&
args()
{
return args_;
}
private:
tie_type args_;
};
}}
#endif