You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
86 lines
2.5 KiB
86 lines
2.5 KiB
/*============================================================================== |
|
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
|
|
|