PageRenderTime 31ms CodeModel.GetById 19ms app.highlight 9ms RepoModel.GetById 1ms app.codeStats 0ms

/Src/Dependencies/Boost/boost/spirit/home/qi/nonterminal/success_handler.hpp

http://hadesmem.googlecode.com/
C++ Header | 83 lines | 67 code | 10 blank | 6 comment | 1 complexity | 22b44685ea5d2b1e0d14104c1773e7fe MD5 | raw file
 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
17namespace 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
32        success_handler(function_type subject, F f)
33          : subject(subject)
34          , f(f)
35        {
36        }
37
38        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>
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