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
							 |