/*============================================================================= 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 namespace boost { namespace spirit { BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN template struct no_skipper_iteration_policy; template struct inhibit_case_iteration_policy; template struct alternative; template struct longest_alternative; template struct shortest_alternative; namespace impl { template inline RT contiguous_parser_parse( ST const& s, ScannerT const& scan, skipper_iteration_policy 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 inline RT contiguous_parser_parse( ST const& s, ScannerT const& scan, no_skipper_iteration_policy const&) { return s.parse(scan); } template 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 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 const&) { return p.parse_main(scan); } template inline RT implicit_lexeme_parse( ParserT const& p, ScannerT const& scan, iteration_policy const&) { return p.parse_main(scan); } template 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 inline RT inhibit_case_parser_parse( ST const& s, ScannerT const& scan, inhibit_case_iteration_policy 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 struct is_alternative { // Determine at compile time (without partial specialization) // whether a given type is an instance of the alternative static T t(); template static char test_(alternative const&); // no implementation static int test_(...); // no implementation enum { r = sizeof(char) == sizeof(test_(t())) }; typedef mpl::bool_ value; }; template struct select_to_longest; template struct to_longest_alternative { typedef typename select_to_longest::result_t result_t; typedef typename select_to_longest::plain_t plain_t; typedef typename select_to_longest::choose_t choose_t; static result_t convert(T const& a); }; template struct to_longest_generic { typedef T const& result_t; typedef T plain_t; typedef mpl::false_ choose_t; }; template inline T const& to_longest_convert(T const& a, mpl::false_) { return a; } template 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 result_t; typedef result_t plain_t; typedef mpl::true_ choose_t; }; template inline typename to_longest_alternative >::result_t to_longest_convert(alternative const& alt, mpl::true_) { typedef typename to_longest_alternative< alternative >::result_t result_t; return result_t( to_longest_alternative::convert(alt.left()), to_longest_alternative::convert(alt.right())); } template inline typename to_longest_alternative::result_t to_longest_alternative::convert(T const& a) { return to_longest_convert( a, to_longest_alternative::choose_t()); } template struct select_to_longest { typedef typename mpl::if_< is_alternative // IF , to_longest_recursive // THEN , to_longest_generic // 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 struct select_to_shortest; template struct to_shortest_alternative { typedef typename select_to_shortest::result_t result_t; typedef typename select_to_shortest::plain_t plain_t; typedef typename select_to_shortest::choose_t choose_t; static result_t convert(T const& a); }; template struct to_shortest_generic { typedef T const& result_t; typedef T plain_t; typedef mpl::false_ choose_t; }; template inline T const& to_shortest_convert(T const& a, mpl::false_) { return a; } template 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 result_t; typedef result_t plain_t; typedef mpl::true_ choose_t; }; template inline typename to_shortest_alternative >::result_t to_shortest_convert(alternative const& alt, mpl::true_) { typedef typename to_shortest_alternative< alternative >::result_t result_t; return result_t( to_shortest_alternative::convert(alt.left()), to_shortest_alternative::convert(alt.right())); } template inline typename to_shortest_alternative::result_t to_shortest_alternative::convert(T const& a) { return to_shortest_convert( a, to_shortest_alternative::choose_t()); } template struct select_to_shortest { typedef typename mpl::if_< is_alternative // IF , to_shortest_recursive // THEN , to_shortest_generic // 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 struct to_longest_alternative { typedef T result_t; static result_t const& convert(T const& a) // Special (end) case { return a; } }; template struct to_longest_alternative > { typedef typename to_longest_alternative::result_t a_t; typedef typename to_longest_alternative::result_t b_t; typedef longest_alternative result_t; static result_t convert(alternative const& alt) // Recursive case { return result_t( to_longest_alternative::convert(alt.left()), to_longest_alternative::convert(alt.right())); } }; template struct to_shortest_alternative { typedef T result_t; static result_t const& convert(T const& a) // Special (end) case { return a; } }; template struct to_shortest_alternative > { typedef typename to_shortest_alternative::result_t a_t; typedef typename to_shortest_alternative::result_t b_t; typedef shortest_alternative result_t; static result_t convert(alternative const& alt) // Recursive case { return result_t( to_shortest_alternative::convert(alt.left()), to_shortest_alternative::convert(alt.right())); } }; #endif } BOOST_SPIRIT_CLASSIC_NAMESPACE_END }} // namespace boost::spirit #endif