178 lines
5.3 KiB
Plaintext
178 lines
5.3 KiB
Plaintext
/*=============================================================================
|
|
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
|
|
>
|
|
, proto::empty_env
|
|
>::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
|
|
|