/*============================================================================== Copyright (c) 2005-2010 Joel de Guzman Copyright (c) 2010 Thomas Heller 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 BOOST_PHOENIX_SCOPE_SCOPED_ENVIRONMENT_HPP #define BOOST_PHOENIX_SCOPE_SCOPED_ENVIRONMENT_HPP #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace phoenix { template struct scoped_environment : fusion::sequence_facade< scoped_environment , fusion::random_access_traversal_tag > { typedef Env env_type; typedef OuterEnv outer_env_type; typedef Locals locals_type; typedef Map map_type; scoped_environment( Env const & env , OuterEnv const &outer_env , Locals const &locals ) : env(env) , outer_env(outer_env) , locals(locals) {} scoped_environment(scoped_environment const & o) : env(o.env) , outer_env(o.outer_env) , locals(o.locals) {}; Env const & env; OuterEnv const & outer_env; Locals const & locals; typedef typename fusion::result_of::pop_front< typename add_const< typename proto::detail::uncvref::type >::type >::type args_type; args_type args() const { return fusion::pop_front(env); } #define BOOST_PHOENIX_ADAPT_SCOPED_ENVIRONMENT(INTRINSIC) \ template \ struct INTRINSIC \ { \ typedef \ typename fusion::result_of::INTRINSIC< \ typename mpl::eval_if_c< \ is_const< \ typename remove_reference< \ typename Seq::env_type \ >::type \ >::value \ , add_const< \ typename proto::detail::uncvref< \ typename Seq::env_type \ >::type \ > \ , proto::detail::uncvref< \ typename Seq::env_type \ > \ >::type \ >::type \ type; \ \ static type call(Seq & seq) \ { \ return fusion::INTRINSIC(seq.env); \ } \ } \ /**/ BOOST_PHOENIX_ADAPT_SCOPED_ENVIRONMENT(begin); BOOST_PHOENIX_ADAPT_SCOPED_ENVIRONMENT(end); BOOST_PHOENIX_ADAPT_SCOPED_ENVIRONMENT(size); #undef BOOST_PHOENIX_ADAPT_SCOPED_ENVIRONMENT template struct value_at { typedef typename fusion::result_of::value_at< typename mpl::eval_if_c< is_const< typename remove_reference< typename Seq::env_type >::type >::value , add_const< typename proto::detail::uncvref< typename Seq::env_type >::type > , proto::detail::uncvref< typename Seq::env_type > >::type , N >::type type; }; template struct at { typedef typename fusion::result_of::at< typename mpl::eval_if_c< is_const< typename remove_reference< typename Seq::env_type >::type >::value , add_const< typename proto::detail::uncvref< typename Seq::env_type >::type > , proto::detail::uncvref< typename Seq::env_type > >::type , N >::type type; static type call(Seq & seq) { return fusion::at(seq.env); } }; }; template struct is_scoped_environment : mpl::false_ {}; template struct is_scoped_environment : is_scoped_environment {}; template struct is_scoped_environment > : mpl::true_ {}; template struct is_scoped_environment const> : mpl::true_ {}; }} #endif