| /*============================================================================= |
| Phoenix V1.2.1 |
| Copyright (c) 2001-2003 Joel de Guzman |
| |
| Use, modification and distribution is subject to 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) |
| ==============================================================================*/ |
| #include <vector> |
| #include <algorithm> |
| #include <iostream> |
| #include <boost/spirit/include/phoenix1_operators.hpp> |
| #include <boost/spirit/include/phoenix1_primitives.hpp> |
| #include <boost/spirit/include/phoenix1_composite.hpp> |
| #include <boost/spirit/include/phoenix1_special_ops.hpp> |
| |
| using namespace std; |
| using namespace phoenix; |
| |
| ////////////////////////////////// |
| template <typename CondT, typename TrueT, typename FalseT> |
| struct if_else_composite { |
| |
| typedef if_else_composite<CondT, TrueT, FalseT> self_t; |
| |
| template <typename TupleT> |
| struct result { |
| |
| typedef typename higher_rank< |
| typename actor_result<TrueT, TupleT>::plain_type, |
| typename actor_result<FalseT, TupleT>::plain_type |
| >::type type; |
| }; |
| |
| if_else_composite( |
| CondT const& cond_, TrueT const& true__, FalseT const& false__) |
| : cond(cond_), true_(true__), false_(false__) {} |
| |
| template <typename TupleT> |
| typename actor_result<self_t, TupleT>::type |
| eval(TupleT const& args) const |
| { |
| return cond.eval(args) ? true_.eval(args) : false_.eval(args); |
| } |
| |
| CondT cond; TrueT true_; FalseT false_; // actors |
| }; |
| |
| ////////////////////////////////// |
| template <typename CondT, typename TrueT, typename FalseT> |
| inline actor<if_else_composite< |
| typename as_actor<CondT>::type, |
| typename as_actor<TrueT>::type, |
| typename as_actor<FalseT>::type> > |
| if_else_(CondT const& cond, TrueT const& true_, FalseT const& false_) |
| { |
| typedef if_else_composite< |
| typename as_actor<CondT>::type, |
| typename as_actor<TrueT>::type, |
| typename as_actor<FalseT>::type> |
| result; |
| |
| return result( |
| as_actor<CondT>::convert(cond), |
| as_actor<TrueT>::convert(true_), |
| as_actor<FalseT>::convert(false_)); |
| } |
| |
| ////////////////////////////////// |
| int |
| main() |
| { |
| int init[] = { 2, 10, 4, 5, 1, 6, 8, 3, 9, 7 }; |
| vector<int> c(init, init + 10); |
| typedef vector<int>::iterator iterator; |
| |
| // Print all contents of an stl container c and |
| // prefix " is odd" or " is even" appropriately. |
| |
| for_each(c.begin(), c.end(), |
| cout |
| << arg1 |
| << if_else_(arg1 % 2 == 1, " is odd", " is even") |
| << val('\n') |
| ); |
| |
| return 0; |
| } |