• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*==============================================================================
2     Copyright (c) 2010 Thomas Heller
3     Copyright (c) 2010 Eric Niebler
4 
5     Distributed under the Boost Software License, Version 1.0. (See accompanying
6     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 ==============================================================================*/
8 #ifndef BOOST_PHOENIX_CORE_ARITY_HPP
9 #define BOOST_PHOENIX_CORE_ARITY_HPP
10 
11 #include <boost/phoenix/core/limits.hpp>
12 #include <boost/is_placeholder.hpp>
13 #include <boost/mpl/max.hpp>
14 #include <boost/mpl/int.hpp>
15 #include <boost/phoenix/core/meta_grammar.hpp>
16 #include <boost/phoenix/core/terminal_fwd.hpp>
17 #include <boost/phoenix/support/vector.hpp>
18 #include <boost/proto/matches.hpp>
19 #include <boost/proto/transform/fold.hpp>
20 
21 namespace boost { namespace phoenix
22 {
23     /////////////////////////////////////////////////////////////////////////////
24     //
25     //  Calculate the arity of an expression using proto transforms
26     //
27     /////////////////////////////////////////////////////////////////////////////
28 
29     struct arity;
30 
31     namespace result_of
32     {
33         template <typename Expr>
34         struct arity
35             : mpl::int_<
36                 evaluator::impl<
37                     Expr const&
38                   , vector2<
39                         mpl::int_<0>
40                       , boost::phoenix::arity
41                     >&
42                   , proto::empty_env
43                 >::result_type::value
44             >
45         {};
46     }
47 
48     struct arity
49     {
50         template <typename Rule, typename Dummy = void>
51         struct when
52             : proto::fold<
53                 proto::_
54               , mpl::int_<0>
55               , proto::make<mpl::max<
56                     proto::_state
57                   , proto::call<
58                         evaluator(
59                             proto::_
60                           , proto::call<
61                                 functional::context(_env, _actions)
62                             >
63                         )
64                     >
65                 >()>
66             >
67         {};
68     };
69 
70     template <typename Dummy>
71     struct arity::when<rule::argument, Dummy>
72         : proto::make<is_placeholder<proto::_value>()>
73     {};
74 
75     template <typename Dummy>
76     struct arity::when<rule::custom_terminal, Dummy>
77         : proto::make<mpl::int_<0>()>
78     {};
79 
80     template <typename Dummy>
81     struct arity::when<rule::terminal, Dummy>
82         : proto::make<mpl::int_<0>()>
83     {};
84 }}
85 
86 #endif
87