directives.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 625 行 · 第 1/2 页

HPP
625
字号
    };    struct longest_parser_gen    {        template <typename A, typename B>        struct result {            typedef typename                impl::to_longest_alternative<alternative<A, B> >::result_t            type;        };        template <typename A, typename B>        static typename        impl::to_longest_alternative<alternative<A, B> >::result_t        generate(alternative<A, B> const& alt)        {            return impl::to_longest_alternative<alternative<A, B> >::                convert(alt);        }        //'generate' for binary composite        template <typename A, typename B>        static        longest_alternative<A, B>        generate(A const &left, B const &right)        {            return longest_alternative<A, B>(left, right);        }        template <typename A, typename B>        typename impl::to_longest_alternative<alternative<A, B> >::result_t        operator[](alternative<A, B> const& alt) const        {            return impl::to_longest_alternative<alternative<A, B> >::                convert(alt);        }    };    const longest_parser_gen longest_d = longest_parser_gen();    ///////////////////////////////////////////////////////////////////////////    //    //  shortest_alternative class    //    ///////////////////////////////////////////////////////////////////////////    struct shortest_parser_gen;    template <typename A, typename B>    struct shortest_alternative    :   public binary<A, B, parser<shortest_alternative<A, B> > >    {        typedef shortest_alternative<A, B>      self_t;        typedef binary_parser_category          parser_category_t;        typedef shortest_parser_gen             parser_generator_t;        typedef binary<A, B, parser<self_t> >   base_t;        shortest_alternative(A const& a, B const& b)        : base_t(a, b) {}        template <typename ScannerT>        typename parser_result<self_t, ScannerT>::type        parse(ScannerT const& scan) const        {            typedef typename parser_result<self_t, ScannerT>::type result_t;            typename ScannerT::iterator_t save = scan.first;            result_t l = this->left().parse(scan);            std::swap(scan.first, save);            result_t r = this->right().parse(scan);            if (l || r)            {                if (l.length() < r.length() && l || !r)                {                    scan.first = save;                    return l;                }                return r;            }            return scan.no_match();        }    };    struct shortest_parser_gen    {        template <typename A, typename B>        struct result {            typedef typename                impl::to_shortest_alternative<alternative<A, B> >::result_t            type;        };        template <typename A, typename B>        static typename        impl::to_shortest_alternative<alternative<A, B> >::result_t        generate(alternative<A, B> const& alt)        {            return impl::to_shortest_alternative<alternative<A, B> >::                convert(alt);        }        //'generate' for binary composite        template <typename A, typename B>        static        shortest_alternative<A, B>        generate(A const &left, B const &right)        {            return shortest_alternative<A, B>(left, right);        }        template <typename A, typename B>        typename impl::to_shortest_alternative<alternative<A, B> >::result_t        operator[](alternative<A, B> const& alt) const        {            return impl::to_shortest_alternative<alternative<A, B> >::                convert(alt);        }    };    const shortest_parser_gen shortest_d = shortest_parser_gen();    ///////////////////////////////////////////////////////////////////////////    //    //  min_bounded class    //    ///////////////////////////////////////////////////////////////////////////    template <typename BoundsT>    struct min_bounded_gen;    template <typename ParserT, typename BoundsT>    struct min_bounded    :   public unary<ParserT, parser<min_bounded<ParserT, BoundsT> > >    {        typedef min_bounded<ParserT, BoundsT>   self_t;        typedef unary_parser_category           parser_category_t;        typedef min_bounded_gen<BoundsT>        parser_generator_t;        typedef unary<ParserT, parser<self_t> > base_t;        template <typename ScannerT>        struct result        {            typedef typename parser_result<ParserT, ScannerT>::type type;        };        min_bounded(ParserT const& p, BoundsT const& min__)        : base_t(p)        , min_(min__) {}        template <typename ScannerT>        typename parser_result<self_t, ScannerT>::type        parse(ScannerT const& scan) const        {            typedef typename parser_result<self_t, ScannerT>::type result_t;            result_t hit = this->subject().parse(scan);            if (hit.has_valid_attribute() && hit.value() < min_)                return scan.no_match();            return hit;        }        BoundsT min_;    };    template <typename BoundsT>    struct min_bounded_gen    {        min_bounded_gen(BoundsT const& min__)        : min_(min__) {}        template <typename DerivedT>        min_bounded<DerivedT, BoundsT>        operator[](parser<DerivedT> const& p) const        { return min_bounded<DerivedT, BoundsT>(p.derived(), min_); }        BoundsT min_;    };    template <typename BoundsT>    inline min_bounded_gen<BoundsT>    min_limit_d(BoundsT const& min_)    { return min_bounded_gen<BoundsT>(min_); }    ///////////////////////////////////////////////////////////////////////////    //    //  max_bounded class    //    ///////////////////////////////////////////////////////////////////////////    template <typename BoundsT>    struct max_bounded_gen;    template <typename ParserT, typename BoundsT>    struct max_bounded    :   public unary<ParserT, parser<max_bounded<ParserT, BoundsT> > >    {        typedef max_bounded<ParserT, BoundsT>   self_t;        typedef unary_parser_category           parser_category_t;        typedef max_bounded_gen<BoundsT>        parser_generator_t;        typedef unary<ParserT, parser<self_t> > base_t;        template <typename ScannerT>        struct result        {            typedef typename parser_result<ParserT, ScannerT>::type type;        };        max_bounded(ParserT const& p, BoundsT const& max__)        : base_t(p)        , max_(max__) {}        template <typename ScannerT>        typename parser_result<self_t, ScannerT>::type        parse(ScannerT const& scan) const        {            typedef typename parser_result<self_t, ScannerT>::type result_t;            result_t hit = this->subject().parse(scan);            if (hit.has_valid_attribute() && hit.value() > max_)                return scan.no_match();            return hit;        }        BoundsT max_;    };    template <typename BoundsT>    struct max_bounded_gen    {        max_bounded_gen(BoundsT const& max__)        : max_(max__) {}        template <typename DerivedT>        max_bounded<DerivedT, BoundsT>        operator[](parser<DerivedT> const& p) const        { return max_bounded<DerivedT, BoundsT>(p.derived(), max_); }        BoundsT max_;    };    //////////////////////////////////    template <typename BoundsT>    inline max_bounded_gen<BoundsT>    max_limit_d(BoundsT const& max_)    { return max_bounded_gen<BoundsT>(max_); }    ///////////////////////////////////////////////////////////////////////////    //    //  bounded class    //    ///////////////////////////////////////////////////////////////////////////    template <typename BoundsT>    struct bounded_gen;    template <typename ParserT, typename BoundsT>    struct bounded    :   public unary<ParserT, parser<bounded<ParserT, BoundsT> > >    {        typedef bounded<ParserT, BoundsT>       self_t;        typedef unary_parser_category           parser_category_t;        typedef bounded_gen<BoundsT>            parser_generator_t;        typedef unary<ParserT, parser<self_t> > base_t;        template <typename ScannerT>        struct result        {            typedef typename parser_result<ParserT, ScannerT>::type type;        };        bounded(ParserT const& p, BoundsT const& min__, BoundsT const& max__)        : base_t(p)        , min_(min__)        , max_(max__) {}        template <typename ScannerT>        typename parser_result<self_t, ScannerT>::type        parse(ScannerT const& scan) const        {            typedef typename parser_result<self_t, ScannerT>::type result_t;            result_t hit = this->subject().parse(scan);            if (hit.has_valid_attribute() &&                (hit.value() < min_ || hit.value() > max_))                    return scan.no_match();            return hit;        }        BoundsT min_, max_;    };    template <typename BoundsT>    struct bounded_gen    {        bounded_gen(BoundsT const& min__, BoundsT const& max__)        : min_(min__)        , max_(max__) {}        template <typename DerivedT>        bounded<DerivedT, BoundsT>        operator[](parser<DerivedT> const& p) const        { return bounded<DerivedT, BoundsT>(p.derived(), min_, max_); }        BoundsT min_, max_;    };    template <typename BoundsT>    inline bounded_gen<BoundsT>    limit_d(BoundsT const& min_, BoundsT const& max_)    { return bounded_gen<BoundsT>(min_, max_); }}} // namespace boost::spirit#endif

⌨️ 快捷键说明

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