179 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*==============================================================================
 | |
|     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 <boost/phoenix/core/limits.hpp>
 | |
| #include <boost/mpl/int.hpp>
 | |
| #include <boost/fusion/sequence/sequence_facade.hpp>
 | |
| #include <boost/fusion/sequence/intrinsic/begin.hpp>
 | |
| #include <boost/fusion/sequence/intrinsic/end.hpp>
 | |
| #include <boost/fusion/sequence/intrinsic/size.hpp>
 | |
| #include <boost/fusion/sequence/intrinsic/value_at.hpp>
 | |
| #include <boost/fusion/sequence/intrinsic/at.hpp>
 | |
| #include <boost/fusion/support/category_of.hpp>
 | |
| #include <boost/fusion/include/pop_front.hpp>
 | |
| #include <boost/utility/result_of.hpp>
 | |
| 
 | |
| namespace boost { namespace phoenix
 | |
| {
 | |
|     template<typename Env, typename OuterEnv, typename Locals, typename Map>
 | |
|     struct scoped_environment
 | |
|         : fusion::sequence_facade<
 | |
|             scoped_environment<Env, OuterEnv, Locals, Map>
 | |
|           , 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<Env>::type
 | |
|                 >::type
 | |
|             >::type
 | |
|             args_type;
 | |
| 
 | |
|         args_type args() const
 | |
|         {
 | |
|             return fusion::pop_front(env);
 | |
|         }
 | |
|     
 | |
|         #define BOOST_PHOENIX_ADAPT_SCOPED_ENVIRONMENT(INTRINSIC)               \
 | |
|         template <typename Seq>                                                 \
 | |
|         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 <typename Seq, typename N>
 | |
|         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 <typename Seq, typename N>
 | |
|         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<N>(seq.env);
 | |
|             }
 | |
|         };
 | |
|     };
 | |
| 
 | |
|     template <typename Env, typename Dummy = void>
 | |
|     struct is_scoped_environment : mpl::false_ {};
 | |
|     
 | |
|     template <typename Env>
 | |
|     struct is_scoped_environment<Env&> : is_scoped_environment<Env> {};
 | |
|     
 | |
|     template <typename Env, typename OuterEnv, typename Locals, typename Map>
 | |
|     struct is_scoped_environment<scoped_environment<Env, OuterEnv, Locals, Map> >
 | |
|         : mpl::true_
 | |
|     {};
 | |
| 
 | |
|     template <typename Env, typename OuterEnv, typename Locals, typename Map>
 | |
|     struct is_scoped_environment<scoped_environment<Env, OuterEnv, Locals, Map> const>
 | |
|         : mpl::true_
 | |
|     {};
 | |
| }}
 | |
| 
 | |
| #endif
 | 
