local_variable.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 195 行

HPP
195
字号
/*=============================================================================    Copyright (c) 2001-2007 Joel de Guzman    Copyright (c) 2004 Daniel Wallin    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 PHOENIX_SCOPE_DETAIL_LOCAL_VARIABLE_HPP#define PHOENIX_SCOPE_DETAIL_LOCAL_VARIABLE_HPP#include <boost/mpl/int.hpp>#include <boost/mpl/bool.hpp>#include <boost/mpl/eval_if.hpp>#include <boost/mpl/equal_to.hpp>#include <boost/mpl/identity.hpp>#include <boost/mpl/less.hpp>#include <boost/mpl/size.hpp>#include <boost/fusion/include/at.hpp>#include <boost/fusion/include/value_at.hpp>#include <boost/preprocessor/enum.hpp>#include <boost/preprocessor/repeat.hpp>#include <boost/type_traits/remove_reference.hpp>#include <boost/type_traits/is_reference.hpp>#define PHOENIX_MAP_LOCAL_TEMPLATE_PARAM(z, n, data) \    typename T##n = unused<n>#define PHOENIX_MAP_LOCAL_DISPATCH(z, n, data)  \    typedef char(&result##n)[n+2];              \    static result##n get(T##n*);namespace boost { namespace phoenix{    template <typename Env, typename OuterEnv, typename Locals, typename Map>    struct scoped_environment;    namespace detail    {        template <typename Env>        struct initialize_local        {            template <class F>            struct result;            template <class F, class Actor>            struct result<F(Actor)>            {                typedef typename remove_reference<Actor>::type actor_type;                typedef typename actor_type::template result<Env>::type type;            };            initialize_local(Env const& env)                : env(env) {}            template <typename Actor>            typename result<initialize_local(Actor)>::type            operator()(Actor const& actor) const            {                return actor.eval(env);            }            Env const& env;        };        template <typename T>        struct is_scoped_environment : mpl::false_ {};        template <typename Env, typename OuterEnv, typename Locals, typename Map>        struct is_scoped_environment<scoped_environment<Env, OuterEnv, Locals, Map> >            : mpl::true_ {};        template <int N>        struct unused;        template <BOOST_PP_ENUM(            PHOENIX_LOCAL_LIMIT, PHOENIX_MAP_LOCAL_TEMPLATE_PARAM, _)>        struct map_local_index_to_tuple        {            typedef char(&not_found)[1];            static not_found get(...);            BOOST_PP_REPEAT(PHOENIX_LOCAL_LIMIT, PHOENIX_MAP_LOCAL_DISPATCH, _)        };        template<typename T>        T* generate_pointer();        template <typename Map, typename Tag>        struct get_index        {            BOOST_STATIC_CONSTANT(int,                value = (                    static_cast<int>((sizeof(Map::get(generate_pointer<Tag>()))) / sizeof(char)) - 2                ));            // if value == -1, Tag is not found            typedef mpl::int_<value> type;        };        template <typename Local, typename Env>        struct apply_local;        template <typename Local, typename Env>        struct outer_local        {            typedef typename                apply_local<Local, typename Env::outer_env_type>::type            type;        };        template <typename Locals, typename Index>        struct get_local_or_void        {            typedef typename                mpl::eval_if<                    mpl::less<Index, mpl::size<Locals> >                  , fusion::result_of::at<Locals, Index>                  , mpl::identity<fusion::void_>                >::type            type;        };        template <typename Local, typename Env, typename Index>        struct get_local_from_index        {            typedef typename                mpl::eval_if<                    mpl::equal_to<Index, mpl::int_<-1> >                  , outer_local<Local, Env>                  , get_local_or_void<typename Env::locals_type, Index>                >::type            type;        };        template <typename Local, typename Env>        struct get_local        {            typedef typename                get_index<                    typename Env::map_type, typename Local::key_type>::type            index_type;            typedef typename                get_local_from_index<Local, Env, index_type>::type            type;        };        template <typename Local, typename Env>        struct apply_local        {            // $$$ TODO: static assert that Env is a scoped_environment $$$            typedef typename get_local<Local, Env>::type type;        };        template <typename Key>        struct eval_local        {            template <typename RT, typename Env, typename Index>            static RT            get(Env const& env, Index, mpl::false_)            {                return RT(fusion::at<Index>(env.locals));            }            template <typename RT, typename Env, typename Index>            static RT            get(Env const& env, Index index, mpl::true_)            {                typedef typename                    get_index<typename Env::outer_env_type::map_type, Key>::type                index_type;                return get<RT>(                    env.outer_env                  , index_type()                  , mpl::equal_to<index_type, mpl::int_<-1> >());            }            template <typename RT, typename Env, typename Index>            static RT            get(Env const& env, Index index)            {                return get<RT>(                    env                  , index                  , mpl::equal_to<Index, mpl::int_<-1> >());            }        };    }}}#undef PHOENIX_MAP_LOCAL_TEMPLATE_PARAM#undef PHOENIX_MAP_LOCAL_DISPATCH#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?