Changeset 44651


Ignore:
Timestamp:
Apr 20, 2008, 9:11:44 PM (10 years ago)
Author:
Joel de Guzman
Message:

problem fixed with lambda[f]

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/boost/spirit/home/lex/lexer/lexertl/wrap_action.hpp

    r44625 r44651  
    1414#include <boost/spirit/home/phoenix/core/argument.hpp>
    1515#include <boost/spirit/home/phoenix/bind.hpp>
     16#include <boost/spirit/home/phoenix/scope.hpp>
    1617
    1718#include <boost/bind.hpp>
     
    3132
    3233        // wrap phoenix actor, make sure first argument is a fusion sequence
    33         template <typename Eval>
    34         static void phoenix_action(phoenix::actor<Eval> const& f,
    35             Attribute const& attr, std::size_t id, bool& pass, Context& ctx)
    36         {
    37             f(spirit::detail::pass_value<Attribute const>::call(attr), id, pass, ctx);
    38         }
    39        
    40 //         struct phoenix_action
    41 //         {
    42 //             template <typename F, typename T1, typename T2, typename T3, typename T4>
    43 //             struct result { typedef void type; };
    44 //             
    45 //             template <typename Eval>
    46 //             void
    47 //             operator()(phoenix::actor<Eval> const& f, Attribute const& attr,
    48 //                 std::size_t id, bool& pass, Context& ctx) const
    49 //             {
    50 //                 f(spirit::detail::pass_value<Attribute const>::call(attr), id, pass, ctx);
    51 //             }
    52 //         };
     34        //~ template <typename Eval>
     35        //~ static void phoenix_action(phoenix::actor<Eval> const& f,
     36            //~ Attribute const& attr, std::size_t id, bool& pass, Context& ctx)
     37        //~ {
     38            //~ f(spirit::detail::pass_value<Attribute const>::call(attr), id, pass, ctx);
     39        //~ }
     40
     41         struct phoenix_action
     42         {
     43             template <typename F, typename T1, typename T2, typename T3, typename T4>
     44             struct result { typedef void type; };
     45
     46             template <typename Eval>
     47             void
     48             operator()(phoenix::actor<Eval> const& f, Attribute const& attr,
     49                 std::size_t id, bool& pass, Context& ctx) const
     50             {
     51                 f(spirit::detail::pass_value<Attribute const>::call(attr), id, pass, ctx);
     52             }
     53         };
    5354
    5455        template <typename Eval>
    5556        static FunctionType call(phoenix::actor<Eval> const& f)
    5657        {
    57 //             using phoenix::arg_names::arg1;
    58 //             using phoenix::arg_names::arg2;
    59 //             using phoenix::arg_names::arg3;
    60 //             using phoenix::arg_names::arg4;
     58             using phoenix::arg_names::_1;
     59             using phoenix::arg_names::_2;
     60             using phoenix::arg_names::_3;
     61             using phoenix::arg_names::_4;
    6162
    62 //             void (*pf)(phoenix::actor<Eval> const&,
    63 //                 Attribute const&, std::size_t, bool&, Context&) =
    64 //                     &wrap_action::phoenix_action;
    65 //
    66 //             return phoenix::bind(pf, f, arg1, arg2, arg3, arg4);
     63             //~ void (*pf)(phoenix::actor<Eval> const&,
     64                 //~ Attribute const&, std::size_t, bool&, Context&) =
     65                     //~ &wrap_action::phoenix_action;
    6766
    68 //             return phoenix::bind(phoenix_action(), f, arg1, arg2, arg3, arg4);
    69            
    70             return boost::bind(
    71                 &wrap_action::phoenix_action<Eval>, f, _1, _2, _3, _4);
     67             //~ return phoenix::bind(pf, f, arg1, arg2, arg3, arg4);
     68
     69             return phoenix::bind(phoenix_action(), phoenix::lambda[f], _1, _2, _3, _4);
     70
     71             //~ return phoenix::bind(phoenix::lambda[f], f, _1, _2, _3, _4);
     72
     73             //~ return boost::bind(pf, f, _1, _2, _3, _4);
     74             //~ return phoenix::bind(pf, f, _1, _2, _3, _4);
     75
     76            //~ return boost::bind(
     77                //~ &wrap_action::phoenix_action<Eval>, f, _1, _2, _3, _4);
    7278        }
    7379
     
    8389        static FunctionType call(void(*f)(A0, A1, A2))
    8490        {
    85             using phoenix::arg_names::arg1;
    86             using phoenix::arg_names::arg2;
    87             using phoenix::arg_names::arg3;
     91            using phoenix::arg_names::_1;
     92            using phoenix::arg_names::_2;
     93            using phoenix::arg_names::_3;
    8894
    89             return phoenix::bind(
    90                 &wrap_action::arg3_action<void(A0, A1, A2)>, f, arg1, arg2, arg3);
     95            void (*pf)(void(*)(A0, A1, A2), Attribute const&, std::size_t, bool&, Context&) =
     96                &wrap_action::arg3_action;
     97
     98            //~ return boost::bind(pf, f, _1, _2, _3);
     99            return phoenix::bind(pf, f, _1, _2, _3);
    91100        }
    92101
     
    102111        static FunctionType call(void(*f)(A0, A1))
    103112        {
    104             using phoenix::arg_names::arg1;
    105             using phoenix::arg_names::arg2;
     113            using phoenix::arg_names::_1;
     114            using phoenix::arg_names::_2;
    106115
    107             return phoenix::bind(
    108                 &wrap_action::arg2_action<void(A0, A1)>, f, arg1, arg2);
     116            void (*pf)(void(*)(A0, A1), Attribute const&, std::size_t, bool&, Context&) =
     117                &wrap_action::arg2_action;
     118
     119            //~ return boost::bind(pf, f, _1, _2);
     120            return phoenix::bind(pf, f, _1, _2);
    109121        }
    110122
     
    120132        static FunctionType call(void(*f)(A0))
    121133        {
    122             using phoenix::arg_names::arg1;
    123             return phoenix::bind(&wrap_action::arg1_action<void(A0)>, f, arg1);
     134            void (*pf)(void(*)(A0), Attribute const&, std::size_t, bool&, Context&) =
     135                &arg1_action;
     136
     137            using phoenix::arg_names::_1;
     138            return phoenix::bind(pf, f, _1);
     139            //~ return boost::bind(pf, f, _1);
    124140        }
    125141    };
Note: See TracChangeset for help on using the changeset viewer.