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

📄 rule.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
//  Copyright (c) 2001-2007 Joel de Guzman//  Copyright (c) 2001-2008 Hartmut Kaiser////  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_KARMA_RULE_MAR_05_2007_0455PM)#define BOOST_SPIRIT_KARMA_RULE_MAR_05_2007_0455PM#if defined(_MSC_VER) && (_MSC_VER >= 1020)#pragma once      // MS compatible compilers support #pragma once#endif#include <boost/spirit/home/support/unused.hpp>#include <boost/spirit/home/karma/nonterminal/nonterminal.hpp>#include <boost/spirit/home/karma/nonterminal/grammar_fwd.hpp>#include <boost/spirit/home/karma/nonterminal/detail/rule.hpp>#include <boost/spirit/home/karma/domain.hpp>#include <boost/spirit/home/karma/detail/output_iterator.hpp>#include <boost/mpl/if.hpp>#include <boost/mpl/assert.hpp>#if defined(BOOST_MSVC)# pragma warning(push)# pragma warning(disable: 4355) // 'this' : used in base member initializer list warning#endifnamespace boost { namespace spirit { namespace karma{    template <typename OutputIterator, typename T0 = unused_type,        typename T1 = unused_type, typename T2 = unused_type>    struct rule      : make_nonterminal<rule<OutputIterator, T0, T1, T2>, T0, T1, T2>::type    {        typedef            make_nonterminal<rule<OutputIterator, T0, T1, T2>, T0, T1, T2>        make_nonterminal_;        typedef typename make_nonterminal_::delimiter_type delimiter_type;        typedef typename make_nonterminal_::type base_type;        typedef detail::output_iterator<OutputIterator> iterator_type;        typedef rule<OutputIterator, T0, T1, T2> self_type;        typedef            detail::virtual_component_base<                iterator_type,                typename base_type::context_type,                delimiter_type            >        virtual_component;        typedef intrusive_ptr<virtual_component> pointer_type;        rule() {}        ~rule() {}        rule(rule const& rhs)          : ptr(rhs.ptr)        {        }        rule& operator=(rule const& rhs)        {            ptr = rhs.ptr;            return *this;        }        template <typename Expr>        rule& operator=(Expr const& xpr)        {            typedef                spirit::traits::is_component<karma::domain, Expr>            is_component;            // report invalid expression error as early as possible//             BOOST_MPL_ASSERT_MSG(//                 is_component::value,//                 xpr_is_not_convertible_to_a_generator, ());            // temp workaround for mpl problem            BOOST_STATIC_ASSERT(is_component::value);            define(xpr, mpl::false_());            return *this;        }        template <typename Expr>        friend rule& operator%=(rule& r, Expr const& xpr)        {            typedef                spirit::traits::is_component<karma::domain, Expr>            is_component;            // report invalid expression error as early as possible//             BOOST_MPL_ASSERT_MSG(//                 is_component::value,//                 xpr_is_not_convertible_to_a_generator, ());            // temp workaround for mpl problem            BOOST_STATIC_ASSERT(is_component::value);            r.define(xpr, mpl::true_());            return r;        }        self_type alias() const        {            self_type result;            result.define(*this, mpl::false_());            return result;        }        typename            make_nonterminal_holder<                nonterminal_object<self_type>              , self_type            >::type        copy() const        {            typename                make_nonterminal_holder<                    nonterminal_object<self_type>                  , self_type                >::type            result = {{*this}};            return result;        }        std::string name() const        {            return name_;        }        void name(std::string const& str)        {            name_ = str;        }    private:        template <typename Iterator_, typename T0_, typename T1_, typename T2_>        friend struct grammar;        template <typename Expr, typename Auto>        void define(Expr const& xpr, Auto)        {            typedef typename                result_of::as_component<karma::domain, Expr>::type            component;            typedef                detail::virtual_component<                    iterator_type,                    component,                    typename base_type::context_type,                    delimiter_type,                    Auto                >            virtual_component;            ptr = new virtual_component(spirit::as_component(karma::domain(), xpr));        }        template <typename OutputIterator_, typename Context, typename Delimiter>        bool generate(            OutputIterator_& sink, Context& context, Delimiter const& delim) const        {            // If the following line produces a compilation error stating the            // 3rd parameter is not convertible to the expected type, then you            // are probably trying to use this rule instance with a delimiter             // which is not compatible with the delimiter type used while             // defining the type of this rule instance.            return ptr->generate(sink, context, delim);        }        std::string what() const        {            if (name_.empty())            {                if (ptr)                {                    return "unnamed-rule";                }                else                {                    return "empty-rule";                }            }            else            {                return name_;            }        }        friend struct nonterminal_director;        pointer_type ptr;        std::string name_;    };}}}#if defined(BOOST_MSVC)# pragma warning(pop)#endif#endif

⌨️ 快捷键说明

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