diff DEPENDENCIES/generic/include/boost/phoenix/scope/this.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/phoenix/scope/this.hpp	Tue Aug 05 11:11:38 2014 +0100
@@ -0,0 +1,191 @@
+/*=============================================================================
+    Copyright (c) 2005-2011 Joel de Guzman
+    Copyright (c) 2011 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_THIS_HPP
+#define BOOST_PHOENIX_SCOPE_THIS_HPP
+
+#include <boost/phoenix/core/limits.hpp>
+#include <boost/phoenix/core/actor.hpp>
+#include <boost/phoenix/core/environment.hpp>
+#include <boost/phoenix/core/expression.hpp>
+#include <boost/phoenix/core/meta_grammar.hpp>
+#include <boost/phoenix/core/terminal.hpp>
+#include <boost/phoenix/scope/lambda.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+
+BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG(
+    (boost)(phoenix)(this_)
+  , (meta_grammar)(meta_grammar)
+  , BOOST_PHOENIX_LIMIT
+)
+
+namespace boost { namespace phoenix {
+    namespace detail
+    {
+      /*  
+        struct infinite_recursion_detected {};
+
+        struct last_non_this_actor
+            : proto::or_<
+                proto::when<
+                    proto::nary_expr<
+                        proto::_
+                      , proto::_
+                      , proto::_
+                    >
+                  , proto::_child_c<1>
+                >
+              , proto::when<
+                    proto::nary_expr<
+                        proto::_
+                      , proto::_
+                      , proto::_
+                      , proto::_
+                    >
+                  , proto::_child_c<2>
+                >
+            >
+        {};
+        */
+    }
+    struct this_eval
+    {
+        BOOST_PROTO_CALLABLE()
+
+        template <typename Sig>
+        struct result;
+
+        template <typename This, typename A0, typename Context>
+        struct result<This(A0, Context)>
+        {
+				typedef
+					typename proto::detail::uncvref<
+						typename result_of::env<
+							Context
+						>::type
+					>::type
+					outer_env_type;
+				
+				typedef
+					typename remove_pointer<
+						typename remove_reference<
+							typename fusion::result_of::at_c<
+							   outer_env_type
+							 , 0
+							>::type
+						>::type
+					>::type
+					actor_type;
+				
+				typedef
+					typename result_of::eval<
+						A0 const &
+					 , Context const &
+					>::type
+					a0_type;
+
+				typedef
+					vector2<actor_type const *, a0_type>
+					inner_env_type;
+
+				typedef 
+					scoped_environment<
+						inner_env_type
+					 , outer_env_type
+					 , vector0<>
+					 , detail::map_local_index_to_tuple<>
+					>
+					env_type;
+				
+				typedef
+					typename result_of::eval<
+						actor_type const &
+					 , typename result_of::context<
+					 		inner_env_type
+						 , typename result_of::actions<
+						 		Context
+							>::type
+						>::type
+					>::type
+					type;
+        };
+
+        template <typename A0, typename Context>
+        typename result<this_eval(A0 const&, Context const &)>::type
+        operator()(A0 const & a0, Context const & ctx) const
+        {
+
+            //std::cout << typeid(checker).name() << "\n";
+            //std::cout << typeid(checker).name() << "\n";
+				typedef
+					typename proto::detail::uncvref<
+						typename result_of::env<
+							Context
+						>::type
+					>::type
+					outer_env_type;
+				
+				typedef
+					typename remove_pointer<
+						typename remove_reference<
+							typename fusion::result_of::at_c<
+							   outer_env_type
+							 , 0
+							>::type
+						>::type
+					>::type
+					actor_type;
+				
+				typedef
+					typename result_of::eval<
+						A0 const &
+					 , Context const &
+					>::type
+					a0_type;
+
+				typedef
+					vector2<actor_type const *, a0_type>
+					inner_env_type;
+
+				typedef 
+					scoped_environment<
+						inner_env_type
+					 , outer_env_type
+					 , vector0<>
+					 , detail::map_local_index_to_tuple<>
+					>
+					env_type;
+
+				inner_env_type inner_env = {fusion::at_c<0>(phoenix::env(ctx)), phoenix::eval(a0, ctx)};
+				vector0<> locals;
+				env_type env(inner_env, phoenix::env(ctx), locals);
+
+				return phoenix::eval(*fusion::at_c<0>(phoenix::env(ctx)), phoenix::context(inner_env, phoenix::actions(ctx)));
+            //return (*fusion::at_c<0>(phoenix::env(ctx)))(eval(a0, ctx));
+        }
+    };
+
+    template <typename Dummy>
+    struct default_actions::when<rule::this_, Dummy>
+        : call<this_eval>
+    {};
+    
+	 template <typename Dummy>
+    struct is_nullary::when<rule::this_, Dummy>
+        : proto::make<mpl::false_()>
+    {};
+    
+	 template <typename A0>
+	 typename expression::this_<A0>::type const
+	 this_(A0 const & a0)
+	 {
+		 return expression::this_<A0>::make(a0);
+	 }
+    
+}}
+
+#endif