|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r71693 - trunk/libs/phoenix/example
From: thom.heller_at_[hidden]
Date: 2011-05-03 06:02:41
Author: theller
Date: 2011-05-03 06:02:39 EDT (Tue, 03 May 2011)
New Revision: 71693
URL: http://svn.boost.org/trac/boost/changeset/71693
Log:
[phoenix]
- Added identity transform example
- cleaned up parallel for example
Added:
trunk/libs/phoenix/example/identity_transform.cpp (contents, props changed)
Text files modified:
trunk/libs/phoenix/example/parallel_for.cpp | 19 ++++++++-----------
1 files changed, 8 insertions(+), 11 deletions(-)
Added: trunk/libs/phoenix/example/identity_transform.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/phoenix/example/identity_transform.cpp 2011-05-03 06:02:39 EDT (Tue, 03 May 2011)
@@ -0,0 +1,118 @@
+
+#include <boost/phoenix.hpp>
+
+#include <iostream>
+#include <sstream>
+
+namespace proto = boost::proto;
+namespace phoenix = boost::phoenix;
+
+template <typename Rule>
+struct identity_transform;
+
+struct identity_actions
+{
+ template <typename Rule>
+ struct when : phoenix::call<identity_transform<Rule> > {};
+};
+
+template <>
+struct identity_actions::when<phoenix::rule::argument>
+ : proto::call<
+ identity_transform<phoenix::rule::argument>(proto::_value, phoenix::_context)
+ > {};
+
+template <>
+struct identity_actions::when<phoenix::rule::terminal>
+ : proto::call<
+ identity_transform<phoenix::rule::terminal>(proto::_value, phoenix::_context)
+ > {};
+
+template <>
+struct identity_actions::when<phoenix::rule::custom_terminal>
+ : proto::lazy<
+ identity_transform<proto::_value>(proto::_value, phoenix::_context)
+ > {};
+
+template <>
+struct identity_transform<phoenix::rule::terminal>
+{
+ typedef std::string result_type;
+
+ template <typename Terminal, typename Context>
+ std::string operator()(Terminal const & terminal, Context) const
+ {
+ std::stringstream ss;
+ ss << "val(" << terminal << ")";
+ return ss.str();
+ }
+
+ template <typename Context>
+ std::string operator()(char const * terminal, Context) const
+ {
+ std::stringstream ss;
+ ss << "val(\"" << terminal << "\")";
+ return ss.str();
+ }
+};
+
+template <typename T>
+struct identity_transform<boost::reference_wrapper<T> >
+{
+ typedef std::string result_type;
+
+ template <typename Terminal, typename Context>
+ std::string operator()(Terminal const & terminal, Context) const
+ {
+ std::stringstream ss;
+ ss << "ref(" << terminal << ")";
+ return ss.str();
+ }
+
+
+ template <int N, typename Context>
+ std::string operator()(boost::reference_wrapper<char const *> terminal, Context) const
+ {
+ std::stringstream ss;
+ ss << "ref(\"" << terminal << "\")";
+ return ss.str();
+ }
+
+ template <int N, typename Context>
+ std::string operator()(boost::reference_wrapper<char const [N]> terminal, Context) const
+ {
+ std::stringstream ss;
+ ss << "ref(\"" << terminal << "\")";
+ return ss.str();
+ }
+};
+
+template <>
+struct identity_transform<phoenix::rule::argument>
+{
+ typedef std::string result_type;
+
+ template <typename N, typename Context>
+ std::string operator()(N, Context) const
+ {
+ std::stringstream ss;
+ ss << "_" << N::value;
+ return ss.str();
+ }
+};
+
+
+template <typename Expr>
+void identity(Expr const & expr)
+{
+ std::cout << phoenix::eval(expr, phoenix::context(int(), identity_actions())) << "\n";
+}
+
+int main()
+{
+
+ identity(phoenix::val(8));
+ identity(phoenix::val("8"));
+ identity(phoenix::ref("blubb"));
+ identity(phoenix::arg_names::_1);
+}
Modified: trunk/libs/phoenix/example/parallel_for.cpp
==============================================================================
--- trunk/libs/phoenix/example/parallel_for.cpp (original)
+++ trunk/libs/phoenix/example/parallel_for.cpp 2011-05-03 06:02:39 EDT (Tue, 03 May 2011)
@@ -1,8 +1,6 @@
#include <boost/phoenix.hpp>
-#include <iostream>
-
struct omp_for_eval
{
typedef void result_type;
@@ -33,7 +31,7 @@
////////////////////////////////////////////////////////////////////////////////
// Define new custom expression
BOOST_PHOENIX_DEFINE_EXPRESSION(
- (client)(omp_for)
+ (omp_for)
, (boost::phoenix::meta_grammar) // Cond
(boost::phoenix::meta_grammar) // Init
(boost::phoenix::meta_grammar) // Step
@@ -43,7 +41,7 @@
namespace boost { namespace phoenix
{
template <>
- struct default_actions::when<client::rule::omp_for>
+ struct default_actions::when< ::rule::omp_for>
: boost::phoenix::call< ::omp_for_eval>
{};
}}
@@ -55,11 +53,11 @@
: init(init), cond(cond), step(step) {}
template <typename Do>
- typename client::expression::omp_for<Init, Cond, Step, Do>::type const
+ typename expression::omp_for<Init, Cond, Step, Do>::type const
operator[](Do const& do_) const
{
return
- client::expression::
+ expression::
omp_for<Init, Cond, Step, Do>::
make(init, cond, step, do_);
}
@@ -115,14 +113,14 @@
// changing evaluation mechanism on the fly
BOOST_PHOENIX_DEFINE_EXPRESSION(
- (detail)(parallel)
+ (parallel)
, (boost::phoenix::meta_grammar)
)
namespace boost { namespace phoenix
{
template <>
- struct default_actions::when< ::detail::rule::parallel>
+ struct default_actions::when< ::rule::parallel>
: proto::call<
evaluator(
proto::_child0
@@ -137,12 +135,11 @@
}}
template <typename Expr>
-typename detail::expression::parallel<Expr>::type const
+typename expression::parallel<Expr>::type const
parallel(Expr const & expr)
{
- return detail::expression::parallel<Expr>::make(expr);
+ return expression::parallel<Expr>::make(expr);
}
-
////////////////////////////////////////////////////////////////////////////////
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk