/*============================================================================= | |
Copyright (c) 2001-2007 Joel de Guzman | |
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 PHOENIX_STATEMENT_IF_HPP | |
#define PHOENIX_STATEMENT_IF_HPP | |
#include <boost/spirit/home/phoenix/core/composite.hpp> | |
#include <boost/spirit/home/phoenix/core/as_actor.hpp> | |
#include <boost/spirit/home/phoenix/core/compose.hpp> | |
#if defined(BOOST_MSVC) | |
# pragma warning(push) | |
# pragma warning(disable:4355) | |
#endif | |
namespace boost { namespace phoenix | |
{ | |
struct if_else_eval | |
{ | |
template <typename Env, typename Cond, typename Then, typename Else> | |
struct result | |
{ | |
typedef void type; | |
}; | |
template < | |
typename RT, typename Env | |
, typename Cond, typename Then, typename Else> | |
static void | |
eval(Env const& env, Cond& cond, Then& then, Else& else_) | |
{ | |
if (cond.eval(env)) | |
then.eval(env); | |
else | |
else_.eval(env); | |
} | |
}; | |
struct if_eval | |
{ | |
template <typename Env, typename Cond, typename Then> | |
struct result | |
{ | |
typedef void type; | |
}; | |
template <typename RT, typename Env, typename Cond, typename Then> | |
static void | |
eval(Env const& env, Cond& cond, Then& then) | |
{ | |
if (cond.eval(env)) | |
then.eval(env); | |
} | |
}; | |
template <typename Cond, typename Then> | |
struct if_composite; | |
template <typename Cond, typename Then> | |
struct else_gen | |
{ | |
else_gen(if_composite<Cond, Then> const& source) | |
: source(source) {} | |
template <typename Else> | |
actor<typename as_composite<if_else_eval, Cond, Then, Else>::type> | |
operator[](Else const& else_) const | |
{ | |
return compose<if_else_eval>( | |
fusion::at_c<0>(source) // cond | |
, fusion::at_c<1>(source) // then | |
, else_ // else | |
); | |
} | |
if_composite<Cond, Then> const& source; | |
private: | |
// silence MSVC warning C4512: assignment operator could not be generated | |
else_gen& operator= (else_gen const&); | |
}; | |
template <typename Cond, typename Then> | |
struct if_composite : composite<if_eval, fusion::vector<Cond, Then> > | |
{ | |
if_composite(Cond const& cond, Then const& then) | |
: composite<if_eval, fusion::vector<Cond, Then> >(cond, then) | |
, else_(*this) {} | |
else_gen<Cond, Then> else_; | |
private: | |
// silence MSVC warning C4512: assignment operator could not be generated | |
if_composite& operator= (if_composite const&); | |
}; | |
template <typename Cond> | |
struct if_gen | |
{ | |
if_gen(Cond const& cond) | |
: cond(cond) {} | |
template <typename Then> | |
actor<if_composite<Cond, typename as_actor<Then>::type> > | |
operator[](Then const& then) const | |
{ | |
return actor<if_composite<Cond, typename as_actor<Then>::type> >( | |
cond, as_actor<Then>::convert(then)); | |
} | |
Cond cond; | |
}; | |
template <typename Cond> | |
inline if_gen<typename as_actor<Cond>::type> | |
if_(Cond const& cond) | |
{ | |
return if_gen<typename as_actor<Cond>::type>( | |
as_actor<Cond>::convert(cond)); | |
} | |
}} | |
#if defined(BOOST_MSVC) | |
# pragma warning(pop) | |
#endif | |
#endif |