87 lines
2.5 KiB
C++
87 lines
2.5 KiB
C++
/*==============================================================================
|
|
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
|
|
>&
|
|
, proto::empty_env
|
|
>::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
|