You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							83 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
	
	
							83 lines
						
					
					
						
							2.3 KiB
						
					
					
				| /*============================================================================= | |
|     Copyright (c) 2001-2011 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_SUCCESS_HANDLER_FEBRUARY_25_2011_1051AM) | |
| #define BOOST_SPIRIT_SUCCESS_HANDLER_FEBRUARY_25_2011_1051AM | |
|  | |
| #if defined(_MSC_VER) | |
| #pragma once | |
| #endif | |
|  | |
| #include <boost/spirit/home/qi/nonterminal/rule.hpp> | |
| #include <boost/function.hpp> | |
|  | |
| namespace boost { namespace spirit { namespace qi | |
| { | |
|     template < | |
|         typename Iterator, typename Context | |
|       , typename Skipper, typename F | |
|     > | |
|     struct success_handler | |
|     { | |
|         typedef function< | |
|             bool(Iterator& first, Iterator const& last | |
|               , Context& context | |
|               , Skipper const& skipper | |
|             )> | |
|         function_type; | |
| 
 | |
|         success_handler(function_type subject, F f) | |
|           : subject(subject) | |
|           , f(f) | |
|         { | |
|         } | |
| 
 | |
|         bool operator()( | |
|             Iterator& first, Iterator const& last | |
|           , Context& context, Skipper const& skipper) const | |
|         { | |
|             Iterator i = first; | |
|             bool r = subject(i, last, context, skipper); | |
|             if (r) | |
|             { | |
|                 typedef | |
|                     fusion::vector< | |
|                         Iterator& | |
|                       , Iterator const& | |
|                       , Iterator const&> | |
|                 params; | |
|                 skip_over(first, last, skipper); | |
|                 params args(first, last, i); | |
|                 f(args, context); | |
| 
 | |
|                 first = i; | |
|             } | |
|             return r; | |
|         } | |
| 
 | |
|         function_type subject; | |
|         F f; | |
|     }; | |
| 
 | |
|     template < | |
|         typename Iterator, typename T0, typename T1, typename T2 | |
|       , typename F> | |
|     void on_success(rule<Iterator, T0, T1, T2>& r, F f) | |
|     { | |
|         typedef rule<Iterator, T0, T1, T2> rule_type; | |
| 
 | |
|         typedef | |
|             success_handler< | |
|                 Iterator | |
|               , typename rule_type::context_type | |
|               , typename rule_type::skipper_type | |
|               , F> | |
|         success_handler; | |
|         r.f = success_handler(r.f, f); | |
|     } | |
| }}} | |
| 
 | |
| #endif
 | |
| 
 |