Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2011 Joel de Guzman Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #if !defined(BOOST_SPIRIT_SUCCESS_HANDLER_FEBRUARY_25_2011_1051AM) Chris@16: #define BOOST_SPIRIT_SUCCESS_HANDLER_FEBRUARY_25_2011_1051AM Chris@16: Chris@16: #if defined(_MSC_VER) Chris@16: #pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace spirit { namespace qi Chris@16: { Chris@16: template < Chris@16: typename Iterator, typename Context Chris@16: , typename Skipper, typename F Chris@16: > Chris@16: struct success_handler Chris@16: { Chris@16: typedef function< Chris@16: bool(Iterator& first, Iterator const& last Chris@16: , Context& context Chris@16: , Skipper const& skipper Chris@16: )> Chris@16: function_type; Chris@16: Chris@16: success_handler(function_type subject_, F f_) Chris@16: : subject(subject_) Chris@16: , f(f_) Chris@16: { Chris@16: } Chris@16: Chris@16: bool operator()( Chris@16: Iterator& first, Iterator const& last Chris@16: , Context& context, Skipper const& skipper) const Chris@16: { Chris@16: Iterator i = first; Chris@16: bool r = subject(i, last, context, skipper); Chris@16: if (r) Chris@16: { Chris@16: typedef Chris@16: fusion::vector< Chris@16: Iterator& Chris@16: , Iterator const& Chris@16: , Iterator const&> Chris@16: params; Chris@16: skip_over(first, last, skipper); Chris@16: params args(first, last, i); Chris@16: f(args, context); Chris@16: Chris@16: first = i; Chris@16: } Chris@16: return r; Chris@16: } Chris@16: Chris@16: function_type subject; Chris@16: F f; Chris@16: }; Chris@16: Chris@16: template < Chris@16: typename Iterator, typename T0, typename T1, typename T2 Chris@16: , typename F> Chris@16: void on_success(rule& r, F f) Chris@16: { Chris@16: typedef rule rule_type; Chris@16: Chris@16: typedef Chris@16: success_handler< Chris@16: Iterator Chris@16: , typename rule_type::context_type Chris@16: , typename rule_type::skipper_type Chris@16: , F> Chris@16: success_handler; Chris@16: r.f = success_handler(r.f, f); Chris@16: } Chris@16: }}} Chris@16: Chris@16: #endif