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

📄 conditions.ipp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 IPP
字号:
/*=============================================================================    Copyright (c) 2002-2003 Martin Wille    http://spirit.sourceforge.net/    Use, modification and distribution is subject to 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_SPIRIT_CONDITIONS_IPP#define BOOST_SPIRIT_CONDITIONS_IPP///////////////////////////////////////////////////////////////////////////////#include <boost/spirit/home/classic/meta/parser_traits.hpp>#include <boost/spirit/home/classic/core/composite/epsilon.hpp>///////////////////////////////////////////////////////////////////////////////namespace boost { namespace spirit {BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN    namespace impl {/////////////////////////////////////////////////////////////////////////////////// condition evaluation/////////////////////////////////////////////////////////////////////////////////    //////////////////////////////////    // condition_parser_selector, decides which parser to use for a condition    // If the template argument is a parser then that parser is used.    // If the template argument is a functor then a condition parser using    // the functor is chosen    template <typename T> struct embed_t_accessor    {        typedef typename T::embed_t type;    };#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300    template <> struct embed_t_accessor<int>    {        typedef int type;    };#endif    template <typename ConditionT>    struct condition_parser_selector    {        typedef            typename mpl::if_<                    is_parser<ConditionT>,                    ConditionT,                    condition_parser<ConditionT>                >::type            type;        typedef typename embed_t_accessor<type>::type embed_t;    };    //////////////////////////////////    // condition_evaluator, uses a parser to check wether a condition is met    // takes a parser or a functor that can be evaluated in boolean context    // as template parameter.    // JDG 4-15-03 refactored    template <typename ConditionT>    struct condition_evaluator    {        typedef condition_parser_selector<ConditionT>       selector_t;        typedef typename selector_t::type                   selected_t;        typedef typename selector_t::embed_t                cond_embed_t;        typedef typename boost::call_traits<cond_embed_t>::param_type            param_t;        condition_evaluator(param_t s) : cond(s) {}        /////////////////////////////        // evaluate, checks wether condition is met        // returns length of a match or a negative number for no-match        template <typename ScannerT>        std::ptrdiff_t        evaluate(ScannerT const &scan) const        {            typedef typename ScannerT::iterator_t iterator_t;            typedef typename parser_result<selected_t, ScannerT>::type cres_t;            iterator_t save(scan.first);            cres_t result = cond.parse(scan);            if (!result)            // reset the position if evaluation                scan.first = save;  // fails.            return result.length();        }        cond_embed_t cond;    };///////////////////////////////////////////////////////////////////////////////    } // namespace implBOOST_SPIRIT_CLASSIC_NAMESPACE_END}} // namespace boost::spirit#endif

⌨️ 快捷键说明

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