| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 | /*==============================================================================    Copyright (c) 2001-2010 Joel de Guzman    Copyright (c) 2010 Eric Niebler    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 BOOST_PHOENIX_STATEMENT_IF_HPP#define BOOST_PHOENIX_STATEMENT_IF_HPP#include <boost/phoenix/config.hpp>#include <boost/phoenix/core/limits.hpp>#include <boost/phoenix/core/actor.hpp>#include <boost/phoenix/core/call.hpp>#include <boost/phoenix/core/expression.hpp>#include <boost/phoenix/core/meta_grammar.hpp>#include <boost/phoenix/core/is_actor.hpp>#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable: 4355) // 'this' used in base member initializer list#endifnamespace boost { namespace phoenix{    template <typename> struct if_actor;}}    BOOST_PHOENIX_DEFINE_EXPRESSION_EXT(    if_actor  , (boost)(phoenix)(if_)  , (meta_grammar) // Cond    (meta_grammar) // Then)    BOOST_PHOENIX_DEFINE_EXPRESSION(    (boost)(phoenix)(if_else_statement)  , (meta_grammar) // Cond    (meta_grammar) // Then    (meta_grammar) // Else)namespace boost { namespace phoenix{    ////////////////////////////////////////////////////////////////////////////    // If-Else statements    ////////////////////////////////////////////////////////////////////////////        // Function for evaluating lambdas like:    // if_( foo )[ bar ]    // and    // if_( foo )[ bar ].else_[ baz ]    struct if_else_eval    {        typedef void result_type;                template<typename Cond, typename Then, typename Context>        result_type        operator()(Cond const & cond, Then const & then, Context const & ctx) const        {            if(boost::phoenix::eval(cond, ctx))                boost::phoenix::eval(then, ctx);        }                template<typename Cond, typename Then, typename Else, typename Context>        result_type        operator()(              Cond const & cond            , Then const & then            , Else const & else_            , Context const & ctx        ) const        {            if(boost::phoenix::eval(cond, ctx))                boost::phoenix::eval(then, ctx);            else                boost::phoenix::eval(else_, ctx);        }    };        template <typename Dummy>    struct default_actions::when<rule::if_, Dummy>        : call<if_else_eval, Dummy>    {};        template <typename Dummy>    struct default_actions::when<rule::if_else_statement, Dummy>        : call<if_else_eval, Dummy>    {};    // Generator for .else_[ expr ] branch.    template<typename Cond, typename Then>    struct else_gen    {        else_gen(Cond const & cond_, Then const & then_)            : cond(cond_)            , then(then_) {}        template<typename Else>        typename expression::if_else_statement<Cond, Then, Else>::type const        operator[](Else const & else_) const        {            return expression::if_else_statement<Cond, Then, Else>::make(cond, then, else_);        }        Cond cond;        Then then;    };    // We subclass actor so we can provide the member else_ (which is an    // else_gen responsible for the .else_[ expr ] branch).    template<typename Expr>    struct if_actor : actor<Expr>    {        typedef actor<Expr> base_type;        if_actor(base_type const & base)            : base_type(base)            , else_(proto::child_c<0>(*this), proto::child_c<1>(*this))        {}        typedef typename proto::result_of::child_c<Expr, 0>::type cond_type;        typedef typename proto::result_of::child_c<Expr, 1>::type then_type;        else_gen<cond_type, then_type> else_;    };    template <typename Expr>    struct is_actor<if_actor<Expr> >        : mpl::true_    {};    // Generator for if( cond )[ then ] branch.    template<typename Cond>    struct if_gen    {        if_gen(Cond const & cond_)            : cond(cond_) {}        template<typename Then>        typename expression::if_<Cond, Then>::type const        operator[](Then const & then) const        {            return expression::if_<Cond, Then>::make(cond, then);        }        Cond cond;    };    template<typename Cond>    inline    if_gen<Cond> const    if_(Cond const & cond)    {        return if_gen<Cond>(cond);    } }}#ifdef BOOST_MSVC#pragma warning(pop)#endif#endif
 |