⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wrap_action.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
/*=============================================================================    Copyright (c) 2001-2008 Joel de Guzman    Copyright (c) 2001-2008 Hartmut Kaiser    http://spirit.sourceforge.net/    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)=============================================================================*/#if !defined(BOOST_SPIRIT_WRAP_ACTION_APR_19_2008_0103PM)#define BOOST_SPIRIT_WRAP_ACTION_APR_19_2008_0103PM#include <boost/spirit/home/support/detail/values.hpp>#include <boost/spirit/home/phoenix/core/actor.hpp>#include <boost/spirit/home/phoenix/core/argument.hpp>#include <boost/spirit/home/phoenix/bind.hpp>#include <boost/spirit/home/phoenix/scope.hpp>///////////////////////////////////////////////////////////////////////////////namespace boost { namespace spirit { namespace lex { namespace detail{    template <typename FunctionType, typename Attribute, typename Context>    struct wrap_action    {        // plain functions with 4 arguments and function objects are not         // touched at all        template <typename F>        static FunctionType call(F const& f)        {            return f;        }        // wrap phoenix actor, make sure first argument is a fusion sequence        struct phoenix_action        {            template <typename F, typename T1, typename T2, typename T3, typename T4>            struct result { typedef void type; };                        template <typename Eval>            void             operator()(phoenix::actor<Eval> const& f, Attribute const& attr,                 std::size_t id, bool& pass, Context& ctx) const            {                f (spirit::detail::pass_value<Attribute const>::call(attr),                     id, pass, ctx);            }        };        template <typename Eval>        static FunctionType call(phoenix::actor<Eval> const& f)        {            using phoenix::arg_names::_1;            using phoenix::arg_names::_2;            using phoenix::arg_names::_3;            using phoenix::arg_names::_4;            return phoenix::bind(phoenix_action(), phoenix::lambda[f],                 _1, _2, _3, _4);        }        // semantic actions with 3 arguments        template <typename F>        static void arg3_action(F* f, Attribute const& attr,            std::size_t id, bool& pass, Context&)        {            f(attr, id, pass);        }        template <typename A0, typename A1, typename A2>        static FunctionType call(void(*f)(A0, A1, A2))        {            void (*pf)(void(*)(A0, A1, A2), Attribute const&, std::size_t,                 bool&, Context&) = &wrap_action::arg3_action;            using phoenix::arg_names::_1;            using phoenix::arg_names::_2;            using phoenix::arg_names::_3;            return phoenix::bind(pf, f, _1, _2, _3);        }        // semantic actions with 2 arguments        template <typename F>        static void arg2_action(F* f, Attribute const& attr,            std::size_t id, bool&, Context&)        {            f(attr, id);        }        template <typename A0, typename A1>        static FunctionType call(void(*f)(A0, A1))        {            void (*pf)(void(*)(A0, A1), Attribute const&, std::size_t,                 bool&, Context&) = &wrap_action::arg2_action;            using phoenix::arg_names::_1;            using phoenix::arg_names::_2;            return phoenix::bind(pf, f, _1, _2);        }        // semantic actions with 1 argument        template <typename F>        static void arg1_action(F* f, Attribute const& attr,            std::size_t, bool&, Context&)        {            f(attr);        }        template <typename A0>        static FunctionType call(void(*f)(A0))        {            void (*pf)(void(*)(A0), Attribute const&, std::size_t,                 bool&, Context&) = &arg1_action;            using phoenix::arg_names::_1;            return phoenix::bind(pf, f, _1);        }        // semantic actions with 0 argument        template <typename F>        static void arg0_action(F* f, Attribute const&,            std::size_t, bool&, Context&)        {            f();        }        static FunctionType call(void(*f)())        {            void (*pf)(void(*)(), Attribute const&, std::size_t,                 bool&, Context&) = &arg0_action;            using phoenix::arg_names::_1;            return phoenix::bind(pf, f, _1);        }    };    // specialization allowing to skip wrapping for lexer types not supporting    // semantic actions    template <typename Attribute, typename Context>    struct wrap_action<unused_type, Attribute, Context>    {        // plain functors are not touched at all        template <typename F>        static F const& call(F const& f)        {            return f;        }    };}}}}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -