• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*=============================================================================
2     Copyright (c) 2001-2011 Joel de Guzman
3 
4     Distributed under the Boost Software License, Version 1.0. (See accompanying
5     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 #if !defined(BOOST_SPIRIT_SUCCESS_HANDLER_FEBRUARY_25_2011_1051AM)
8 #define BOOST_SPIRIT_SUCCESS_HANDLER_FEBRUARY_25_2011_1051AM
9 
10 #if defined(_MSC_VER)
11 #pragma once
12 #endif
13 
14 #include <boost/spirit/home/qi/nonterminal/rule.hpp>
15 #include <boost/function.hpp>
16 
17 namespace boost { namespace spirit { namespace qi
18 {
19     template <
20         typename Iterator, typename Context
21       , typename Skipper, typename F
22     >
23     struct success_handler
24     {
25         typedef function<
26             bool(Iterator& first, Iterator const& last
27               , Context& context
28               , Skipper const& skipper
29             )>
30         function_type;
31 
success_handlerboost::spirit::qi::success_handler32         success_handler(function_type subject_, F f_)
33           : subject(subject_)
34           , f(f_)
35         {
36         }
37 
operator ()boost::spirit::qi::success_handler38         bool operator()(
39             Iterator& first, Iterator const& last
40           , Context& context, Skipper const& skipper) const
41         {
42             Iterator i = first;
43             bool r = subject(i, last, context, skipper);
44             if (r)
45             {
46                 typedef
47                     fusion::vector<
48                         Iterator&
49                       , Iterator const&
50                       , Iterator const&>
51                 params;
52                 skip_over(first, last, skipper);
53                 params args(first, last, i);
54                 f(args, context);
55 
56                 first = i;
57             }
58             return r;
59         }
60 
61         function_type subject;
62         F f;
63     };
64 
65     template <
66         typename Iterator, typename T0, typename T1, typename T2
67       , typename F>
on_success(rule<Iterator,T0,T1,T2> & r,F f)68     void on_success(rule<Iterator, T0, T1, T2>& r, F f)
69     {
70         typedef rule<Iterator, T0, T1, T2> rule_type;
71 
72         typedef
73             success_handler<
74                 Iterator
75               , typename rule_type::context_type
76               , typename rule_type::skipper_type
77               , F>
78         success_handler;
79         r.f = success_handler(r.f, f);
80     }
81 }}}
82 
83 #endif
84