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

📄 meta_grammar.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
/*=============================================================================    Copyright (c) 2001-2007 Joel de Guzman    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_META_GRAMMAR_FEB_05_2007_0951AM)#define BOOST_SPIRIT_META_GRAMMAR_FEB_05_2007_0951AM#include <boost/spirit/home/qi/domain.hpp>#include <boost/spirit/home/support/placeholders.hpp>#include <boost/spirit/home/support/meta_grammar.hpp>#include <boost/spirit/home/qi/numeric/real_policies.hpp>#include <boost/utility/enable_if.hpp>namespace boost { namespace spirit{    namespace qi    {        template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits>        struct int_tag;        template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits>        struct uint_tag;        template <typename T, typename RealPolicies>        struct real_tag;    }    template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits>    struct is_int_tag<qi::int_tag<T, Radix, MinDigits, MaxDigits>, qi::domain>       : mpl::true_ {};    template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits>    struct is_int_tag<qi::uint_tag<T, Radix, MinDigits, MaxDigits>, qi::domain>       : mpl::true_ {};    template <typename T, typename RealPolicies>    struct is_real_tag<qi::real_tag<T, RealPolicies>, qi::domain>       : mpl::true_ {};}}namespace boost { namespace spirit { namespace qi{    ///////////////////////////////////////////////////////////////////////////    // forwards    ///////////////////////////////////////////////////////////////////////////    template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits>    struct int_parser;    template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits>    struct uint_parser;    template <typename T, typename RealPolicies>    struct real_parser;    template <typename Expr, typename Enable>    struct is_valid_expr;    template <typename Expr, typename Enable>    struct expr_transform;    ///////////////////////////////////////////////////////////////////////////    // numeric tags    ///////////////////////////////////////////////////////////////////////////    template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits>    struct int_tag    {    };    template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits>    struct uint_tag    {    };    template <typename T, typename RealPolicies>    struct real_tag    {        RealPolicies policies;    };    ///////////////////////////////////////////////////////////////////////////    // numeric specs    ///////////////////////////////////////////////////////////////////////////    template <        typename T = int      , unsigned Radix = 10      , unsigned MinDigits = 1      , int MaxDigits = -1    >    struct int_spec      : proto::terminal<            int_tag<T, Radix, MinDigits, MaxDigits>        >::type    {    };    template <        typename T = int      , unsigned Radix = 10      , unsigned MinDigits = 1      , int MaxDigits = -1    >    struct uint_spec      : proto::terminal<            uint_tag<T, Radix, MinDigits, MaxDigits>        >::type    {    };    ///////////////////////////////////////////////////////////////////////////    template <        typename T = double,        typename RealPolicies = real_policies<T>    >    struct real_spec      : proto::terminal<            real_tag<T, RealPolicies>        >::type    {    private:        typedef typename             proto::terminal<real_tag<T, RealPolicies> >::type        base_type;        base_type make_tag(RealPolicies const& p) const        {            base_type xpr = {{p}};            return xpr;        }    public:        real_spec(RealPolicies const& p = RealPolicies())          : base_type(make_tag(p))        {}    };    ///////////////////////////////////////////////////////////////////////////    namespace detail    {        template <typename RealPolicies>        struct real_policy        {            template <typename Tag>            static RealPolicies get(Tag) { return RealPolicies(); }            template <typename T>            static RealPolicies const& get(real_tag<T, RealPolicies> const& p)             { return p.policies; }        };    }        ///////////////////////////////////////////////////////////////////////////    // get the director of an int tag    ///////////////////////////////////////////////////////////////////////////    template <typename T>    struct extract_int_director;    template <>    struct extract_int_director<tag::bin>    {        typedef uint_parser<unsigned, 2, 1, -1> type;    };    template <>    struct extract_int_director<tag::oct>    {        typedef uint_parser<unsigned, 8, 1, -1> type;    };    template <>    struct extract_int_director<tag::hex>    {        typedef uint_parser<unsigned, 16, 1, -1> type;    };    template <>    struct extract_int_director<tag::ushort>    {        typedef uint_parser<unsigned short, 10, 1, -1> type;    };    template <>    struct extract_int_director<tag::ulong>    {        typedef uint_parser<unsigned long, 10, 1, -1> type;    };    template <>    struct extract_int_director<tag::uint>    {        typedef uint_parser<unsigned int, 10, 1, -1> type;    };    template <>    struct extract_int_director<tag::short_>    {        typedef int_parser<short, 10, 1, -1> type;    };    template <>    struct extract_int_director<tag::long_>    {        typedef int_parser<long, 10, 1, -1> type;    };    template <>    struct extract_int_director<tag::int_>    {        typedef int_parser<int, 10, 1, -1> type;    };#ifdef BOOST_HAS_LONG_LONG    template <>    struct extract_int_director<tag::ulong_long>    {        typedef uint_parser<unsigned long long, 10, 1, -1> type;    };    template <>    struct extract_int_director<tag::long_long>    {        typedef int_parser<long long, 10, 1, -1> type;    };#endif    template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits>    struct extract_int_director<int_tag<T, Radix, MinDigits, MaxDigits> >    {        typedef int_parser<T, Radix, MinDigits, MaxDigits> type;    };    template <typename T, unsigned Radix, unsigned MinDigits, int MaxDigits>    struct extract_int_director<uint_tag<T, Radix, MinDigits, MaxDigits> >    {        typedef uint_parser<T, Radix, MinDigits, MaxDigits> type;    };    ///////////////////////////////////////////////////////////////////////////    // get the director of a real tag    ///////////////////////////////////////////////////////////////////////////    template <typename T>    struct extract_real_director;    template <>    struct extract_real_director<tag::float_>    {        typedef real_parser<float, real_policies<float> > type;    };    template <>    struct extract_real_director<tag::double_>    {        typedef real_parser<double, real_policies<double> > type;    };    template <>    struct extract_real_director<tag::long_double>    {        typedef real_parser<long double, real_policies<long double> > type;    };    template <typename T, typename RealPolicies>    struct extract_real_director<real_tag<T, RealPolicies> >    {        typedef real_parser<T, RealPolicies> type;    };    ///////////////////////////////////////////////////////////////////////////    // numeric parser meta-grammar    ///////////////////////////////////////////////////////////////////////////    struct int_meta_grammar      : meta_grammar::compose_empty<            proto::if_<is_int_tag<proto::_arg, qi::domain>()>          , qi::domain          , mpl::identity<extract_int_director<mpl::_> >        >    {};    struct real_meta_grammar      : meta_grammar::compose_single<            proto::if_<is_real_tag<proto::_arg, qi::domain>()>          , qi::domain          , mpl::identity<extract_real_director<mpl::_> >        >    {};    struct numeric_meta_grammar      : proto::or_<int_meta_grammar, real_meta_grammar>    {    };    ///////////////////////////////////////////////////////////////////////////    //  These specializations non-intrusively hooks into the RD meta-grammar.    //  (see qi/meta_grammar.hpp)    ///////////////////////////////////////////////////////////////////////////    template <typename Expr>    struct is_valid_expr<Expr      , typename enable_if<proto::matches<Expr, numeric_meta_grammar> >::type>      : mpl::true_    {    };    template <typename Expr>    struct expr_transform<Expr      , typename enable_if<proto::matches<Expr, numeric_meta_grammar> >::type>      : mpl::identity<numeric_meta_grammar>    {    };}}}#endif

⌨️ 快捷键说明

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