blob: b949a536b65b60da3223a3e252100ed422a0bbb2 [file] [log] [blame]
/*=============================================================================
Copyright (c) 2005-2010 Joel de Guzman
Copyright (c) 2010 Eric Niebler
Copyright (c) 2010 Thomas Heller
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_IS_NULLARY_HPP
#define BOOST_PHOENIX_CORE_IS_NULLARY_HPP
#include <boost/phoenix/core/limits.hpp>
#include <boost/phoenix/core/environment.hpp>
#include <boost/phoenix/core/is_actor.hpp>
#include <boost/phoenix/core/meta_grammar.hpp>
#include <boost/phoenix/core/terminal_fwd.hpp>
#include <boost/phoenix/support/vector.hpp>
#include <boost/proto/transform/fold.hpp>
#include <boost/proto/transform/lazy.hpp>
namespace boost { namespace phoenix
{
namespace result_of
{
template <typename Expr, typename Enable = void>
struct is_nullary;
}
struct is_nullary
{
template <typename Rule, typename Dummy = void>
struct when
: proto::fold<
proto::_
, mpl::true_()
, mpl::and_<
proto::_state
, proto::call<evaluator(proto::_, _context)>
>()
>
{};
};
template <typename Dummy>
struct is_nullary::when<rule::argument, Dummy>
{
BOOST_PROTO_TRANSFORM(is_nullary::when<rule::argument>)
template <typename Expr, typename State, typename Data>
struct impl
{
typedef mpl::false_ result_type;
};
};
template <
typename Trait
, typename Expr
, typename State
, typename Data
, bool IsTransform = proto::is_transform<Trait>::value
>
struct is_nullary_custom_terminal_impl
{
typedef typename Trait::type result_type;
};
template <typename Transform, typename Expr, typename State, typename Data>
struct is_nullary_custom_terminal_impl<Transform, Expr, State, Data, true>
{
typedef
typename Transform::template impl<
Expr
, State
, Data
>::result_type
result_type;
};
template <typename Dummy>
struct is_nullary::when<rule::custom_terminal, Dummy>
{
BOOST_PROTO_TRANSFORM(is_nullary::when<rule::custom_terminal>)
template <typename Expr, typename State, typename Data>
struct impl
: is_nullary_custom_terminal_impl<
result_of::is_nullary<
custom_terminal<
typename proto::detail::uncvref<
typename proto::result_of::value<Expr>::type
>::type
>
>
, typename proto::result_of::value<Expr>::type
, State
, Data
>
{};
};
template <typename Dummy>
struct is_nullary::when<rule::terminal, Dummy>
{
BOOST_PROTO_TRANSFORM(is_nullary::when<rule::terminal>)
template <typename Expr, typename State, typename Data>
struct impl
{
typedef mpl::true_ result_type;
};
};
namespace result_of
{
template <typename Expr, typename Enable>
struct is_nullary
: boost::phoenix::evaluator::impl<
Expr const &
, vector2<
mpl::true_
, boost::phoenix::is_nullary
>
, int
>::result_type
{};
template <typename T>
struct is_nullary<T & >
: is_nullary<T>
{};
template <typename T>
struct is_nullary<T const & >
: is_nullary<T>
{};
template <typename T>
struct is_nullary<T const >
: is_nullary<T>
{};
template <typename T>
struct is_nullary<custom_terminal<T> >
: mpl::true_
{};
template <typename T>
struct is_nullary<custom_terminal<actor<T> > >
: evaluator
{};
template <typename T>
struct is_nullary<custom_terminal<boost::reference_wrapper<actor<T> > > >
{
BOOST_PROTO_TRANSFORM(is_nullary<custom_terminal<boost::reference_wrapper<actor<T> > > >)
template <typename Expr, typename State, typename Data>
struct impl
{
typedef typename evaluator::template impl<actor<T>, State, Data>::result_type result_type;
};
};
template <typename T>
struct is_nullary<custom_terminal<boost::reference_wrapper<actor<T> const> > >
{
BOOST_PROTO_TRANSFORM(is_nullary<custom_terminal<boost::reference_wrapper<actor<T> const> > >)
template <typename Expr, typename State, typename Data>
struct impl
{
typedef typename evaluator::template impl<actor<T> const, State, Data>::result_type result_type;
};
};
}
}}
#endif