blob: ae265a37a156bfcbb5460f7398c34521d88cab65 [file] [log] [blame]
/*=============================================================================
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_OPERATOR_IF_ELSE_HPP
#define PHOENIX_OPERATOR_IF_ELSE_HPP
#include <boost/mpl/and.hpp>
#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_traits/is_reference.hpp>
#include <boost/type_traits/remove_reference.hpp>
#include <boost/spirit/home/phoenix/core/composite.hpp>
#include <boost/spirit/home/phoenix/core/compose.hpp>
#include <boost/spirit/home/phoenix/detail/type_deduction.hpp>
namespace boost { namespace phoenix
{
BOOST_BINARY_RESULT_OF(true ? x : y, result_of_if_else)
struct if_else_op_eval
{
template <
typename Env
, typename Cond
, typename Then
, typename Else
>
struct result
{
typedef typename Then::template result<Env>::type then_type;
typedef typename Else::template result<Env>::type else_type;
typedef typename
result_of_if_else<then_type, else_type>::type
ite_result;
// Note: c ? x : y can return an lvalue! Allow if_else_op_eval
// to return an lvalue IFF then_type and else_type are both lvalues
// with the same type.
typedef typename
mpl::if_<
mpl::and_<
is_same<then_type, else_type>
, is_reference<then_type>
>
, ite_result
, typename remove_reference<ite_result>::type
>::type
type;
};
template <
typename RT
, typename Env
, typename Cond
, typename Then
, typename Else
>
static RT
eval(Env const& env, Cond& cond, Then& then, Else& else_)
{
return cond.eval(env) ? then.eval(env) : else_.eval(env);
}
};
template <typename Cond, typename Then, typename Else>
inline actor<typename as_composite<if_else_op_eval, Cond, Then, Else>::type>
if_else(Cond const& cond, Then const& then, Else const& else_)
{
return compose<if_else_op_eval>(cond, then, else_);
}
}}
#endif