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
|