~ubuntu-branches/debian/sid/boost1.49/sid

« back to all changes in this revision

Viewing changes to boost/xpressive/detail/static/transforms/as_modifier.hpp

  • Committer: Package Import Robot
  • Author(s): Steve M. Robbins
  • Date: 2012-02-26 00:31:44 UTC
  • Revision ID: package-import@ubuntu.com-20120226003144-eaytp12cbf6ubpms
Tags: upstream-1.49.0
ImportĀ upstreamĀ versionĀ 1.49.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
///////////////////////////////////////////////////////////////////////////////
 
2
// as_modifier.hpp
 
3
//
 
4
//  Copyright 2008 Eric Niebler. Distributed under the Boost
 
5
//  Software License, Version 1.0. (See accompanying file
 
6
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
7
 
 
8
#ifndef BOOST_XPRESSIVE_DETAIL_STATIC_TRANSFORMS_AS_MODIFIER_HPP_EAN_04_05_2007
 
9
#define BOOST_XPRESSIVE_DETAIL_STATIC_TRANSFORMS_AS_MODIFIER_HPP_EAN_04_05_2007
 
10
 
 
11
// MS compatible compilers support #pragma once
 
12
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 
13
# pragma once
 
14
#endif
 
15
 
 
16
#include <boost/mpl/sizeof.hpp>
 
17
#include <boost/xpressive/detail/detail_fwd.hpp>
 
18
#include <boost/xpressive/detail/static/static.hpp>
 
19
#include <boost/proto/core.hpp>
 
20
 
 
21
#define UNCV(x) typename remove_const<x>::type
 
22
#define UNREF(x) typename remove_reference<x>::type
 
23
#define UNCVREF(x) UNCV(UNREF(x))
 
24
 
 
25
namespace boost { namespace xpressive { namespace detail
 
26
{
 
27
    ///////////////////////////////////////////////////////////////////////////////
 
28
    // regex operator tags
 
29
    struct modifier_tag
 
30
    {};
 
31
 
 
32
}}}
 
33
 
 
34
namespace boost { namespace xpressive { namespace grammar_detail
 
35
{
 
36
 
 
37
    ///////////////////////////////////////////////////////////////////////////////
 
38
    // as_modifier
 
39
    template<typename Grammar, typename Callable = proto::callable>
 
40
    struct as_modifier : proto::transform<as_modifier<Grammar, Callable> >
 
41
    {
 
42
        template<typename Expr, typename State, typename Data>
 
43
        struct impl : proto::transform_impl<Expr, State, Data>
 
44
        {
 
45
            typedef
 
46
                typename proto::result_of::value<
 
47
                    typename proto::result_of::left<typename impl::expr>::type
 
48
                >::type
 
49
            modifier_type;
 
50
 
 
51
            typedef
 
52
                typename modifier_type::template apply<typename impl::data>::type
 
53
            visitor_type;
 
54
 
 
55
            typedef
 
56
                typename proto::result_of::right<Expr>::type
 
57
            expr_type;
 
58
 
 
59
            typedef
 
60
                typename Grammar::template impl<expr_type, State, visitor_type &>::result_type
 
61
            result_type;
 
62
 
 
63
            result_type operator ()(
 
64
                typename impl::expr_param expr
 
65
              , typename impl::state_param state
 
66
              , typename impl::data_param data
 
67
            ) const
 
68
            {
 
69
                visitor_type new_visitor(proto::value(proto::left(expr)).call(data));
 
70
                return typename Grammar::template impl<expr_type, State, visitor_type &>()(
 
71
                    proto::right(expr)
 
72
                  , state
 
73
                  , new_visitor
 
74
                );
 
75
            }
 
76
        };
 
77
    };
 
78
 
 
79
}}}
 
80
 
 
81
#undef UNCV
 
82
#undef UNREF
 
83
#undef UNCVREF
 
84
 
 
85
#endif