You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
130 lines
3.5 KiB
130 lines
3.5 KiB
/*============================================================================= |
|
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
|
|
|