diff options
author | Kevin Smith <git@kismith.co.uk> | 2013-01-12 18:41:34 (GMT) |
---|---|---|
committer | Swift Review <review@swift.im> | 2013-01-13 10:36:26 (GMT) |
commit | f3bc816af1b0d61452de973963e453bf3b3f95a2 (patch) | |
tree | e895f8afa3580e6cff6f5ad2017d45bf147a17c2 /3rdParty/Boost/src/boost/phoenix/scope/scoped_environment.hpp | |
parent | 188fc285c6555eadd3c9d50ab8a94adcade78d89 (diff) | |
download | swift-f3bc816af1b0d61452de973963e453bf3b3f95a2.zip swift-f3bc816af1b0d61452de973963e453bf3b3f95a2.tar.bz2 |
Adding in the spirit Boost stuff
Change-Id: I4f127ce61667243b64081b0aa309028d5077045f
Diffstat (limited to '3rdParty/Boost/src/boost/phoenix/scope/scoped_environment.hpp')
-rw-r--r-- | 3rdParty/Boost/src/boost/phoenix/scope/scoped_environment.hpp | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/phoenix/scope/scoped_environment.hpp b/3rdParty/Boost/src/boost/phoenix/scope/scoped_environment.hpp new file mode 100644 index 0000000..a53b4e5 --- /dev/null +++ b/3rdParty/Boost/src/boost/phoenix/scope/scoped_environment.hpp @@ -0,0 +1,178 @@ +/*============================================================================== + 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 |