directives.ipp
来自「CGAL is a collaborative effort of severa」· IPP 代码 · 共 371 行
IPP
371 行
/*============================================================================= Copyright (c) 1998-2003 Joel de Guzman Copyright (c) 2001 Daniel Nuffer Copyright (c) 2001 Bruce Florman Copyright (c) 2002 Raghavendra Satish 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)=============================================================================*/#if !defined(BOOST_SPIRIT_DIRECTIVES_IPP)#define BOOST_SPIRIT_DIRECTIVES_IPP///////////////////////////////////////////////////////////////////////////////#include <boost/spirit/core/scanner/skipper.hpp>namespace boost { namespace spirit { template <typename BaseT> struct no_skipper_iteration_policy; template <typename BaseT> struct inhibit_case_iteration_policy; template <typename A, typename B> struct alternative; template <typename A, typename B> struct longest_alternative; template <typename A, typename B> struct shortest_alternative; namespace impl { template <typename RT, typename ST, typename ScannerT, typename BaseT> inline RT contiguous_parser_parse( ST const& s, ScannerT const& scan, skipper_iteration_policy<BaseT> const&) { typedef scanner_policies< no_skipper_iteration_policy< BOOST_DEDUCED_TYPENAME ScannerT::iteration_policy_t>, BOOST_DEDUCED_TYPENAME ScannerT::match_policy_t, BOOST_DEDUCED_TYPENAME ScannerT::action_policy_t > policies_t; scan.skip(scan); RT hit = s.parse(scan.change_policies(policies_t(scan))); // We will not do a post skip!!! return hit; } template <typename RT, typename ST, typename ScannerT, typename BaseT> inline RT contiguous_parser_parse( ST const& s, ScannerT const& scan, no_skipper_iteration_policy<BaseT> const&) { return s.parse(scan); } template <typename RT, typename ST, typename ScannerT> inline RT contiguous_parser_parse( ST const& s, ScannerT const& scan, iteration_policy const&) { return s.parse(scan); } template < typename RT, typename ParserT, typename ScannerT, typename BaseT> inline RT implicit_lexeme_parse( ParserT const& p, ScannerT const& scan, skipper_iteration_policy<BaseT> const&) { typedef scanner_policies< no_skipper_iteration_policy< BOOST_DEDUCED_TYPENAME ScannerT::iteration_policy_t>, BOOST_DEDUCED_TYPENAME ScannerT::match_policy_t, BOOST_DEDUCED_TYPENAME ScannerT::action_policy_t > policies_t; scan.skip(scan); RT hit = p.parse_main(scan.change_policies(policies_t(scan))); // We will not do a post skip!!! return hit; } template < typename RT, typename ParserT, typename ScannerT, typename BaseT> inline RT implicit_lexeme_parse( ParserT const& p, ScannerT const& scan, no_skipper_iteration_policy<BaseT> const&) { return p.parse_main(scan); } template <typename RT, typename ParserT, typename ScannerT> inline RT implicit_lexeme_parse( ParserT const& p, ScannerT const& scan, iteration_policy const&) { return p.parse_main(scan); } template <typename RT, typename ST, typename ScannerT> inline RT inhibit_case_parser_parse( ST const& s, ScannerT const& scan, iteration_policy const&) { typedef scanner_policies< inhibit_case_iteration_policy< BOOST_DEDUCED_TYPENAME ScannerT::iteration_policy_t>, BOOST_DEDUCED_TYPENAME ScannerT::match_policy_t, BOOST_DEDUCED_TYPENAME ScannerT::action_policy_t > policies_t; return s.parse(scan.change_policies(policies_t(scan))); } template <typename RT, typename ST, typename ScannerT, typename BaseT> inline RT inhibit_case_parser_parse( ST const& s, ScannerT const& scan, inhibit_case_iteration_policy<BaseT> const&) { return s.parse(scan); }#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) /////////////////////////////////////////////////////////////////////// // // from spirit 1.1 (copyright (c) 2001 Bruce Florman) // various workarounds to support longest and shortest directives // /////////////////////////////////////////////////////////////////////// template <typename T> struct is_alternative { // Determine at compile time (without partial specialization) // whether a given type is an instance of the alternative<A,B> static T t(); template <typename A, typename B> static char test_(alternative<A, B> const&); // no implementation static int test_(...); // no implementation enum { r = sizeof(char) == sizeof(test_(t())) }; typedef mpl::bool_<r> value; }; template <typename T> struct select_to_longest; template <typename T> struct to_longest_alternative { typedef typename select_to_longest<T>::result_t result_t; typedef typename select_to_longest<T>::plain_t plain_t; typedef typename select_to_longest<T>::choose_t choose_t; static result_t convert(T const& a); }; template <typename T> struct to_longest_generic { typedef T const& result_t; typedef T plain_t; typedef mpl::false_ choose_t; }; template <typename T> inline T const& to_longest_convert(T const& a, mpl::false_) { return a; } template <typename T> struct to_longest_recursive { typedef typename to_longest_alternative< typename T::left_t>::plain_t a_t; typedef typename to_longest_alternative< typename T::right_t>::plain_t b_t; typedef longest_alternative<a_t, b_t> result_t; typedef result_t plain_t; typedef mpl::true_ choose_t; }; template <typename A, typename B> inline typename to_longest_alternative<alternative<A, B> >::result_t to_longest_convert(alternative<A, B> const& alt, mpl::true_) { typedef typename to_longest_alternative< alternative<A, B> >::result_t result_t; return result_t( to_longest_alternative<A>::convert(alt.left()), to_longest_alternative<B>::convert(alt.right())); } template <typename T> inline typename to_longest_alternative<T>::result_t to_longest_alternative<T>::convert(T const& a) { return to_longest_convert( a, to_longest_alternative<T>::choose_t()); } template <typename T> struct select_to_longest { typedef typename mpl::if_< is_alternative<T> // IF , to_longest_recursive<T> // THEN , to_longest_generic<T> // ELSE >::type type; typedef typename select_to_longest::type::result_t result_t; typedef typename select_to_longest::type::plain_t plain_t; typedef typename select_to_longest::type::choose_t choose_t; }; template <typename T> struct select_to_shortest; template <typename T> struct to_shortest_alternative { typedef typename select_to_shortest<T>::result_t result_t; typedef typename select_to_shortest<T>::plain_t plain_t; typedef typename select_to_shortest<T>::choose_t choose_t; static result_t convert(T const& a); }; template <typename T> struct to_shortest_generic { typedef T const& result_t; typedef T plain_t; typedef mpl::false_ choose_t; }; template <typename T> inline T const& to_shortest_convert(T const& a, mpl::false_) { return a; } template <typename T> struct to_shortest_recursive { typedef typename to_shortest_alternative< typename T::left_t>::plain_t a_t; typedef typename to_shortest_alternative< typename T::right_t>::plain_t b_t; typedef shortest_alternative<a_t, b_t> result_t; typedef result_t plain_t; typedef mpl::true_ choose_t; }; template <typename A, typename B> inline typename to_shortest_alternative<alternative<A, B> >::result_t to_shortest_convert(alternative<A, B> const& alt, mpl::true_) { typedef typename to_shortest_alternative< alternative<A, B> >::result_t result_t; return result_t( to_shortest_alternative<A>::convert(alt.left()), to_shortest_alternative<B>::convert(alt.right())); } template <typename T> inline typename to_shortest_alternative<T>::result_t to_shortest_alternative<T>::convert(T const& a) { return to_shortest_convert( a, to_shortest_alternative<T>::choose_t()); } template <typename T> struct select_to_shortest { typedef typename mpl::if_< is_alternative<T> // IF , to_shortest_recursive<T> // THEN , to_shortest_generic<T> // ELSE >::type type; typedef typename select_to_shortest::type::result_t result_t; typedef typename select_to_shortest::type::plain_t plain_t; typedef typename select_to_shortest::type::choose_t choose_t; };#else template <typename T> struct to_longest_alternative { typedef T result_t; static result_t const& convert(T const& a) // Special (end) case { return a; } }; template <typename A, typename B> struct to_longest_alternative<alternative<A, B> > { typedef typename to_longest_alternative<A>::result_t a_t; typedef typename to_longest_alternative<B>::result_t b_t; typedef longest_alternative<a_t, b_t> result_t; static result_t convert(alternative<A, B> const& alt) // Recursive case { return result_t( to_longest_alternative<A>::convert(alt.left()), to_longest_alternative<B>::convert(alt.right())); } }; template <typename T> struct to_shortest_alternative { typedef T result_t; static result_t const& convert(T const& a) // Special (end) case { return a; } }; template <typename A, typename B> struct to_shortest_alternative<alternative<A, B> > { typedef typename to_shortest_alternative<A>::result_t a_t; typedef typename to_shortest_alternative<B>::result_t b_t; typedef shortest_alternative<a_t, b_t> result_t; static result_t convert(alternative<A, B> const& alt) // Recursive case { return result_t( to_shortest_alternative<A>::convert(alt.left()), to_shortest_alternative<B>::convert(alt.right())); } };#endif }}} // namespace boost::spirit#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?