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 + -
显示快捷键?