| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 | /*==============================================================================    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
 |