a26ce80291
[SVN r44198]
89 lines
2.6 KiB
C++
89 lines
2.6 KiB
C++
/*=============================================================================
|
|
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;
|
|
}
|