/*============================================================================= 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 #include 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& r, F f) { typedef rule 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