1 #if !defined(BOOST_PROTO_DONT_USE_PREPROCESSED_FILES)
2 
3     #include <boost/proto/transform/detail/preprocessed/default_function_impl.hpp>
4 
5 #elif !defined(BOOST_PP_IS_ITERATING)
6 
7     #define BOOST_PROTO_DEF_FUN_INVOKE_ARG(Z, M, DATA)                                              \
8         BOOST_PROTO_DEFAULT_EVAL(Z, BOOST_PP_ADD(M, 2), DATA)
9 
10     #if defined(__WAVE__) && defined(BOOST_PROTO_CREATE_PREPROCESSED_FILES)
11         #pragma wave option(preserve: 2, line: 0, output: "preprocessed/default_function_impl.hpp")
12     #endif
13 
14     ///////////////////////////////////////////////////////////////////////////////
15     /// \file default_function_impl.hpp
16     /// Contains definition of the default_function_impl, the implementation of the
17     /// _default transform for function-like nodes.
18     //
19     //  Copyright 2008 Eric Niebler. Distributed under the Boost
20     //  Software License, Version 1.0. (See accompanying file
21     //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
22 
23     #if defined(__WAVE__) && defined(BOOST_PROTO_CREATE_PREPROCESSED_FILES)
24         #pragma wave option(preserve: 1)
25     #endif
26 
27     #define BOOST_PP_ITERATION_PARAMS_1                                                             \
28         (3, (3, BOOST_PROTO_MAX_ARITY, <boost/proto/transform/detail/default_function_impl.hpp>))
29     #include BOOST_PP_ITERATE()
30 
31     #if defined(__WAVE__) && defined(BOOST_PROTO_CREATE_PREPROCESSED_FILES)
32         #pragma wave option(output: null)
33     #endif
34 
35     #undef BOOST_PROTO_DEF_FUN_INVOKE_ARG
36 
37 #else
38 
39     #define N BOOST_PP_ITERATION()
40 
41     template<typename Grammar, typename Expr, typename State, typename Data>
42     struct default_function_impl<Grammar, Expr, State, Data, N>
43       : transform_impl<Expr, State, Data>
44     {
45         BOOST_PP_REPEAT(N, BOOST_PROTO_DEFAULT_EVAL_TYPE, Expr)
46 
47         typedef
48             typename proto::detail::result_of_fixup<r0>::type
49         function_type;
50 
51         typedef
52             typename BOOST_PROTO_RESULT_OF<
53                 function_type(BOOST_PP_ENUM_SHIFTED_PARAMS(N, r))
54             >::type
55         result_type;
56 
operator ()default_function_impl57         result_type operator ()(
58             typename default_function_impl::expr_param e
59           , typename default_function_impl::state_param s
60           , typename default_function_impl::data_param d
61         ) const
62         {
63             return this->invoke(e, s, d, is_member_function_pointer<function_type>());
64         }
65 
66     private:
invokedefault_function_impl67         result_type invoke(
68             typename default_function_impl::expr_param e
69           , typename default_function_impl::state_param s
70           , typename default_function_impl::data_param d
71           , mpl::false_
72         ) const
73         {
74             return BOOST_PROTO_DEFAULT_EVAL(~, 0, e)(
75                 BOOST_PP_ENUM_SHIFTED(N, BOOST_PROTO_DEFAULT_EVAL, e)
76             );
77         }
78 
invokedefault_function_impl79         result_type invoke(
80             typename default_function_impl::expr_param e
81           , typename default_function_impl::state_param s
82           , typename default_function_impl::data_param d
83           , mpl::true_
84         ) const
85         {
86             BOOST_PROTO_USE_GET_POINTER();
87             typedef typename detail::class_member_traits<function_type>::class_type class_type;
88             return (
89                 BOOST_PROTO_GET_POINTER(class_type, (BOOST_PROTO_DEFAULT_EVAL(~, 1, e))) ->*
90                 BOOST_PROTO_DEFAULT_EVAL(~, 0, e)
91             )(BOOST_PP_ENUM(BOOST_PP_SUB(N, 2), BOOST_PROTO_DEF_FUN_INVOKE_ARG, e));
92         }
93     };
94 
95     #undef N
96 
97 #endif
98