| /*============================================================================== |
| Copyright (c) 2010 Thomas Heller |
| Copyright (c) 2010 Eric Niebler |
| |
| Distributed under the Boost Software License, Version 1.0. (See accompanying |
| file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| ==============================================================================*/ |
| #ifndef BOOST_PHOENIX_CORE_ARITY_HPP |
| #define BOOST_PHOENIX_CORE_ARITY_HPP |
| |
| #include <boost/phoenix/core/limits.hpp> |
| #include <boost/is_placeholder.hpp> |
| #include <boost/mpl/max.hpp> |
| #include <boost/mpl/int.hpp> |
| #include <boost/phoenix/core/meta_grammar.hpp> |
| #include <boost/phoenix/core/terminal_fwd.hpp> |
| #include <boost/phoenix/support/vector.hpp> |
| #include <boost/proto/matches.hpp> |
| #include <boost/proto/transform/fold.hpp> |
| |
| namespace boost { namespace phoenix |
| { |
| ///////////////////////////////////////////////////////////////////////////// |
| // |
| // Calculate the arity of an expression using proto transforms |
| // |
| ///////////////////////////////////////////////////////////////////////////// |
| |
| struct arity; |
| |
| namespace result_of |
| { |
| template <typename Expr> |
| struct arity |
| : mpl::int_< |
| evaluator::impl< |
| Expr const& |
| , vector2< |
| mpl::int_<0> |
| , boost::phoenix::arity |
| >& |
| , int |
| >::result_type::value |
| > |
| {}; |
| } |
| |
| struct arity |
| { |
| template <typename Rule, typename Dummy = void> |
| struct when |
| : proto::fold< |
| proto::_ |
| , mpl::int_<0> |
| , proto::make<mpl::max< |
| proto::_state |
| , proto::call< |
| evaluator( |
| proto::_ |
| , proto::call< |
| functional::context(_env, _actions) |
| > |
| ) |
| > |
| >()> |
| > |
| {}; |
| }; |
| |
| template <typename Dummy> |
| struct arity::when<rule::argument, Dummy> |
| : proto::make<is_placeholder<proto::_value>()> |
| {}; |
| |
| template <typename Dummy> |
| struct arity::when<rule::custom_terminal, Dummy> |
| : proto::make<mpl::int_<0>()> |
| {}; |
| |
| template <typename Dummy> |
| struct arity::when<rule::terminal, Dummy> |
| : proto::make<mpl::int_<0>()> |
| {}; |
| }} |
| |
| #endif |