Chris@16: /*============================================================================== Chris@16: Copyright (c) 2005-2010 Joel de Guzman Chris@16: Copyright (c) 2010 Thomas Heller Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #ifndef BOOST_PHOENIX_SCOPE_SCOPED_ENVIRONMENT_HPP Chris@16: #define BOOST_PHOENIX_SCOPE_SCOPED_ENVIRONMENT_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace phoenix Chris@16: { Chris@16: template Chris@16: struct scoped_environment Chris@16: : fusion::sequence_facade< Chris@16: scoped_environment Chris@16: , fusion::random_access_traversal_tag Chris@16: > Chris@16: { Chris@16: typedef Env env_type; Chris@16: typedef OuterEnv outer_env_type; Chris@16: typedef Locals locals_type; Chris@16: typedef Map map_type; Chris@16: Chris@16: scoped_environment( Chris@101: Env const & env_ Chris@101: , OuterEnv const &outer_env_ Chris@101: , Locals const &locals_ Chris@16: ) Chris@101: : env(env_) Chris@101: , outer_env(outer_env_) Chris@101: , locals(locals_) Chris@16: {} Chris@16: Chris@101: scoped_environment(scoped_environment const & o) Chris@101: : env(o.env) Chris@16: , outer_env(o.outer_env) Chris@101: , locals(o.locals) Chris@101: {}; Chris@16: Chris@16: Env const & env; Chris@16: OuterEnv const & outer_env; Chris@16: Locals const & locals; Chris@16: Chris@16: typedef typename Chris@16: fusion::result_of::pop_front< Chris@16: typename add_const< Chris@16: typename proto::detail::uncvref::type Chris@16: >::type Chris@16: >::type Chris@16: args_type; Chris@16: Chris@16: args_type args() const Chris@16: { Chris@16: return fusion::pop_front(env); Chris@16: } Chris@16: Chris@16: #define BOOST_PHOENIX_ADAPT_SCOPED_ENVIRONMENT(INTRINSIC) \ Chris@16: template \ Chris@16: struct INTRINSIC \ Chris@16: { \ Chris@16: typedef \ Chris@16: typename fusion::result_of::INTRINSIC< \ Chris@16: typename mpl::eval_if_c< \ Chris@16: is_const< \ Chris@16: typename remove_reference< \ Chris@16: typename Seq::env_type \ Chris@16: >::type \ Chris@16: >::value \ Chris@16: , add_const< \ Chris@16: typename proto::detail::uncvref< \ Chris@16: typename Seq::env_type \ Chris@16: >::type \ Chris@16: > \ Chris@16: , proto::detail::uncvref< \ Chris@16: typename Seq::env_type \ Chris@16: > \ Chris@16: >::type \ Chris@16: >::type \ Chris@16: type; \ Chris@16: \ Chris@16: static type call(Seq & seq) \ Chris@16: { \ Chris@16: return fusion::INTRINSIC(seq.env); \ Chris@16: } \ Chris@16: } \ Chris@16: /**/ Chris@16: BOOST_PHOENIX_ADAPT_SCOPED_ENVIRONMENT(begin); Chris@16: BOOST_PHOENIX_ADAPT_SCOPED_ENVIRONMENT(end); Chris@16: BOOST_PHOENIX_ADAPT_SCOPED_ENVIRONMENT(size); Chris@16: #undef BOOST_PHOENIX_ADAPT_SCOPED_ENVIRONMENT Chris@16: Chris@16: template Chris@16: struct value_at Chris@16: { Chris@16: typedef Chris@16: typename fusion::result_of::value_at< Chris@16: typename mpl::eval_if_c< Chris@16: is_const< Chris@16: typename remove_reference< Chris@16: typename Seq::env_type Chris@16: >::type Chris@16: >::value Chris@16: , add_const< Chris@16: typename proto::detail::uncvref< Chris@16: typename Seq::env_type Chris@16: >::type Chris@16: > Chris@16: , proto::detail::uncvref< Chris@16: typename Seq::env_type Chris@16: > Chris@16: >::type Chris@16: , N Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct at Chris@16: { Chris@16: typedef Chris@16: typename fusion::result_of::at< Chris@16: typename mpl::eval_if_c< Chris@16: is_const< Chris@16: typename remove_reference< Chris@16: typename Seq::env_type Chris@16: >::type Chris@16: >::value Chris@16: , add_const< Chris@16: typename proto::detail::uncvref< Chris@16: typename Seq::env_type Chris@16: >::type Chris@16: > Chris@16: , proto::detail::uncvref< Chris@16: typename Seq::env_type Chris@16: > Chris@16: >::type Chris@16: , N Chris@16: >::type Chris@16: type; Chris@16: Chris@16: static type call(Seq & seq) Chris@16: { Chris@16: return fusion::at(seq.env); Chris@16: } Chris@16: }; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct is_scoped_environment : mpl::false_ {}; Chris@16: Chris@16: template Chris@16: struct is_scoped_environment : is_scoped_environment {}; Chris@16: Chris@16: template Chris@16: struct is_scoped_environment > Chris@16: : mpl::true_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct is_scoped_environment const> Chris@16: : mpl::true_ Chris@16: {}; Chris@16: }} Chris@16: Chris@16: #endif